Begrenzen Sie, welche Prozesse ein Benutzer mit Supervisor neu starten kann?

14

Ich habe Supervisor verwendet, um einen Gunicorn-Prozess zu verwalten, der eine Django-Site ausführt, obwohl diese Frage sich auf alles beziehen könnte, was vom Supervisor verwaltet wird. Bisher war ich die einzige Person, die unseren Server verwaltete und benutzte, und der Supervisor lief nur als Root und ich verwendete sudo, um ihn supervisorctl restart myappbei Bedarf auszuführen .

Jetzt muss unser Server mehrere Benutzer unterstützen, die an verschiedenen Standorten arbeiten, und jedes Projekt muss in der Lage sein, seine eigenen Gunicorn-Prozesse neu zu starten, ohne die Prozesse anderer Benutzer neu zu starten.

Ich bin diesem Blog-Beitrag gefolgt:

http://drumcoder.co.uk/blog/2010/nov/24/running-supervisorctl-non-root/

und war in der Lage, Nicht-Root-Benutzern die Verwendung von supervisorctl zu erlauben, aber jetzt kann jeder die Prozesse eines anderen neu starten. So wie es aussieht, hat der Supervisor keine Möglichkeit, die Zugriffskontrolle pro Benutzer durchzuführen.

Hat jemand eine Idee, wie man Benutzern erlaubt, nur ihre eigenen Prozesse ohne root neu zu starten?

BEARBEITEN: Einige Dinge, über die wir nachgedacht haben, sind das Schreiben eines Skripts von root mit dem suid-Bit-Satz, der nichts anderes enthält, supervisorctl restart myappund das Ablegen in das Verzeichnis des Benutzers, dessen Eigentümer es ist myapp. Das Internet scheint zu sagen, dass ein solches Skript unsicher ist, wenn es falsch gemacht wird. Wir haben auch überlegt, einen benutzerdefinierten Daemon zu schreiben, der auf Befehle von bestimmten Benutzern wartet und den Supervisor-Prozess neu startet, wenn der Benutzer die Berechtigung hat. Diese Idee erscheint zu kompliziert, wenn eine einfachere Lösung funktionieren würde.

Davidscolgan
quelle

Antworten:

33

Sie können sudoanstelle Ihres benutzerdefinierten Skripts verwenden, um dasselbe zu erreichen. Dies bedeutet, dass Sie supervisordin der Standardkonfiguration , in der nur root ausgeführt werden kann supervisorctl, einen Eintrag wie den folgenden eingeben können /etc/sudoers:

alice ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app1
bob ALL = (root) NOPASSWD:/usr/bin/supervisorctl restart app2

Dies würde es erlauben alice, sudo /usr/bin/supervisorctl restart app1als root zu laufen, ohne ein Passwort eingeben zu müssen, und es würde erlauben bob, neu zu starten app2.

larsks
quelle
Ah, ausgezeichnet. Das ist genau das, wonach ich gesucht habe. Danke für Ihre Hilfe!
Davidscolgan
1
%sudo ALL=(ALL:ALL) ALL
Beachten