2009-06-02 4 views
0

Ich habe ein Web-Projekt, für das ich einen Befehl ausführen muss, wenn eine bestimmte URL angefordert wird, aber dieser Befehl erfordert root-Berechtigungen.Was ist der geeignete Weg, um Befehle mit höherer Berechtigung über HTTP auszuführen

Das Projekt wird mit einem Python-Prozess (Django) geliefert, natürlich ist das Ausführen mit Root-Rechten keine Option.

Die Parameter des Befehls sind fest codiert, was es unmöglich macht, etwas zu injizieren, und es ist eine geschützte Anwendung, daher kann ich etwas liberaler sein, da die Benutzer vertrauenswürdig sind (hoffentlich). Aber im Idealfall würde ich es gerne sicher machen.

.

Antwort

4

Verwendung setuid-: http://en.wikipedia.org/wiki/Setuid

„setuid und setgid (kurz für Satz Benutzer-ID bei der Ausführung bzw. Gruppen-ID bei der Ausführung, beziehungsweise) sind Unix Zugriffsrechte Flags, die Benutzern ermöglichen, eine ausführbare Datei mit den Berechtigungen des laufen ausführbarer Besitzer oder Gruppe. "

... Und sei sehr, sehr vorsichtig!

+1

Yeah, schießen Sie sich nicht in den Fuß. Was ihr nach Schreien für Ausnutzung fragt ;-) – lothar

5

Rufen Sie den Befehl über sudo mit der Option NOPASSWD: auf, die Ihnen eine feinkörnige Zugriffssteuerung ermöglicht und Ihnen die Überwachung in Syslog kostenlos ermöglicht. Vermeiden Sie die Verwendung einer Shell und verwenden Sie eine exec Variante, die die Parameter direkt als Array akzeptiert.

1

Vermeiden Sie auf jeden Fall die Verwendung von Setuid und Setgid, Sie möchten den HTTP-Server mit so wenig Berechtigungen wie möglich beibehalten. Verwenden Sie für den Prozess, der Root-Berechtigungen erfordert, den http-Server, um einen ganz neuen separaten Prozess zu erstellen, und rufen Sie Sudo auf. Sie sollten jedoch nicht die HTTP-Server-UID oder GID in den Sudoers einschließen, sondern ein anderer Benutzer, der der einzige ist, der auf das Programm zugreifen kann, und dieses Programm ist das einzige, das als root ausgeführt werden kann. Der HTTP SERVER startet dann einen neuen Prozess, der die UID in den dummen Benutzer ändert und dann den Prozess mit sudo als root ausführt.

+0

Wenn ich richtig verstanden habe, ist der richtige Weg, gid/uid nicht auf dem HTTP-Server selbst zu setzen, sondern auf einer getarnten Kopie der Binärdatei, die du ausführen willst. Zum Beispiel möchte ich den Befehl "svnserve" vom Benutzer www-Daten ausführen. Ich kann die Binärdatei "svnserve" im Home-Ordner von www-data und setuid in * this * binary kopieren. Auf diese Weise ist der einzige Benutzer, der "svnserve" ohne Root-Rechte ausführen kann, www-data. Und dieser Benutzer kann keine andere ausführbare Datei ausführen, für die Root-Berechtigungen erforderlich sind. –

+0

Nicht ganz, Sie erstellen einen Benutzer namens svnserver-runner und fügen svnserver-runner der sudoers-Liste hinzu, die svnserve als root ausführen kann. Dann erstellt der http-Server einen neuen Thread, ändert die UID des Threads zu svnserver-runner, und dieser Thread führt dann svnserve mit SUDO aus, damit es als root ausgeführt wird. – daniel

Verwandte Themen