Wie kann ein Startjob auf kanonische Weise seine Benutzer-ID ändern und das Skript als nicht privilegierter Benutzer ausführen?
Offensichtlich kann man su
oder verwenden sudo
, aber dies scheint schwierig zu sein (und kann unnötige Protokollzeilen erzeugen).
initctl --version
um Ihre aktuelle Version von upstart zu finden.Auf dem #upstart-Kanal bei freenode lautet die offizielle Meinung dazu:
quelle
su
das bedeutet , dassexpect fork
sogarexpect daemon
die endgültige PID nicht fangen.exec su -s /bin/sh -c 'HOME=/foo/bar exec "$0" "$@" &>/var/log/foobar.log' username -- /path/to/command [parameters...]
Wie wäre es mit Start-Stop-Daemon?
Aus dem Upstart-Kochbuch :
Hinweis:
start-stop-daemon
Wird in RHEL nicht unterstützt.quelle
Es gibt verschiedene Methoden, die alle leicht unterschiedliche Semantiken haben, insbesondere in Bezug auf die Gruppenzugehörigkeit:
setuidgid
Sie werden in die von Ihnen angegebene Gruppe aufgenommen.setuidgid
werden Sie nur in diese Gruppe aufgenommen, sodass Sie nicht auf Dateien zugreifen können, die zu anderen Gruppen gehören, denen Sie angehören.setuidgid
von daemontools-Zugabe und diesetuidgid
von der nosh Toolset beide eine-s
(aka--supplementary
) Option , die Sie in dieser Gruppe setzen, und Sie auch in all den gestellten zusätzlichen Gruppen für den Benutzer , die Sie angeben.Wenn
newgrp
Sie "Sobald Sie der Benutzer mit den geringsten Berechtigungen sind" verwenden, wird eine einzelne Gruppe zu Ihrer Gruppe hinzugefügt, es wird jedoch auch eine neue Subshell erstellt, was die Verwendung in Skripten erschwert.start-stop-daemon
Erhält Ihre Gruppenzugehörigkeit und leistet viel mehr als nur setuid / setgid.chpst -u username:group1:group2:group3... commandname
Damit können Sie genau festlegen, welche Gruppenmitgliedschaften übernommen werden sollen, aber (in Ubuntu ) ist nur dasrunit
Paket enthalten, das eine Alternative zuupstart
.su -c commandname username
nimmt alle Gruppenmitgliedschaften des Benutzernamens aufsudo -u username commandname
, so wie es der Fall ist , also sind sie wahrscheinlich der Weg zu geringstem Erstaunen.quelle
Verwenden Sie
setuidgid
aus der Packungdaemontools
.Dokumentation hier: http://cr.yp.to/daemontools/setuidgid.html
quelle
Auf einer Ubuntu 10.10-Instanz unter Amazon EC2 hatte ich mit dem
start-stop-daemon
Befehl mehr Glück .Ich kämpfte auch mit einigen der anderen Emporkömmling Strophen . Ich rufe eine Python-Anwendung mit einem bestimmten
virtualenv
Parameter für mein ausgeführtes Programm auf.Folgendes hat bei mir funktioniert.
Damit werden
PYTHONPATH
einige Pakete von der Quelle in den PYTHON-Modulpfad installiert, wenn dieser Startjob ausgeführt wird. Ich musste alles in absoluten Pfaden tun, weil diechdir
Strophe nicht zu funktionieren schien.quelle
Ich habe CentOS 6 verwendet und konnte weder den empfohlenen Hack (für Upstart 0.6.5) für mich zum Laufen bringen, noch den 'su'-Trick, weil die Anzahl der beteiligten Gabeln (4, glaube ich) nicht von' expect fork 'erfasst wurde 'oder' Daemon erwarten '.
Ich habe es irgendwann einfach getan
(dh setuid setzen und Eigentümer ändern).
Es ist vielleicht nicht die sicherste Methode, aber für ein internes F & E-Projekt war das in unserem Fall egal.
quelle
chmod 1700
oder mindestens einchmod u+sx,go-x
statt nur eines ausführen würden+s
, würde dies als "sicher genug" eingestuft. :)Es gibt eine dritte Möglichkeit, je nachdem, was Sie erreichen möchten. Möglicherweise können Sie die Zugriffskontrollen für die betreffenden Dateien / Geräte lösen . Dies kann es einem nicht privilegierten Benutzer ermöglichen, Elemente bereitzustellen oder auf diese zuzugreifen, die normalerweise nicht zulässig sind. Stellen Sie sicher, dass Sie dabei nicht die Schlüssel zum Königreich verraten.
Sie können auch das Timeout des sudo-Passwort-Cache ändern . Aber ich empfehle es nicht, es sei denn, Ihr Computer ist physisch sicher (dh Sie glauben, dass es unwahrscheinlich ist, dass ein Passant versuchen würde, Sudo-Zugriff zu erhalten).
Es gibt einen guten Grund dafür, dass es nur sehr wenige Möglichkeiten gibt, privilegierte Aktionen auszuführen, und dass sie
unnötignotwendige Protokollierungen durchführen. Lose Einschränkungen stellen ein Sicherheitsrisiko für Ihr System dar, und ein Mangel an Protokollierung bedeutet, dass Sie nicht wissen können, was passiert ist, wenn Sie kompromittiert wurden.Wenn die Größe Ihrer Protokolldateien ein Problem darstellt, stimmt wahrscheinlich etwas nicht. Sudo generiert unter normalen Bedingungen nur eine Zeile pro Verwendung.
quelle
In CentOS 6, ab Version 0.6.5, hat Folgendes für mich funktioniert.
oder :
Wenn verwenden
Der Auftragsprozess kann nicht abgebrochen werden
initclt stop
. Ich denke der Grund ist:quelle