Nie można ustawić UID w skryptach powłoki

14

Czy ktoś może mi pomóc dowiedzieć się, co się tutaj dzieje? Mam kilka zasad konfigurowania śledzenia pakietów. Kiedy uruchamiam następujący skrypt jako root:

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

Otrzymuję oczekiwany wynik:

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

Chcę jednak uruchomić to jako część kaktusów, które działają jako apache. Teraz apache nie może uruchamiać iptables, dlatego mam skrypt. Ustawiłem go jako root SUID :

-rwsr-sr-x 1 root root   37 May 14 23:06 iptables_packet_report.sh

Ale potem otrzymuję ten wynik:

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.

Oczywiście moje jądro jest w porządku, a fakt, że uruchamiam go jako inny niż root, psuje coś, ale nie rozumiem dlaczego. Dokładnie sprawdziłem SUID za pomocą [demonstracji] ( http://en.wikipedia.org/wiki/Setuid#Demonstration i potwierdziłem, że działa.

server # sudo -u apache ./printid
Real UID  = 81
Effective UID = 0
Real GID  = 81
Effective GID = 0

Moim celem końcowym jest uzyskanie wyniku działania iptables -t mangle -xnvL podczas działania jako apache, dzięki czemu mogę używać kaktusów, aby ładnie to przedstawić.

Tom Ritter
źródło

Odpowiedzi:

16

Nie można używać katalogu głównego SUID do skryptów powłoki. Tylko prawdziwe programy mogą być rootami SUID, skrypty powłoki zaczynają się od „#!” a tłumacz musiałby uruchomić SUID i to nie działa z jakiegoś powodu, którego nie znałem

Spójrz na sudo i zainstaluj go! Edytuj / etc / sudoerrs, dodaj taki wiersz:

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

Więc po prostu biegnij

sudo /usr/local/sbin/iptables_packet_report.sh

z twojego kodu.

Nie powinien wtedy pytać o hasło, ale automatycznie ocenia proces.

Jestem całkiem pewien, że Twoje komunikaty o błędach pojawią się również, jeśli ręcznie uruchomisz dane www i uruchomisz je ręcznie

chrześcijanin
źródło
13

Jak wskazał Christian, moim problemem było to, że próbowałem SUID na skrypcie powłoki. Jak wyjaśniono tutaj, ustawienie SUID w skrypcie powłoki jest bardzo złym pomysłem:

wykonanie skryptu powłoki w systemie UNIX wymaga dwuetapowego procesu: kiedy jądro ustali, że skrypt powłoki ma zostać uruchomiony, najpierw uruchamia kopię SUID interpretera powłoki, a następnie interpreter powłoki rozpoczyna wykonywanie skryptu powłoki. Ponieważ te dwie operacje są wykonywane w dwóch dyskretnych krokach, możesz przerwać jądro po pierwszym kroku i przełączyć plik, który ma wykonać interpreter powłoki. W ten sposób osoba atakująca może zmusić komputer do wykonania dowolnego skryptu powłoki, który wybierze

Z tego powodu wiele współczesnych dystrybucji Linuksa ignoruje skrypty powłoki SUID, w tym gentoo, którego używałem. Byłem w stanie edytować plik sudoers i uruchomiłem go.

Tom Ritter
źródło
Fantastyczna odpowiedź!
Dave Cheney
ktoś wie, czy dotyczy to Solaris 10?
Eric Johnson,
2

Myślę, że rozwiązanie Christiana jest najlepsze, ale jeśli naprawdę tego chcesz, możesz skompilować skrypt za pomocą shc, a następnie setuid root na skompilowanym programie.

Kyle Brandt
źródło