"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.

Другие вопросы по тегам