В настоящее время я запускаю веб-сервер с Nginx + PHP-Fpm и каждый сайт под своим именем пользователя / GID. Затем у меня есть сценарий bash, который я использую для создания нового пользователя вместе с другими необходимыми вещами. Я знаю, что могу вызвать сценарий с помощью shell_exec / suexec, но мне интересно, какой самый безопасный способ вызвать сценарий bash, не ставя под угрозу безопасность сервера?
Сначала я думал установить задание cron для запуска скрипта, но учетная запись должна быть активирована немедленно. Так что cron работать не будет.
Также я провел некоторый поиск, и некоторые предлагают использовать демон php для мониторинга очереди, а затем запускать скрипт, когда есть задание. Не совсем уверен в этом (демон), так как у меня никогда не было опыта.
Как я могу безопасно запустить свой скрипт?
Обновить:
Просто чтобы обновить, что я решил пойти с комбинацией Beanstalkd + pheanstalk.
Сценарий PHP отправит задание в очередь, а затем он будет запущен демонизированным скриптом php, запущенным отдельным пользователем, у которого есть необходимые привилегии.
Что касается конкретной темы использования exec в php и того, как быть в безопасности, единственное, о чем вам нужно позаботиться, - это избегать аргументов.
т.е. не сделай это:
exec('myscript ' . $_POST['arg']);
если не очевидно - подумайте, что будет, если $_POST['arg']
содержит ; rm xyz
- или того хуже, если вы отправляете вывод этой команды на экран, и он содержит ; more /etc/passwd; more db-config.php
и т.п.
следовательно - избегайте своих аргументов:
$foo = escapeshellarg($whatever);
exec("myscript $foo");
Однако, если вашему сценарию bash требуется больше привилегий, чем вы обычно разрешаете иметь своему пользователю nginx - вам лучше прислушаться к найденному совету, который отделяет пользователя, запускающего ваш сценарий bash, от пользователя nginx.
Подобно вашему предложению демона php в вопросе, приложение php отправляет запрос для запуска сценария bash, синхронно или асинхронно, с использованием работа очередь система. Очередь заданий просто отправляет запрос вашему сценарию bash, при необходимости возвращая результат. Таким образом, вы можете запустить bash-скрипт «создать нового пользователя» как пользователь с соответствующими разрешениями, не давая вашему пользователю nginx никаких дополнительных привилегий и не рискуя использовать эти разрешения где-то еще, если ваш код приложения php. В частности, Gearman очень прост в настройке.