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

14

Может ли кто-нибудь помочь мне узнать, что здесь происходит? У меня есть несколько правил, настроенных для отслеживания количества пакетов. Когда я запускаю следующий скрипт от имени root:

#!/bin/bash
iptables -t mangle -xnvL

Я получаю вывод, который я ожидаю:

//snip
233203 199929802 MARK  //blah blah blah
//snip

Тем не менее, я хочу запустить это как часть Cacti, которая работает как Apache. Теперь apache не может запустить iptables, поэтому у меня есть скрипт. Я установил это как рут SUID :

-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 для аккуратного построения графиков.

Том Риттер
источник

Ответы:

16

Вы не можете использовать SUID root для сценариев оболочки. Только реальные программы могут быть 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-данные и запустите их вручную

Кристиан
источник
13

Как указал Кристиан, моя проблема заключалась в том, что я пытался использовать SUID для сценария оболочки. Как объясняется здесь, установка SUID в сценарии оболочки - очень плохая идея:

Выполнение сценария оболочки в UNIX включает в себя двухэтапный процесс: когда ядро ​​определяет, что сценарий оболочки должен быть запущен, оно сначала запускает SUID-копию интерпретатора оболочки, затем интерпретатор оболочки начинает выполнять сценарий оболочки. Поскольку эти две операции выполняются в два отдельных шага, вы можете прервать ядро ​​после первого шага и переключить файл, который собирается выполнить интерпретатор оболочки. Таким образом, злоумышленник может заставить компьютер выполнить любой сценарий оболочки по своему выбору.

Из-за этого многие современные дистрибутивы Linux игнорируют сценарии оболочки SUID, включая gentoo, который я использовал. Я смог отредактировать файл sudoers и заставить его работать.

Том Риттер
источник
Фантастический ответ!
Дейв Чейни
Кто-нибудь знает, правда ли это для Solaris 10?
Эрик Джонсон
2

Я думаю, что решение christian лучше, но если вы действительно этого хотите, вы можете скомпилировать скрипт, используя shc, а затем setuid root в скомпилированной программе.

Кайл Брандт
источник