"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
к корню документов моего веб-сервера, это работает. Как это происходит в docroot моего пользователя; он работает через веб-сервер просто отлично, независимо от местоположения.
Четное su _www php -v
не может извергнуть что-либо. Здесь что-то подозрительное.
Derp. Пользователь _www просто обанкротился; нет оболочки Закручивает даже самые простые команды при попытке из оболочки.
2 ответа
Это очень похоже на мой вопрос "Запустить cgi-скрипт в командной строке от имени пользователя www?" (FreeBSD).
Вот проблема: пользователь '_www' имеет оболочку, установленную на /usr/bin/false
, Согласно справочной странице "Утилита false всегда завершается с ненулевым кодом выхода". 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.