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

Невозможно установить UID в сценариях оболочки

Может ли кто-нибудь помочь мне узнать, что здесь происходит? У меня есть несколько правил для отслеживания количества пакетов. Когда я запускаю следующий сценарий от имени пользователя 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.