Запустите скрипт как root от apache
Я хотел бы обновить мой hosts
файл и перезапустить dnsmasq
из веб-интерфейса (php/apache2). Я пытался поиграть с битами suid (демонстрация). у меня есть оба apache
а также dnsmasq
работает на экземпляре EC2.
Я понимаю, что Linux игнорирует бит setuid в текстовых скриптах, но работает с двоичными файлами. (У меня что-то не так?). я добавил exec("whoami");
к примеру программы на C в Википедии. Хотя эффективный UID программы на C равен 0, whoami не возвращает root
:-(
Я бы очень хотел избежать
эхо пароль | sudo service dnsmasq restart
или добавление apache в sudoers без пароля! Есть ли выход? Как webmin делает такие вещи?
2 ответа
Я бы выбрал другой подход и настроил либо скрипт incron, который запускается от имени пользователя root, который отслеживает изменения в каком-либо файле и отвечает, применяя ваши изменения к файлу / etc / hosts.
При использовании подхода incron вы устанавливаете запись inotify, чтобы наблюдать за изменениями в каком-либо файле и отвечать, запуская скрипт;
/var/www/hosts IN_CLOSE_WRITE /run/this/as/root
Таким образом, у apache есть права на запись в /var/www/hosts с использованием php или чего-либо еще, а скрипт / run / this / as / root запускается с правами root, чтобы применить изменения к файлу / etc / hosts
Я склонен решать эту проблему, позволяя процессу, который запускает сервер, в данном случае веб-сервер, выполнять соответствующую команду и только эту команду через sudo без пароля.
Например, вот моя запись sudoers, позволяющая пользователю с именем NAGIOS (который запускает мой локальный сервер мониторинга) выполнить плагин, который проверяет это оборудование RAID как root:
nagios ALL=(root) NOPASSWD: /usr/lib/nagios/plugins/check_md_raid
У вас было бы что-то похожее, возможно:
apache ALL=(root) NOPASSWD: /sbin/service dnsmasq restart
Чтобы решить ваши проблемы выше, это не позволяет никому, кто может нарушить процесс Apache для запуска sudo bash
, sudo shutdown -h now
, или даже sudo service dnsmasq stop
, Это позволяет только то, что указано в файле sudoers.
Это правда, что если service
Команда плохо написана, и если кто-то может найти способ заставить работать service dnsmasq stop
с правами суперпользователя измените режим на passwd
файл или начать разрешить все sshd
на порт 22222, или действительно делать что-то гнусное, тогда у вас есть проблемы. Но в таком случае у вас есть проблема, однако вы запускаете сервисную команду от имени root, будь то с помощью sudo или любого другого механизма. sudo
делает все возможное для дезинфекции среды, а команда service является стандартной частью большинства GNU/Linux (и уже некоторое время) и поэтому, вероятно, не имеет явных пробелов.
Запуск service
команда через пароль sudo
не менее безопасен, чем любой другой метод его запуска, и, вероятно, более безопасен, чем многие домашние или другие менее проверенные способы.