Этот ответ является иллюстративным только . не на самом деле сделать это.
- Сделайте копию
/sbin/shutdown
(от имени root) в место, где пользователь PHP может получить к нему доступ.
- Установите бит SUID копии, чтобы она могла запускаться от имени пользователя root.
chmod 4755 /copy/of/shutdown
Когда PHP выполняет копию завершения работы, shutdown
будет работать с привилегиями root. Это исключает задачу cron и возможность того, что устаревший файл shutdown_now.txt заставит систему снова остановиться вскоре после включения питания.
Опять же, массовое использование бита setuid опасно 1019 *. Каждый раз, когда вы используете его, подумайте тщательно о том, что программа может сделать, если злоупотреблять. В этом случае дыра в вашем приложении может привести к удаленному останову системы злоумышленником. Но злоумышленник может сделать это независимо от того, каким методом вы разговариваете с shutdown
. Это зависит от вас, если это приемлемый риск.
Кроме того, если вы собираетесь это сделать, не запускайте PHP как анонимный системный пользователь, вам действительно нужен suexec. Просто сделайте уверенным нет способа передать что-либо произвольное команде, которую вы отправляете. Не позволяйте кому-либо получить && do_evil_deed
в конце или в начале.
A намного Более безопасный способ сделать это - использовать любой из доступных SSH-классов для PHP, подключившись как пользователь, заключенный в chroot, с правами sudo только к программе выключения. Или, в принципе, любое раз, когда PHP нужно что-то делать с ОС, представьте наименьшую поверхность, которую вы можете себе представить, чтобы сделать это, а затем попытайтесь сделать ее еще меньше.