Найбезпечніший спосіб запустити скрипт bash за допомогою PHP-FPM


1

В даний час я запускаю веб-сервер з Nginx + PHP-Fpm і кожен сайт на власному імені користувача / GID. Тоді у мене є сценарій bash, який я використовую для створення нового користувача разом з іншими необхідними продуктами. Я знаю, що можу викликати сценарій за допомогою shell_exec / suexec, але мені цікаво, який найбезпечніший спосіб викликати bash-скрипт, не загрожуючи безпеці сервера?

Спочатку я думав встановити завдання cron для запуску сценарію, але обліковий запис потрібно миттєво створити. Так що крон не працюватиме.

Також я здійснив пошук, а деякі пропонують використовувати демон php для моніторингу черги, а потім запустити сценарій, коли є робота. Не дуже впевнений у цьому (демон), оскільки я ніколи не маю цього досвіду.

Як я можу безпечно запустити сценарій?

Оновлення:
Просто для поновлення, що я вирішив перейти з комбінацією Beanstalkd + phaanstalk.

Php-скрипт відправить завдання в чергу, після чого він буде запущений демонізованим сценарієм php, яким керує окремий користувач, який має необхідні привілеї.


2
Ваша англійська мова краще, ніж деякі "рідні" мовники англійської мови також на цьому веб-сайті.
Том О'Коннор

Відповіді:


2

Щодо конкретної теми використання 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 дуже простий в налаштуванні.


Дякую за пропозиції. Думаю, я зараз підійду до методу Гірмена.
Сем В.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.