Назад | Перейти на главную страницу

Запустить сценарий от имени пользователя root из apache

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