Назад | Перейти на главную страницу

«Su _www helloworld.php» ничего не делает

В контексте более масштабных усилий я столкнулся с конкретной проблемой, которая меня сбивает с толку.

В Mac OS X 10.6.7, используя систему, предоставленную Apache и PHP, я создал простой HelloWorld.php сценарий, который, не удивительно, просто печатает Hello, World! и ничего больше.

Прекрасно работает, если я выполняю его как php helloworld.php.

Однако если я:

sudo su
su _www php helloworld.php

Он ничего не излучает; php возвращается практически сразу без признаков казни.

Где я сошел с рельсов (и, что более важно, какую диагностическую информацию я должен собирать, чтобы определить проблему)?


Никаких кубиков.

 bash-3.2$ls -alF foo.php
-rw-r--r--  1 _www  _www  37 Apr  4 21:08 foo.php
bash-3.2$ ls -dalF .
drwxr-xr-x  56 _www  _www  1904 Apr  4 21:08 ./
bash-3.2$ whoami
bbum
bash-3.2$ php foo.php
Hello, World!
 bash-3.2$ sudo sh
sh-3.2# php foo.php
Hello, World!
 sh-3.2# su _www php foo.php
sh-3.2# 

Если я скопирую foo.php в корень документов моего веб-сервера, он работает. Как это происходит в корневом каталоге моего пользователя; он отлично работает через веб-сервер, независимо от местоположения.


Четный su _www php -v ничего не изрыгает. Здесь что-то подозрительное.

Дерп. Пользователь _www просто арестован; без оболочки. При запуске из оболочки портит даже самые простые команды.

Это очень похоже на мой вопрос "Запустить cgi-script в командной строке от имени пользователя www?" (FreeBSD).

Проблема вот в чем: у пользователя _www установлена ​​оболочка /usr/bin/false. Согласно man-странице «Ложная утилита всегда завершается с ненулевым кодом выхода». su _www всегда будет терпеть неудачу, по замыслу.

Это сделано из соображений безопасности. Если кому-либо удалось успешно запустить удаленный эксплойт против _www, учетной записи, которая используется для запуска ваших веб-приложений, то он столкнется с оболочкой, которая немедленно завершится. Если бы эта оболочка оставалась чем-то вроде /bin/sh, то пользователь _www сможет запускать множество команд в командной строке, а это плохо для безопасности. Таким образом, он установлен на /usr/bin/false чтобы ограничить ущерб, причиненный любыми взломами на вашем веб-сервере. Отключать это неразумно.

Однако установка оболочки _www на /usr/bin/false также означает, что пользователь «_www» не может выполнять команды в командной строке. Даже простая команда вроде whoami не удастся:

# su _www whoami
# echo $?
1

Решение тоже использовать sudoне su. Этот простой пример показывает, что теперь я могу выполнять простые команды как пользователь _www:

# sudo -u _www id
uid=70(_www) gid=70(_www) groups=70(_www)

Вам также необходимо убедиться, что пользователь _www может читать файл. Но если вы можете выполнить этот файл с помощью веб-сервера Apache, значит, разрешения уже верны.

Первое, на что нужно обратить внимание, - это права доступа к файлу. Как правило, веб-файлы должны принадлежать пользователю Apache.

попробуйте chown _www: _www helloworld.php

затем попробуйте запустить php от имени пользователя _www.