Impossibile impostare l'UID su script Shell


14

Qualcuno può aiutarmi a scoprire cosa sta succedendo qui? Ho alcune regole impostate per il conteggio dei pacchetti di tracciamento. Quando eseguo il seguente script come root:

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

Ottengo l'output che mi aspetto:

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

Tuttavia, voglio eseguirlo come parte di cactus, che funziona come apache. Ora apache non può eseguire iptables, motivo per cui ho lo script. L'ho impostato come SUID root :

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

Ma poi ottengo questo output:

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.

Ovviamente il mio kernel va bene, e il fatto che lo stia eseguendo come non root sta rovinando qualcosa, ma non capisco perché. Ho ricontrollato il SUID con [la dimostrazione] ( http://en.wikipedia.org/wiki/Setuid#Demonstration e ho confermato che funzionava.

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

Il mio obiettivo finale è quello di ottenere l'output di iptables -t mangle -xnvL mentre corro come apache in modo da poter usare i cactus per rappresentare graficamente tutto.

Risposte:


16

Non è possibile utilizzare la radice SUID per gli script di shell. Solo i programmi reali possono essere SUID root, gli script di shell iniziano con "#!" e l'interprete dovrebbe eseguire il SUID e questo non funziona per qualche motivo che non conoscevo

Dai un'occhiata a sudo e installalo! Modifica / etc / sudoerrs, aggiungi una riga come questa:

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

Quindi corri e basta

sudo /usr/local/sbin/iptables_packet_report.sh

dal tuo codice.

Non dovrebbe quindi richiedere la password, ma valutare automaticamente il processo.

Sono abbastanza sicuro che i tuoi messaggi di errore si verificherebbero anche se eseguissi manualmente su www-data ed eseguissi manualmente


13

Come ha indicato Christian, il mio problema era che stavo cercando di SUID su uno script di shell. Come spiegato qui, impostare SUID su uno script di shell è una pessima idea:

l'esecuzione di uno script di shell sotto UNIX comporta un processo in due fasi: quando il kernel determina che sta per essere eseguito uno script di shell, avvia prima una copia SUID dell'interprete di shell, quindi l'interprete di shell inizia a eseguire lo script di shell. Poiché queste due operazioni vengono eseguite in due passaggi discreti, è possibile interrompere il kernel dopo il primo passaggio e cambiare il file che l'interprete della shell sta per eseguire. In questo modo, un utente malintenzionato potrebbe far eseguire al computer qualsiasi script shell di sua scelta

Per questo motivo, molte distribuzioni Linux moderne ignorano gli script di shell SUID, incluso Gentoo che stavo usando. Sono stato in grado di modificare il file sudoers e farlo funzionare.


Risposta fantastica!
Dave Cheney,

qualcuno sa se questo è vero per Solaris 10?
Eric Johnson,

2

Penso che la soluzione di Christian sia la migliore, ma se lo volessi davvero, puoi compilare lo script usando shc e quindi impostareu root sul programma compilato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.