Я использую сервер lighttpd в Debian GNU/Linux 7.5 (wheezy) и хочу использовать php-страницу для изменения системного времени (я знаю, что могу просто изменить время страницы, но это не то, что мне нужно для этого проекта). Прямо сейчас я использую команду exec() для непосредственного ввода команд и запуска сценария оболочки. Так что либо:

exec('date --set [HH:MM:SS]')

или же

exec("sh /full/file/path/updateTime.sh") //contains command 'date --set [HH:MM:SS]'

Если я переключаю пользователя в командной строке на www-data и пытаюсь запустить команду date, я получаю ответ: «date: невозможно установить дату: операция не разрешена».

Сценарий оболочки запускается успешно, если я запускаю его как root.

Если я предоставляю второй аргумент exec() для хранения ответа, он содержит информацию о дате / времени, которую я пытаюсь установить.

Я также попытался редактировать sudoers, чтобы добавить

www-data        ALL=(ALL:ALL) ALL

под user privilege specification и includedir /etc/sudoers.d без изменений. Я также попытался создать спецификацию псевдонима Cmnd для /bin/date и добавить ее к пользователю www-data без изменений.

Я довольно неопытен со всем этим, поэтому любая помощь приветствуется.

Сайт не будет работать, но я знаю об опасностях, связанных с принятием команд оболочки от пользователей. Я проверил файл php.ini чтобы убедиться, что команда exec() не отключена. Я попытался передать право собственности на скрипт оболочки в /var/www/ data на www-data без изменений. Разрешения на данный момент установлены на 777.

2 ответа2

2

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

Запись sudoers должна быть www-data ALL=(ALL:ALL) NOPASSWD: ALL

Тогда вам нужно будет запустить sudo date --set [HH:MM:SS] вместо просто date --set [HH:MM:SS] .

www-данные никогда не должны иметь прав sudo если вы не используете их для своей собственной разработки на тестовом сервере. Это большая лазейка в безопасности.

Редактировать: взгляните на этот вопрос, который simalar sudo в php exec()

0

Вот еще один подход:

  • Создайте FIFO (именованный канал) в достаточно безопасном месте - любое место, которое не доступно для записи, должно быть в порядке. 
  • Сделайте его владельцем www-data , режим 600.  Или 200 должно работать.
  • Каждый раз, когда приложение PHP хочет изменить системное время, попросите его записать новое время в FIFO.
  • Иметь процесс-демон, работающий от имени root, читать из FIFO. Когда он читает правильно отформатированное время, настройте системные часы.

Не нужно связываться с sudo .  Худшее, что может случиться, если кто-то проникнет в вашу систему в виде www-data это то, что он может записать изменения времени в FIFO и заставить демона изменить время.  Кажется почти невозможным, что злоумышленник сможет повысить свои привилегии до root (если вы не создадите уязвимость в демоне).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .