Die Dienste werden standardmäßig zum Startzeitpunkt root
auf meiner RHEL-Box gestartet. Wenn ich mich richtig erinnere, gilt das Gleiche für andere Linux-Distributionen, die die Init-Skripte in verwenden /etc/init.d
.
Was ist Ihrer Meinung nach der beste Weg, um die Prozesse stattdessen als (statischer) Benutzer meiner Wahl ausführen zu lassen?
Die einzige Methode, zu der ich gekommen war, war, etwas zu verwenden wie:
su my_user -c 'daemon my_cmd &>/dev/null &'
Aber das scheint ein bisschen unordentlich ...
Ist etwas Magie versteckt, die einen einfachen Mechanismus zum automatischen Starten von Diensten als andere Benutzer ohne Rootberechtigung bietet?
EDIT: Ich hätte sagen sollen, dass die Prozesse, die ich in dieser Instanz starte, entweder Python-Skripte oder Java-Programme sind. Ich möchte lieber keinen nativen Wrapper um sie schreiben, daher kann ich setuid () leider nicht aufrufen, wie Black vorschlägt.
Antworten:
Unter Debian verwenden wir das
start-stop-daemon
Dienstprogramm, das PID-Dateien verarbeitet, den Benutzer ändert, den Daemon in den Hintergrund stellt und vieles mehr.Ich bin mit RedHat nicht vertraut, aber das
daemon
Dienstprogramm, das Sie bereits verwenden (das/etc/init.d/functions
übrigens in definiert ist), wird überall als Äquivalent zu erwähntstart-stop-daemon
, sodass entweder die UID Ihres Programms oder die Art und Weise, wie Sie dies tun, geändert werden kann es ist schon das richtige.Wenn Sie sich im Internet umschauen, gibt es mehrere vorgefertigte Wrapper, die Sie verwenden können. Einige sind möglicherweise bereits in RedHat verpackt. Schauen Sie sich
daemonize
zum Beispiel an.quelle
/etc/init.d/skeleton
. Fügen Sie UID, GID-Variablen hinzu unddo_start()
verwenden Sie:start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --chuid $UID:$GID -- $DAEMON_ARGS
daemon()
definiert ist/etc/rc.d/init.d/function
.Nachdem ich mir alle Vorschläge hier angesehen habe, habe ich einige Dinge entdeckt, von denen ich hoffe, dass sie für andere in meiner Position nützlich sind:
hop weist mich zu Recht auf Folgendes zurück
/etc/init.d/functions
: Mit derdaemon
Funktion können Sie bereits einen alternativen Benutzer festlegen:Dies wird implementiert, indem der Prozessaufruf mit
runuser
- dazu später mehr verpackt wird .Jonathan Leffler hat recht: In Python gibt es Setuid:
Ich glaube jedoch immer noch nicht, dass Sie innerhalb einer JVM eine Einstellung vornehmen können.
Behandeln Sie den Fall, in dem Sie als Benutzer, den Sie bereits sind, aufgefordert werden, einen Befehl auszuführen, weder ordnungsgemäß
su
nochrunuser
ordnungsgemäß. Z.B:Um dieses Verhalten von
su
und zu umgehenrunuser
, habe ich mein Init-Skript in Folgendes geändert:Vielen Dank für Ihre Hilfe!
quelle
Wenn Sie beabsichtigen, einen eigenen Daemon zu schreiben, empfehle ich, setuid () aufzurufen. Auf diese Weise kann Ihr Prozess
quelle
Nur um einige andere Dinge hinzuzufügen, auf die Sie achten sollten:
quelle
auf einer virtuellen CENTOS (Red Hat) -Maschine für SVN-Server: Bearbeitet
/etc/init.d/svnserver
, um die PID in etwas zu ändern, das SVN schreiben kann:und hinzugefügte Option
--user=svn
:Das ursprüngliche Pidfile war
/var/run/svnserve.pid
. Der Daemon wurde nicht gestartet, da nur root dort schreiben konnte.quelle
Einige Dinge, auf die Sie achten sollten:
Im Allgemeinen verwende ich / sbin / su, um vor dem Starten von Daemons zum entsprechenden Benutzer zu wechseln.
quelle
Probieren Sie im Init-Skript Folgendes aus:
Es hat bei mir funktioniert.
quelle
setuid: command not found
Ich musste eine Spring .jar-Anwendung als Dienst ausführen und fand eine einfache Möglichkeit, dies als bestimmter Benutzer auszuführen:
Ich habe den Eigentümer und die Gruppe meiner JAR-Datei in den Benutzer geändert, als den ich ausführen wollte. Dann verknüpfte dieses Glas in init.d und startete den Dienst.
So:
quelle