Перезапуск задания (upstart) в скрипте php - PullRequest
3 голосов
/ 25 сентября 2011

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

sudo restart job
sudo start job
sudo stop job

Как вы можете видеть, sudo - тема этих команд, поэтому мне нужно как-то запустить sudo из этого php-скрипта. Как я могу атаковать эту проблему, или есть обходной путь для этого.

в случае, если это имеет значение:

# which start
 /sbin/start
# which stop 
 /sbin/stop
# which restart
 /sbin/restart

1 Ответ

0 голосов
/ 12 ноября 2011

Я вижу несколько подходов. Конечно, вы можете добавить www-data в список sudoers, а затем либо жестко закодировать пароль www-data в ваш скрипт (не очень хорошо), либо прочитать его из файла (чуть лучше), чтобы sudo работало. Если вы пойдете по этому пути, вам, вероятно, придется вручную переопределить пароль www-data, поскольку на самом деле он не имеет пригодного для использования пароля. Любой из этих подходов не должен поощряться, потому что www-данные намеренно лишены большинства привилегий в качестве меры безопасности. Предоставление ему большого размера (например, sudo) и помещение его пароля в файл или скрипт создает значительную уязвимость безопасности.

Возможно, вы сможете предоставить очень ограниченные привилегии sudo для www-данных, которые обеспечивают необходимую вам функциональность, не открывая слишком много дыр в безопасности. Прочтите sudo и файл sudoers для получения дополнительной информации.

Лучшим подходом может быть написание сценария, который принимает аргумент start / stop / restart и вызывает соответствующую команду upstart. Хитрость заключается в том, чтобы сделать этот скрипт setuid root (chown root:root script.sh; chmod +s script.sh), чтобы он выполнялся как root вместо www-data. Дайте этому сценарию 755 разрешений, чтобы его мог изменить только root. Это ограничивает риск безопасности и при этом дает вам необходимые полномочия, но не более.

Подход setuid, вероятно, не будет работать напрямую в вашей системе (попробуйте сначала), поскольку большинство систем Unix в наши дни намеренно отключают setuid для работы, как объявлено в сценариях оболочки, поскольку риск безопасности слишком высок. Вот статья , которая объясняет обходной путь, который использует программу на C (на которой все еще работает setuid) для вызова вашего скрипта. Это немного запутанно, но это должно сработать.

Возможно, наилучшим подходом было бы использовать механизм событий upstart и заставить ваши события в веб-коде запускать события, которые upstart перехватывал и передавал в ваш файл .conf. Я только учусь выскочить сам, поэтому не могу дать вам больше подробностей, но у меня есть ощущение, что он предназначен для этого.

...