Запустите скрипт как 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 не менее безопасен, чем любой другой метод его запуска, и, вероятно, более безопасен, чем многие домашние или другие менее проверенные способы.

Другие вопросы по тегам