Проблема с bash скриптом, запущенным из php от имени root

Я делаю php-панель, из которой вы можете установить такие приложения, как owncloud & plex на вашем сервере. Я создал несколько скриптов bash, которые устанавливают и удаляют программное обеспечение. Я протестировал их все из shell, все работает как надо. Однако когда я запускаю скрипты из php от имени root с помощью sudo на ubuntu 15.10, apt-get и dpkg не работают так, как должны.

В visudo у меня есть:

seedbox ALL = (root) NOPASSWD: /bin/appinstaller

appinstaller - это bash скрипт, который запускает bash скрипты установки/удаления приложений (например, appinstaller plex)

Пример скрипта Plex:

dpkg --configure -a
cd /tmp
wget https://downloads.plex.tv/plex-media-server/0.9.15.6.1714-7be11e1/plexmediaserver_0.9.15.6.1714-7be11e1_amd64.deb
dpkg -i plexmediaserver_0.9.15.6.1714-7be11e1_amd64.deb

Когда я запускаю appinstaller прямо из bash, все работает отлично.

Когда я запускаю appinstaller из php (подтверждено, что скрипт запущен от имени root):

exec("sudo /bin/appinstaller plex > /home/installer.log 2>&1 &");

Он работает, но я получаю ошибки apt & dpkg, когда пытаюсь установить другие приложения, например:

E: Пакет plexmediaserver должен быть переустановлен, но я не могу найти архив для него. (хотя он установлен и работает)

А также dpkg --configure -a выдает ошибку.

Plex работает нормально, но похоже, что apt не завершает процесс установки и где-то застревает, также команды, запущенные после apt-get install/dpkg не запускаются из php, но запускаются из bash. Я пытался запустить скрипт также из cron & systemctl и получил ту же проблему.

Стоит отметить, что некоторые приложения устанавливаются/удаляются без каких-либо проблем.

В чем может быть разница между запуском скрипта из php/cron/systemctl или из shell напрямую? Могу ли я эмулировать нормальную сессию bash?

0
26.02.2016, 09:36
1 ответ

Запуск PHP-скриптов от имени root - опасная практика. Веб-серверы делают все возможное, чтобы предотвратить повышение привилегий, и применяют различные меры, такие как chroot jail. Я считаю, что это может быть причиной ваших проблем.

В частности, dpkg нуждается в доступе к файлам в /var/lib/dpkg/, чтобы нормально функционировать. Вы можете проверить, есть ли у вас доступ к этому каталогу из ваших PHP скриптов, например, попытавшись перечислить файлы в нем, или прочитать из /var/lib/dpkg/status. Если вы этого не делаете (даже при запуске от имени root), значит, вы действительно находитесь в тюрьме. Конечно, вы можете просто отключить jail (как это сделать, зависит от веб-сервера), но я бы не рекомендовал этого делать. Есть причина, по которой это было сделано, и обход механизмов безопасности подвергает вас всевозможным атакам.

0
28.01.2020, 04:52

Теги

Похожие вопросы