Неможливо встановити UID для скриптів оболонки


14

Хтось може допомогти мені дізнатися, що тут відбувається? У мене є кілька правил, що встановлюють кількість відстеження пакетів. Коли я запускаю наступний скрипт як root:

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

Я отримую очікуваний результат:

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

Однак я хочу запустити це як частину кактусів, які працюють як апаші. Тепер 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.

Очевидно, що моє ядро ​​добре, і той факт, що я його запускаю як некореневий, щось псує, але я не розумію, чому. Я двічі перевірив 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, щоб я міг використовувати кактуси, щоб все це добре зобразити.

Відповіді:


16

Ви не можете використовувати корінь SUID для скриптів оболонки. Тільки реальні програми можуть бути коренем SUID, скрипти оболонки починаються з "#!" і перекладачеві доведеться запускати SUID, і це не працює з якихось причин, я не знав

Погляньте на судо і встановіть його! Редагувати / etc / sudoerrs, додати такий рядок:

www-data        ALL=NOPASSWD: /usr/local/sbin/iptables_packet_report.sh

Тоді просто біжи

sudo /usr/local/sbin/iptables_packet_report.sh

з вашого коду.

Тоді він не повинен запитувати пароль, а оцінювати процес автоматично.

Я впевнений, що ваші повідомлення про помилки також трапляться, якщо ви вручну входите в дані www і запускаєте їх вручну


13

Як Крістіан зазначив, моя проблема полягала в тому, що я намагався SUID на сценарії оболонки. Як пояснено тут, налаштування SUID на скрипті оболонки дуже погана ідея:

виконання сценарію оболонки під UNIX включає двоступеневий процес: коли ядро ​​визначає, що сценарій оболонки буде запущений, він спочатку запускає копію інтерпретатора оболонки SUID, потім інтерпретатор оболонки починає виконувати скрипт оболонки. Оскільки ці дві операції виконуються в два дискретні кроки, ви можете перервати ядро ​​після першого кроку і переключити файл, який збирач повинен виконати інтерпретатор оболонки. Таким чином, зловмисник може змусити комп'ютер виконати будь-який скрипт оболонки, який він обрав

Через це багато сучасних Linux-дистрибуторів ігнорують сценарії оболонки SUID, включаючи gentoo, якими я користувався. Мені вдалося відредагувати файл sudoers і налагодив його.


Фантастична відповідь!
Дейв Чейні

хтось знає, чи це правда для Solaris 10?
Ерік Джонсон

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.