Page 1 of 1

Initscript: Binary als anderer Nutzer ausführen

Posted: 2009-03-17 07:56
by sticki
Hallo,

ich bin gerade dabei, ein Initscript zu schreiben und stehe dabei vor dem Problem, dass die Binary nicht als Root laufen soll. Eine Möglichkeit wäre z.B. SUID zu verwenden, was ja auch prima klappt. Allerdings würde mich auch interessieren, wie es normale, andere Anwendungen lösen? z.B. beim Apache konnte ich im Initscript keinen Benutzerwechsel o.ä. erkennen und bei der Binary ist auch nicht das SUID-Bit gesetzt. Trotzdem läuft Apache nicht als root. Es ist mir ein kleines Rätsel. :)

Grüße

Re: Initscript: Binary als anderer Nutzer ausführen

Posted: 2009-03-17 11:22
by daemotron
sticki wrote:beim Apache konnte ich im Initscript keinen Benutzerwechsel o.ä. erkennen und bei der Binary ist auch nicht das SUID-Bit gesetzt. Trotzdem läuft Apache nicht als root. Es ist mir ein kleines Rätsel. :)
Das Rätsel lüftet sich, wenn man in den Quellcode einer solchen Applikation reinschaut. Am Beispiel von Lighttpd sieht man recht schön, dass die Applikation mit setuid() bzw. setgid() zu einem niedriger privilegiertem User wechselt (Zeilen 752ff in server.c). Bei einem Webserver ist dieses Vorgehen übrigens unumgänglich, da sich ein Prozess nur an Ports < 1024 binden kann, wenn er unter UID 0 läuft. Lighty und Apache allokieren also erst den Socket und geben dann ihre root-Rechte ab.

Wenn man es im Init-Skript tun muss, weil der zu startende Dienst einen solchen Mechanismus nicht implementiert hat (=> Drecksdienst!), dann ist su -c Dein Freund (aber vorsicht, auf richtiges Quoting achten!).

Re: Initscript: Binary als anderer Nutzer ausführen

Posted: 2009-03-17 21:43
by Roger Wilco
jfreund wrote:Bei einem Webserver ist dieses Vorgehen übrigens unumgänglich, da sich ein Prozess nur an Ports < 1024 binden kann, wenn er unter UID 0 läuft.
Mit POSIX Capabilities (-> `man 7 capabilities`) bzw. konkret CAP_NET_BIND_SERVICE stimmt das Gott sei dank nur noch eingeschränkt. Wenn man dem Webserver Binary die entsprechene Capability mit `setcap` gibt, geht es auch komplett ohne Root-Rechte. ;)

Details unter http://www.linux-magazin.de/layout/set/ ... full/21868
jfreund wrote:Wenn man es im Init-Skript tun muss, weil der zu startende Dienst einen solchen Mechanismus nicht implementiert hat (=> Drecksdienst!), dann ist su -c Dein Freund (aber vorsicht, auf richtiges Quoting achten!).
Außer `su` könnten auch `sudo` (je nach Geschmack) oder `start-stop-daemon` nützlich sein.

Re: Initscript: Binary als anderer Nutzer ausführen

Posted: 2009-03-17 22:18
by sticki
ok, es wird also über den quellcode gelöst, danke.
Ich werde es wohl mit su -c probieren, bei ersten Tests hat das ganz gut funktioniert.

Grüße