Dlaczego sshd (openssh) tworzy dwa procesy na połączenie?

26

przed zalogowaniem:

$ 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

po zalogowaniu:

$ 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

Do czego służą dwa procesy?

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

Dzięki,

wei
źródło

Odpowiedzi:

39

Separacja uprawnień - jeden proces, który zachowuje uprawnienia root'a do robienia rzeczy, które może wykonać tylko root, a drugi, który robi wszystko inne.

W chwili, gdy pytanie zostało zadane, rozdział uprawnień był kontrolowany przez opcję w sshd_config, a sshd_configstrona podręcznika wyjaśniła, do czego służy. Rozdzielenie uprawnień stało się obowiązkowe w wersji 7.5 , więc opcja i jej dokumentacja zniknęły. Nie wiem już, gdzie znaleźć dokumentację kanoniczną dotyczącą funkcji separacji uprawnień, jeśli taka dokumentacja istnieje.

Ostatnia wersja elementu strony podręcznika przed usunięciem mówi:

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.

źródło
Dzięki za wskaźnik, po dokładniejszym przyjrzeniu się, wygląda na to, że podczas logowania tworzone są 3 procesy, jeden uruchomiony w trybie uprzywilejowanym, jeden uruchomiony w nieuprzywilejowanym użytkowniku „sshd”, po zakończeniu uwierzytelnienia ten nieuprzywilejowany proces został zabity i nowy proces sshd utworzony pod nazwą logowania. Czy jest gdzieś szczegółowo to dokumentujące, np. Interakcje między tymi procesami? Dzięki.
wei
4
@wei, tak, jest to udokumentowane w BXR.SU/OpenBSD/usr.bin/ssh/sshd.c . Jeśli szukasz fork, przekonasz się, że jest on używany raz za privsep_preauth()razem privsep_postauth().
cnst
@WumpusQWumbley, podany link nie wydaje się zawierać żadnej sekcji o UsePrivilegeSeparation. Jedyne odniesienie do rozdziału uprawnień znajduje się na dole, w sekcji kredytów. Czy coś brakuje? :)
Sorin Postelnicu
1
@SorinPostelnicu Nie jesteś, ale wygląda na to, że w projekcie OpenBSD brakuje jakiejkolwiek dokumentacji prywatnej.