Может ли кто-нибудь помочь мне узнать, что здесь происходит? У меня есть несколько правил для отслеживания количества пакетов. Когда я запускаю следующий сценарий от имени пользователя root:
#!/bin/bash
iptables -t mangle -xnvL
Я получаю ожидаемый результат:
//snip
233203 199929802 MARK //blah blah blah
//snip
Однако я хочу запустить это как часть cacti, которая работает как apache. Теперь apache не может запускать iptables, вот почему у меня есть сценарий. Я настроил его как SUID root:
-rwsr-sr-x 1 root root 37 May 14 23:06 iptables_packet_report.sh
Но затем я получаю такой вывод:
server # sudo -u apache ./iptables_packet_report.sh
iptables v1.4.2: can't initialize iptables table `mangle': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
Очевидно, что с моим ядром все в порядке, и тот факт, что я запускаю его без полномочий root, что-то напутал, но я не понимаю почему. Я дважды проверил SUID с помощью [демонстрации] (http://en.wikipedia.org/wiki/Setuid#Demonstration и подтвердил, что он работает.
server # sudo -u apache ./printid
Real UID = 81
Effective UID = 0
Real GID = 81
Effective GID = 0
Моя конечная цель - получить вывод iptables -t mangle -xnvL при работе как apache, чтобы я мог использовать cacti для красивого графического отображения всего этого.
Вы не можете использовать корень SUID для сценариев оболочки. Только настоящие программы могут иметь SUID root, сценарии оболочки начинаются с "#!" и интерпретатору придется запускать SUID, и это не работает по какой-то причине, о которой я не знал
Взгляните на sudo и установите его! Отредактируйте / etc / sudoerrs, добавьте такую строку:
www-data ALL=NOPASSWD: /usr/local/sbin/iptables_packet_report.sh
Тогда просто беги
sudo /usr/local/sbin/iptables_packet_report.sh
из вашего кода.
В этом случае он не должен запрашивать пароль, а автоматически оценивать процесс.
Я совершенно уверен, что ваши сообщения об ошибках также появятся, если вы вручную su в www-data и запустите его вручную
Как указал Кристиан, моя проблема заключалась в том, что я пытался использовать SUID для сценария оболочки. Как объяснено здесь установка SUID в сценарии оболочки - очень плохая идея:
выполнение сценария оболочки под UNIX включает в себя двухэтапный процесс: когда ядро определяет, что сценарий оболочки готов к запуску, оно сначала запускает SUID-копию интерпретатора оболочки, а затем интерпретатор оболочки начинает выполнение сценария оболочки. Поскольку эти две операции выполняются в два отдельных шага, вы можете прервать работу ядра после первого шага и переключить файл, который интерпретатор оболочки собирается выполнить. Таким образом злоумышленник может заставить компьютер выполнить любой сценарий оболочки по своему выбору.
Из-за этого многие современные дистрибутивы Linux игнорируют сценарии оболочки SUID, включая gentoo, который я использовал. Я смог отредактировать файл sudoers, и он заработал.
Я думаю, что решение christian лучше всего, но если вы действительно хотите, вы можете скомпилировать сценарий, используя shc а затем установите для скомпилированной программы setuid root.