Я хочу обновить свой hosts
файл и перезапустите dnsmasq
из веб-интерфейса (php / apache2). Я пробовал поиграть с suid биты (демонстрация). у меня есть оба apache
и dnsmasq
работает на экземпляре EC2.
Я понимаю, что Linux игнорирует бит setuid в текстовых сценариях, но работает с двоичными файлами. (Я что-то не так понял?). я добавил exec("whoami");
к примеру программы C в Википедии. Хотя эффективный UID программы C равен 0, whoami не возвращает root
:-(
Я бы очень хотел избежать
эхо-пароль | перезапуск службы sudo dnsmasq
или добавить apache в sudoers без пароля! Есть выход? Как Webmin делает такие вещи?
Я бы выбрал другой подход и настроил либо 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
как root через sudo измените режим на passwd
файл, или запустите разрешающий sshd
на порт 22222, или действительно делать что-нибудь гнусное, тогда у вас есть проблема. Но в таком случае у вас есть проблема, но вы запускаете служебную команду как root, будь то через sudo или любой другой механизм. sudo
делает все возможное, чтобы дезинфицировать среду, а служебная команда является стандартной частью большинства GNU / Linux (и использовалась в течение некоторого времени) и поэтому, вероятно, не имеет очевидных дыр.
Запуск service
команда без пароля sudo
не менее безопасен, чем любой другой метод его использования, и, вероятно, более безопасен, чем многие способы домашнего приготовления или другие, менее проверенные способы.