Frage Upstart-Jobs als unprivilegierte Benutzer ausführen


Was ist die kanonische Art, einen Upstart-Job zu haben, ändert seine Benutzer-ID und führt das Skript als unprivilegierter Benutzer aus?

Offensichtlich kann man verwenden su oder sudo, aber das scheint Hacky (und kann unnötige Protokollzeilen erzeugen).


138
2018-03-11 14:26


Ursprung




Antworten:


Mit Upstart v1.4, setuid und Setgid werden nativ in der Konfigurationsdatei unterstützt.


108
2017-09-09 11:26



Siehe das Kochbuch für Details zu diesem Thema: upstart.ubuntu.com/cookbook/#run-a-job-as-a-different-user - Jason Navarrete
Mit anderen Worten, es wird in Precise (12.04) und neuer unterstützt. - Edward Anderson
Mit anderen Worten, wird in Centos 6 nicht unterstützt - socketpair
Für die Aufzeichnung, initctl --version um Ihre aktuelle Version von Emporkömmling zu finden. - Mahn
Ärgerlicherweise verwendet die Amazon-Linux-Distribution von AWS die Upstart-Version von RHEL 6 (0.6.5 !!!!), so dass jeder, der diese Version verwendet, die Su-Lösung verwenden muss. - Asfand Qazi


Auf dem Freestyle-Kanal #upstart fragen wir uns:

Eine zukünftige Version von Upstart wird es geben   native Unterstützung dafür, aber für jetzt,   Sie können etwas wie verwenden:

exec su -s /bin/sh -c 'exec "$0" "$@"' username -- /path/to/command [parameters...]

84
2018-01-18 01:41



Dies ist die einzige Antwort, die bei Amazon Linue EC2 funktioniert hat (Ich habe alle Varianten von sudo und su versucht, einschließlich --session-command, -c, ad nauseum); keiner von ihnen erlaubte den Prozess zu stoppen, sobald er gestartet wurde; Vielen Dank dafür. - Kato
Das ist eine ausgefallene Shell-Magie, +1. - Steve Kehlet
Das hat bei CentOS 6 (Upstart 0.6.5) nicht funktioniert. Es gibt eine Reihe von Gabeln (4 tiefe, glaube ich), die von su das bedeutet, dass expect fork und selbst expect daemon Fange nicht die letzte PID. - Mark Lakata
Ich benutzte dies auf Amazon Linux (Upstart 0.6.5), um einen Jenkins-Prozess zu booten (der sich glücklicherweise nicht selbst dämmt) und es hat funktioniert! Ich musste es etwas ändern, um die Standardausgabe in eine Protokolldatei umzuleiten und einige Umgebungsvariablen zu setzen, aber es funktionierte! Meine Version sieht so aus: exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...] - Asfand Qazi


Wie wäre es mit Start-Stop-Daemon?

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

Von Upstart Kochbuch:

Die empfohlene Methode für Debian- und Ubuntu-Systeme ist die Verwendung des Hilfsprogramms start-stop-daemon. [...] start-stop-daemon PAM ("Pluggable Authentication Module") Beschränkungen für den Prozess, der gestartet wird.

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


17
2017-12-23 15:11



Sie können die Gruppe auch verwenden, wenn Sie sie benötigen. Mit --chuid daemonuser: daemongroup - Evgeny


Es gibt mehrere Möglichkeiten, dies zu tun, alle mit einer etwas anderen Semantik, insbesondere in Bezug auf die Gruppenmitgliedschaft:

  • setuidgid Sie werden in die von Ihnen angegebene Gruppe eingefügt.

    • Die ursprünglichen Daemontools setuidgid werde dich setzen nur In dieser Gruppe können Sie nicht auf Dateien zugreifen, die zu anderen Gruppen gehören, denen Sie angehören.
    • Das setuidgid von daemontols-encore und das setuidgid aus dem Nosh-Toolset beide haben ein -s (a.k.a. --supplementary) Option, die Sie in diese Gruppe bringt und Sie auch in alle Zusatzgruppen für den Benutzer, den Sie angeben.
  • Verwenden newgrp Sobald Sie zum weniger privilegierten Benutzer geworden sind, fügen Sie Ihrer Gruppe eine einzelne Gruppe hinzu, erstellen aber auch eine neue Subshell, was die Verwendung in Skripten erschwert.

  • start-stop-daemon erhält Ihre Gruppenmitgliedschaft und macht viel mehr als nur setuid / setgid.

  • chpst -u username:group1:group2:group3... commandname können Sie genau angeben, welche Gruppenmitgliedschaften zu übernehmen, aber ( Ubuntu) Es kommt nur mit dem runit Paket, das eine Alternative zu ist upstart.

  • su -c commandname username nimmt alle Gruppenmitgliedschaften des Benutzernamens auf sudo -u username commandname, also sind sie wahrscheinlich der Weg zum geringsten Erstaunen.


13
2017-12-24 00:00





Benutzen setuidgid aus dem Paket daemontools.

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


8
2018-03-11 15:50



daemontools ist keine Voraussetzung für Emporkömmling, also scheint dies nicht die "kanonische" Antwort zu sein - Adam Nelson
Außerdem ist daemontools im Universum (ubuntu 10.04), und der Emporkömmling ist in main. - jtimberman


Auf einer Ubuntu 10.10 Instanz auf Amazon EC2 hatte ich mehr Glück mit der start-stop-daemon Befehl.

Ich kämpfte auch mit einigen anderen Emporkömmlingen Strophen. Ich rufe eine Python-Anwendung mit einer bestimmten an virtualenv und einige Parameter zu meinem ausgeführten Programm.

Folgendes hat für mich 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

Das PYTHONPATH ist es, einige Pakete von der Quelle in die zu installieren PYTHON Modulpfad, wenn dieser Upstart-Job ausgeführt wird. Ich musste alles auf absoluten Wegen tun, weil die chdir Strophe schien keine Arbeit zu machen.


4
2018-01-06 19:52



Ich hatte auch Probleme mit env Variablen verwendet mit Exec-Start-Stop-Daemon. - Thomas Bratt


Ich benutzte CentOS 6, und ich konnte nicht den empfohlenen Hack (für Upstart 0.6.5) für mich arbeiten, noch den 'su' Trick, weil die Anzahl der beteiligten Gabelungen (4 glaube ich) nicht von 'expect fork' verfolgt wurde 'oder' expect daemon '.

Ich habe es schließlich auch getan

chown user:group executable
chmod +s executable

(Setzen Sie das setuid Bit und ändern Sie den Besitz).

Es ist vielleicht nicht die sicherste Methode, aber für ein internes F & E-Projekt spielte es in unserem Fall keine Rolle.


3
2017-08-27 21:56



Wenn du es tun würdest chmod 1700 oder mindestens a chmod u+sx,go-x da drin statt nur +swürde es als "sicher genug" gelten. :) - dannysauer


Es gibt eine dritte Möglichkeit, abhängig davon, was Sie erreichen möchten. Sie können dazu in der Lage sein Lockern Sie die Zugriffskontrollen auf den betreffenden Dateien / Geräten. Dadurch kann ein nicht privilegierter Benutzer Elemente bereitstellen oder darauf zugreifen, die normalerweise nicht zugelassen werden. Sei nur sicher, dass du dabei nicht die Schlüssel zum Königreich verschenkst.

Du kannst auch Ändern Sie die Zeitüberschreitung des Sudo-Passwort-Cache. Aber ich empfehle es nicht, es sei denn, Ihre Maschine ist physisch sicher (d. H. Sie glauben, dass es unwahrscheinlich ist, dass ein Passant versucht, sudo Zugang zu erhalten).

Es gibt einen guten Grund, dass es sehr wenige Möglichkeiten gibt, privilegierte Aktionen auszuführen und durchzuführen unnötig  notwendig protokollieren. Lose Beschränkungen würden ein Sicherheitsrisiko für Ihr System darstellen, und ein Mangel an Protokollierung würde bedeuten, dass es keine Möglichkeit gibt zu wissen, was passiert ist, wenn Sie kompromittiert wurden.

Wenn die Größe Ihrer Log-Dateien ist eine Sorge, dann ist wahrscheinlich etwas falsch. Sudo erzeugt unter normalen Bedingungen nur eine Zeile pro Nutzung.


0
2018-03-11 17:07