Warum erstellt sshd (openssh) zwei Prozesse pro Verbindung?

26

vor dem Login:

$ ps -elf | grep sshd
5 S root     26135     1  0  80   0 - 13115 ?      17:26 ?        00:00:00 /usr/sbin/sshd
0 S test     26480 21337  0  80   0 -  4154 -      18:41 pts/27   00:00:00 grep --colour=auto sshd

nach dem Login:

$ ps -elf | grep sshd
5 S root     26135     1  0  80   0 - 13115 ?      17:26 ?        00:00:00 /usr/sbin/sshd
4 S root     26577 26135  0  80   0 - 24204 ?      18:42 ?        00:00:00 sshd: test [priv] 
5 S test     26582 26577  0  80   0 - 24204 ?      18:42 ?        00:00:00 sshd: test@pts/30 
0 S test     26653 21337  0  80   0 -  4155 -      18:42 pts/27   00:00:00 grep --colour=auto sshd

Wofür sind die beiden Prozesse?

4 S root     26577 26135  0  80   0 - 24204 ?      18:42 ?        00:00:00 sshd: test [priv] 
5 S test     26582 26577  0  80   0 - 24204 ?      18:42 ?        00:00:00 sshd: test@pts/30

Vielen Dank,

wei
quelle

Antworten:

39

Privilegientrennung - ein Prozess, der Root-Privilegien behält, um Dinge zu tun, die nur Root kann, und ein anderer, der alles andere tut.

Zu der Zeit, als diese Frage gestellt wurde, wurde die Privilegientrennung durch eine Option in gesteuert sshd_config, und die sshd_configManpage erklärte, wofür sie gedacht war. In Version 7.5 wurde die Trennung von Berechtigungen obligatorisch , sodass diese Option und ihre Dokumentation nicht mehr vorhanden sind. Ich weiß nicht mehr, wo ich die kanonische Dokumentation der Berechtigungstrennungsfunktion finden kann, falls eine solche Dokumentation vorhanden ist.

Die letzte Version des Manpage-Elements vor dem Entfernen lautete:

UsePrivilegeSeparation
        Specifies whether sshd(8) separates privileges by creating an
        unprivileged child process to deal with incoming network traffic.
        After successful authentication, another process will be created
        that has the privilege of the authenticated user.  The goal of
        privilege separation is to prevent privilege escalation by con-
        taining any corruption within the unprivileged processes.  The
        argument must be yes, no, or sandbox.  If UsePrivilegeSeparation
        is set to sandbox then the pre-authentication unprivileged
        process is subject to additional restrictions.  The default is
        sandbox.

quelle
Vielen Dank für den Zeiger, nachdem ich ihn mir genauer angesehen habe, sieht es so aus, als ob während der Anmeldung drei Prozesse erstellt wurden, einer im privilegierten Modus und einer im nicht privilegierten "sshd" -Benutzer. Nach Abschluss der Authentifizierung wurde dieser nicht privilegierte Prozess abgebrochen und Ein neuer sshd-Prozess wird unter dem Anmeldenamen erstellt. Gibt es irgendwo eine Dokumentation, die dies detailliert dokumentiert, zB die Wechselwirkungen zwischen diesen Prozessen? Vielen Dank.
Wei
4
@wei, ja, es ist in BXR.SU/OpenBSD/usr.bin/ssh/sshd.c dokumentiert . Wenn Sie suchen fork, werden Sie feststellen, dass es immer privsep_preauth()wieder in verwendet wird privsep_postauth().
1.
@WumpusQWumbley, der bereitgestellte Link scheint keinen Abschnitt über UsePrivilegeSeparation zu enthalten. Der einzige Hinweis zur Privilegientrennung befindet sich unten im Abschnitt "Credits". Vermisse ich etwas? :)
Sorin Postelnicu
1
@SorinPostelnicu Bist du nicht, aber es scheint, dass dem OpenBSD-Projekt jegliche Dokumentation von privsep fehlt.