Was ist die empfohlene Methode zum Ausführen eines Dienstes als Nicht-Root-Benutzer?

Was ist die empfohlene Methode zum Ausführen eines Dienstes als Nicht-Root-Benutzer?

Ich habe ein einfaches init.d-Skript, das einen Prozess startet und stoppt. Ich rufe init.d als Root auf, möchte aber, dass der von ihm gesteuerte Prozess als bestimmter Benutzer ausgeführt wird.

Der häufigste Vorschlag im Internet scheint zu sein,

su myuser -c "my_process args"

Dies erzeugt allerdings einen zweiten Prozessraum, eine neue Shell etc. und ist etwas unelegant.

Ich würde lieber verwenden exec(), da es die Shell ersetzt, aber es nimmt keinen Benutzer als Argument an. Ist das ein Fall, in dem ich setuid()zuerst verwenden sollte? Was ist mit dem Einstellen der GID? Gibt es irgendwelche Fallstricke, die man beachten muss?

Gibt es alternativ distributionsspezifische Lösungen, um init.d als anderer Benutzer auszuführen? Meine Umgebung ist Centos 6.4.

Antwort1

Hängt von der Distribution ab, aber RHEL-basierte Distributionen verwenden eine Bash-Funktion, aus /etc/rc.d/init.d/functionsder sie stammen und die aufgerufen wird daemonund selbst nur ein Wrapper um den runuserBefehl ist. Soweit ich es in den Quelldateien erkennen kann, ist es suin den meisten Fällen funktional identisch, es läuft nur nicht über PAM (wahrscheinlich, um in bestimmten Fällen Henne-Ei-Probleme zu vermeiden).

Das wird Ihre Einwände nicht wirklich beantworten, aber so machen es die Dienste. Die Sauberkeit und allgemeine Konformität mit der Logik, die Sie sich wünschen, ist Teil der Motivation für Dinge wiesystemd

Antwort2

Die Verwendung von su someuser -c ...ist erforderlich. Zunächst einmal setuid()ist ein Systemaufruf für Shellcode nicht verfügbar. Machen Sie es nicht unnötig kompliziert.

verwandte Informationen