setgid/setuid: Daemon existiert mit zwei PIDs?

Post Reply
Message
Author
TomoT

setgid/setuid: Daemon existiert mit zwei PIDs?

#1 Post 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?

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#2 Post 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
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

TomoT

#3 Post 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.

User avatar
Janka
Posts: 3585
Joined: 11. Feb 2006 19:10

#4 Post by Janka »

daemon() oder fork() müssten wenn überhaupt *vor* setuid() stehen, nicht danach.

Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.

Post Reply