Page 1 of 1

setgid/setuid: Daemon existiert mit zwei PIDs?

Posted: 04. Aug 2010 12:51
by TomoT
Hi,

mal eine Verständnisfrage:

Ich habe einen Daemon, der wird mit root-Rechten gestartet, öffnet sein Logfile und legt einen Serversocket an. Anschließend werden seine Rechte durch Aufruf von setgid()/setuid() auf die von "nobody" beschränkt.

Das führt lustigerweise dazu, dass dieser Prozess mit zwei PIDs in der ps-Aufstellung auftaucht, jeweils mit unterschiedlichen Userkennungen. Ist das normal so? Bzw. ist das in Ordnung, dass speziell der Prozess mit den root-Rechten weiterhin auftaucht?

Posted: 05. Aug 2010 9:56
by Janka
Das kommt drauf an, wie der Daemon implementiert ist. Ein naiver Daemon würde einfach den Benutzer setzen und fertig. Er hätte dann aber niemals mehr die Chance wieder an root-Rechte zu gelangen, ohne dass ihn root neu startet. Das kann zum Problem werden, wenn der nichtpriviligierte Prozess abstürzt. Im allgemeinen möchte man, dass ein Daemon neu startet, wenn er durch irgendein unbedachtes Ereignis beendet wurde.

Also wird jener Daemon so implementiert sein, dass er fork()ed, dann nur das Kind setuid() ausführt und der Elternprozess dann mittels wait() auf einen eventuellen Absturz des Kindes wartet, um es in jenem Fall sofort wieder neu starten zu können. So macht das auch die Servicefunktion daemon().

Janka

Posted: 10. Aug 2010 7:21
by TomoT
Ja, der Daemon macht das so, er ruft setuid()/setgid() auf und macht dann ohne jegliches daemon() oder fork() weiter - er braucht ab diesem Punkt keine root-Rechte mehr und soll deswegen auch nicht "versehentlich" an welche gelangen. Dennoch bleibt diese eine PID mit der root-User-ID zurück.

Posted: 11. Aug 2010 22:50
by Janka
daemon() oder fork() müssten wenn überhaupt *vor* setuid() stehen, nicht danach.

Janka