Невозможно установить UID для сценариев оболочки
Может ли кто-нибудь помочь мне узнать, что здесь происходит? У меня есть несколько правил для настройки количества отслеживаемых пакетов. Когда я запускаю следующий скрипт от имени 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 и подтвердил, что он работает.
server # sudo -u apache ./printid
Real UID = 81
Effective UID = 0
Real GID = 81
Effective GID = 0
Моя конечная цель - получить выходные данные iptables -t mangle -xnvL при работе в качестве apache, чтобы я мог использовать cacti для аккуратного построения графиков.
3 ответа
Вы не можете использовать 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-данные и запустите их вручную
Как указал Кристиан, моя проблема заключалась в том, что я пытался использовать SUID для сценария оболочки. Как объясняется здесь, установка SUID в сценарии оболочки - очень плохая идея:
Выполнение сценария оболочки в UNIX включает в себя двухэтапный процесс: когда ядро определяет, что сценарий оболочки должен быть запущен, оно сначала запускает копию SUID интерпретатора оболочки, затем интерпретатор оболочки начинает выполнять сценарий оболочки. Поскольку эти две операции выполняются в два отдельных шага, вы можете прервать ядро после первого шага и переключить файл, который собирается выполнить интерпретатор оболочки. Таким образом, злоумышленник может заставить компьютер выполнить любой сценарий оболочки по своему выбору.
Из-за этого многие современные дистрибутивы Linux игнорируют сценарии оболочки SUID, включая gentoo, который я использовал. Я смог отредактировать файл sudoers и заставить его работать.
Я думаю, что решение christian лучше, но если вы действительно этого хотите, вы можете скомпилировать скрипт, используя shc, а затем setuid root в скомпилированной программе.