¿Por qué sshd (openssh) crea dos procesos por conexión?

26

antes de iniciar sesión:

$ 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

después de iniciar sesión:

$ 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

¿Para qué son los dos procesos?

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

Gracias,

wei
fuente

Respuestas:

39

Separación de privilegios: un proceso que conserva los privilegios de root para hacer cosas que solo puede hacer root, y otro que hace todo lo demás.

En el momento en que se hizo esta pregunta, la separación de privilegios estaba controlada por una opción en sshd_config, y la sshd_configpágina del manual explicaba para qué era. La separación de privilegios se convirtió en obligatoria en la versión 7.5 , por lo que esa opción y su documentación desaparecieron. Ya no sé dónde encontrar la documentación canónica de la función de separación de privilegios, si existe tal documentación.

La última versión del elemento de la página de manual antes de la eliminación decía:

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.

fuente
Gracias por el puntero, después de echarle un vistazo más de cerca, parece que hay 3 procesos creados durante el inicio de sesión, uno que se ejecuta en modo privilegiado, uno que se ejecuta en un usuario "sshd" no privilegiado, después de que finaliza la autenticación, este proceso no privilegiado fue eliminado y un nuevo proceso sshd creado con el nombre de inicio de sesión. ¿Hay algún lugar que documente esto en detalle, por ejemplo, las interacciones entre estos procesos? Gracias.
wei
44
@wei, sí, está documentado en BXR.SU/OpenBSD/usr.bin/ssh/sshd.c . Si busca fork, encontrará que se usa una privsep_preauth()y otra vez privsep_postauth().
cnst
@WumpusQWumbley, el enlace proporcionado no parece contener ninguna sección sobre UsePrivilegeSeparation. La única referencia a la separación de privilegios está en la parte inferior, en la sección de créditos. ¿Me estoy perdiendo de algo? :)
Sorin Postelnicu
1
@SorinPostelnicu No lo eres, pero parece que al proyecto OpenBSD le falta alguna documentación de privsep.