Дата - набор запрещен для пользователя www-data

1032
Nick

Я использую сервер 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/на www-data без изменений. Разрешения на данный момент установлены на 777.

0

2 ответа на вопрос

2
mt025

Если 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 ()

Было бы более безопасно (хотя все еще слишком опасно для «реального» использования) ограничить то, что могут сделать www-данные, просто `date --set` от имени root. Я не уверен, что правильно понимаю синтаксис sudoers, но я * думаю *, что это будет "www-data ALL = (root) NOPASSWD: / bin / date --set" (а затем использовать `exec ('/ usr) / bin / suro / bin / date --set [ЧЧ: ММ: СС] ') `, хотя ваши пути могут немного отличаться). Gordon Davisson 7 лет назад 0
@GordonDavisson, зачем мне нужно, чтобы часть `/ usr / bin / sudo` добавлялась к аргументу в команде` exec () `? Это потому, что это место расположения команды sudo (Опять же, я многому учусь, потому что мне очень жаль, если это звучит как глупый вопрос)? Nick 7 лет назад 0
Кроме того, добавление «--set» в sudoers не позволяло www-данным ничего делать, но просто заканчивалось на «/ bin / date». Спасибо! Nick 7 лет назад 0
@Nick: Я не думаю, что действительно необходимо включать полный путь к `sudo` (или` date`), я просто предпочитаю включать их в случае, если скрипт запускается со странным `PATH`, который не включает соответствующие каталоги. Что касается параметра «--set», вызывающего проблемы: может быть, вам нужно указать, что разрешен другой аргумент, например «/ bin / date --set *», но если просто оставить его выключенным, я не думаю, что это значительно менее безопасно. Gordon Davisson 7 лет назад 0
@GordonDavisson, оказывается, моя ошибка заключалась в том, что в sudoers ставились кавычки вокруг "/ bin / date --set *". Я не уверен, почему я думал, что они должны быть там в первую очередь. Nick 7 лет назад 0
0
G-Man

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

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

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

Похожие вопросы