UID kann in Shell-Skripten nicht festgelegt werden

14

Kann mir jemand helfen, herauszufinden, was hier los ist? Ich habe einige Regeln für die Verfolgung der Paketanzahl festgelegt. Wenn ich das folgende Skript als root ausführe:

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

Ich erhalte die erwartete Ausgabe:

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

Ich möchte dies jedoch als Teil von Cacti ausführen, das als Apache ausgeführt wird. Jetzt kann Apache iptables nicht ausführen, weshalb ich das Skript habe. Ich habe es als SUID root eingerichtet :

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

Aber dann bekomme ich diese Ausgabe:

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.

Offensichtlich ist mein Kernel in Ordnung und die Tatsache, dass ich ihn als Nicht-Root-Kernel ausführe, bringt etwas durcheinander, aber ich verstehe nicht, warum. Ich habe die SUID mit [der Demonstration] ( http://en.wikipedia.org/wiki/Setuid#Demonstration) überprüft und bestätigt, dass sie funktioniert.

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

Mein Endziel ist es, die Ausgabe von iptables -t mangle -xnvL zu bekommen, während ich als Apache laufe, damit ich mit Cacti alles schön grafisch darstellen kann.

Tom Ritter
quelle

Antworten:

16

Sie können SUID root nicht für Shell-Skripte verwenden. Nur echte Programme können SUID-Root sein, Shell-Skripte beginnen mit "#!" und der Interpreter müsste SUID ausführen und das funktioniert aus irgendeinem Grund, den ich nicht kannte, nicht

Schau dir sudo an und installiere es! Bearbeiten Sie / etc / sudoerrs und fügen Sie eine Zeile wie die folgende hinzu:

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

Dann renn einfach

sudo /usr/local/sbin/iptables_packet_report.sh

von Ihrem Code.

Es sollte dann nicht nach dem Passwort fragen, sondern den Vorgang automatisch auswerten.

Ich bin mir ziemlich sicher, dass Ihre Fehlermeldungen auch auftreten würden, wenn Sie www-data manuell eingeben und ausführen

Christian
quelle
13

Wie Christian anzeigte, bestand mein Problem darin, dass ich versuchte, in einem Shell-Skript SUID auszuführen. Wie hier erklärt, ist das Setzen von SUID in einem Shell-Skript eine sehr schlechte Idee:

Das Ausführen eines Shell-Skripts unter UNIX umfasst zwei Schritte: Wenn der Kernel feststellt, dass ein Shell-Skript ausgeführt werden soll, wird zuerst eine SUID-Kopie des Shell-Interpreters gestartet, und der Shell-Interpreter beginnt mit der Ausführung des Shell-Skripts. Da diese beiden Operationen in zwei getrennten Schritten ausgeführt werden, können Sie den Kernel nach dem ersten Schritt unterbrechen und die Datei wechseln, die der Shell-Interpreter ausführen soll. Auf diese Weise kann ein Angreifer den Computer dazu bringen, ein beliebiges Shell-Skript seiner Wahl auszuführen

Aus diesem Grund ignorieren viele moderne Linux-Distributionen SUID-Shell-Skripte, einschließlich Gentoo, das ich verwendet habe. Ich konnte die sudoers-Datei bearbeiten und zum Laufen bringen.

Tom Ritter
quelle
Fantastische Antwort!
Dave Cheney
weiß jemand, ob dies für Solaris 10 zutrifft?
Eric Johnson
2

Ich denke, Christians Lösung ist die beste, aber wenn Sie es wirklich wollten, können Sie das Skript mit shc kompilieren und dann root auf dem kompilierten Programm setzen.

Kyle Brandt
quelle