Ausführen von Upstart-Jobs als nicht privilegierte Benutzer

70527
aaronsw

Wie kann man kanonisch einen Upstart-Job dazu veranlassen, seine Benutzer-ID zu ändern und das Skript als nicht privilegierter Benutzer auszuführen?

Natürlich kann man suoder verwenden sudo, aber das scheint hackig zu sein (und kann unnötige Protokollzeilen erzeugen).

139

8 Antworten auf die Frage

108
qsun

With upstart v1.4, setuid and setgid are supported natively in config file.

Einzelheiten hierzu finden Sie im Kochbuch: http://upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user Jason Navarrete vor 11 Jahren 7
Mit anderen Worten, es wird in Precise (12.04) und neueren Versionen unterstützt. Edward Anderson vor 11 Jahren 10
Mit anderen Worten, wird in Centos 6 nicht unterstützt socketpair vor 10 Jahren 8
Beste Antwort, wenn Sie Upstart> = 1.4 haben. Sie sollten jedoch ein Lesezeichen für die "su" -Lösung setzen, da dies bei Bedarf nützlich sein kann. tiktak vor 9 Jahren 0
Für das Protokoll "initctl --version", um Ihre aktuelle Version von upstart zu finden. Mahn vor 9 Jahren 5
Verblüffenderweise verwendet die Amazon Linux-Distribution in AWS die Upstart-Version von RHEL 6 (0.6.5 !!!!), sodass jeder, der diese Option verwendet, die Lösung "su" verwenden muss. Asfand Qazi vor 8 Jahren 4
Fügen Sie Ihrem Upstart-Skript beispielsweise die folgende Zeile hinzu: `setuid www-data` J0hnG4lt vor 7 Jahren 0
85
Roman Gaufman

Auf dem #upstart-Kanal von freenode wird die offizielle Frage gestellt:

Eine zukünftige Version von Upstart wird dafür native Unterstützung bieten, aber für den Moment können Sie Folgendes verwenden:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...] 
Dies ist die einzige Antwort, die auf Amazon Linue EC2 funktioniert (ich habe alle Variationen von Sudo und Su ausprobiert, einschließlich --session-command, -c, ad nauseum); Keiner von ihnen erlaubte, den Prozess zu stoppen, sobald er gestartet wurde. Vielen Dank dafür. Kato vor 12 Jahren 7
Das ist eine schicke Muschelmagie, +1. Steve Kehlet vor 9 Jahren 0
Das hat bei CentOS 6 (Upstart 0.6.5) nicht funktioniert. Es gibt eine Reihe von Gabeln (4 tief, glaube ich), die von "su" initiiert wurden. Dies bedeutet, dass "erwartet Gabel" und sogar "Erwartung Daemon" die endgültige PID nicht einfangen. Mark Lakata vor 9 Jahren 5
Ich habe dies bei Amazon Linux (Upstart 0.6.5) verwendet, um einen Jenkins-Prozess zu starten (der sich selbst nicht dankenswerterweise dämonisiert) und es hat funktioniert! Ich musste es ein wenig ändern, um die Standardausgabe in eine Protokolldatei umzuleiten und einige Umgebungsvariablen festzulegen, aber es hat funktioniert! Meine Version sieht folgendermaßen aus: `exec su -s / bin / sh -c 'HOME = / foo / bar exec" $ 0 "" $ @ "&> / var / log / foobar.log' Benutzername - / Pfad / bis / Befehl [Parameter ...] ` Asfand Qazi vor 8 Jahren 2
17
Jason R. Coombs

Wie wäre es mit dem start-stop-daemon?

exec start-stop-daemon --start --chuid daemonuser --exec /bin/server_cmd 

Vom Upstart-Kochbuch :

Die empfohlene Methode für Debian- und Ubuntu-Systeme ist die Verwendung des Hilfsprogramms start-stop-daemon. […] start-stop-daemonSchreibt keine Grenzen für den Start von PAM ("Pluggable Authentication Module").

Hinweis: start-stop-daemonwird in RHEL nicht unterstützt.

Sie können die Gruppe auch verwenden, wenn Sie sie benötigen. Mit --chuid daemonuser: daemongroup Evgeny vor 12 Jahren 2
13
Jason Holt

Es gibt mehrere Möglichkeiten, dies zu tun, alle mit etwas unterschiedlicher Semantik, insbesondere in Bezug auf die Gruppenzugehörigkeit:

  • setuidgid bringt Sie in die von Ihnen angegebene Gruppe.

    • Mit den Original-Daemontools setuidgidwerden Sie nur in diese Gruppe aufgenommen, sodass Sie nicht auf Dateien zugreifen können, die zu anderen Gruppen gehören, deren Mitglied Sie sind.
    • Die setuidgidfrom daemontools-encore und das setuidgidfrom the nosh-Toolset verfügen beide über eine Option -s(aka --supplementary), mit der Sie in diese Gruppe aufgenommen werden. Außerdem werden Sie in alle zusätzlichen Gruppen für den von Ihnen angegebenen Benutzer aufgenommen.
  • Wenn newgrpSie den weniger privilegierten Benutzer verwenden, wird eine Gruppe zu Ihrer Gruppe hinzugefügt, aber auch eine neue Subshell erstellt, was die Verwendung innerhalb von Skripts schwierig macht.

  • start-stop-daemon bewahrt Ihre Gruppenmitgliedschaft und tut viel mehr als nur setuid / setgid.

  • chpst -u username:group1:group2:group3... commandnameSie können genau festlegen, welche Gruppenzugehörigkeiten Sie annehmen sollen, aber (in Ubuntu ) wird nur das runitPaket mitgeliefert, was eine Alternative zu ist upstart.

  • su -c commandname usernameNimmt alle Gruppenmitgliedschaften von username auf, was sudo -u username commandnamewahrscheinlich der Weg zum geringsten Erstaunen ist.

8
aaronsw

Verwenden Sie setuidgidaus dem Paket daemontools.

Dokumentation hier: http://cr.yp.to/daemontools/setuidgid.html

Daemontools ist keine Voraussetzung für den Start, daher scheint dies nicht die "kanonische" Antwort zu sein Adam Nelson vor 14 Jahren 7
Daemontools befindet sich außerdem im Universum (ubuntu 10.04) und upstart in main. jtimberman vor 13 Jahren 2
4
Jesse Smith

Bei einer Ubuntu 10.10-Instanz auf Amazon EC2 hatte ich mit dem start-stop-daemonBefehl mehr Glück .

Ich hatte auch Probleme mit einigen anderen aufstrebenden Strophen . Ich rufe eine Python-Anwendung mit bestimmten virtualenvund einigen Parametern zu meinem ausgeführten Programm auf.

Folgendes hat bei mir funktioniert.

script export PYTHONPATH=.:/home/ubuntu/.local/lib/python2.7/site-packages/:/home/ubuntu/python/lib/python2.7/site-packages/ exec start-stop-daemon --start --chuid ubuntu --exec /home/ubuntu/python_envs/MyProj/bin/python /home/ubuntu/www/MyProj/MyProj.py -- --config-file-dir=/home/ubuntu/www/MyProj/config/ >> /home/ubuntu/startup.log 2>&1 & end script 

Sie PYTHONPATHerhalten einige Pakete, die von der Quelle in den PYTHON-Modulpfad installiert werden, wenn dieser Upstart-Job ausgeführt wird. Ich musste alles auf absoluten Wegen machen, weil die chdirStrophe nicht zu funktionieren schien.

Ich hatte auch Probleme mit * env * -Variablen, die mit * exec start-stop-daemon * verwendet wurden. Thomas Bratt vor 10 Jahren 0
3
Mark Lakata

Ich habe CentOS 6 verwendet, und ich konnte weder den empfohlenen Hack (für Upstart 0.6.5) für mich verwenden, noch den 'su'-Trick, weil die Anzahl der beteiligten Gabeln (4, glaube ich,) nicht von' erwartet Fork 'verfolgt wurde 'oder' Daemon erwarten '.

Ich habe es eben getan

chown user:group executable chmod +s executable 

(dh das Setuid-Bit setzen und den Eigentümer ändern).

Dies ist möglicherweise nicht die sicherste Methode, aber für ein internes Forschungs- und Entwicklungsprojekt war es in unserem Fall nicht wichtig.

Wenn Sie ein `chmod 1700` oder zumindest ein` chmod u + sx, go-x` anstelle von '+ s' ausführen würden, würde dies als "sicher genug" eingestuft werden. :) dannysauer vor 8 Jahren 0
0
Chris Nava

Es gibt eine dritte Möglichkeit, je nachdem, was Sie erreichen wollen. Möglicherweise können Sie die Zugriffskontrollen der betreffenden Dateien / Geräte lockern . Dies kann einem unberechtigten Benutzer ermöglichen, Elemente bereitzustellen oder auf Elemente zuzugreifen, für die er normalerweise nicht berechtigt ist. Stellen Sie nur sicher, dass Sie dabei nicht die Schlüssel für das Königreich preisgeben.

Sie können auch das Timeout des Sudo-Kennwortcaches ändern . Ich empfehle es jedoch nicht, es sei denn, Ihr Computer ist physisch sicher (dh Sie glauben, dass es unwahrscheinlich ist, dass ein Passant versucht, Sudo-Zugriff zu erhalten).

Es gibt einen guten Grund, dass es nur sehr wenige Möglichkeiten sind privilegiert, Aktionen auszuführen, und dass sie durchführen unnötig notwendig Protokollierung. Lockere Einschränkungen wären ein Sicherheitsrisiko für Ihr System, und mangelnde Protokollierung bedeutet, dass Sie nicht wissen können, was passiert ist, wenn Sie gefährdet wurden.

Wenn die Größe Ihrer Protokolldateien ein Problem ist, ist wahrscheinlich etwas falsch. Sudo erzeugt unter normalen Bedingungen nur eine Leitung pro Verwendung.