Por que o sshd (openssh) cria dois processos por conexão?

26

antes do 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

após o 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

Para que servem os dois processos?

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

Obrigado,

wei
fonte

Respostas:

39

Separação de privilégios - um processo que retém privilégios de root para fazer coisas que somente o root pode fazer e outro que faz todo o resto.

No momento em que essa pergunta foi feita, a separação de privilégios era controlada por uma opção sshd_config, e a sshd_configpágina de manual explicava para que servia. A separação de privilégios tornou-se obrigatória na versão 7.5 , para que a opção e sua documentação sejam removidas. Não sei mais onde encontrar a documentação canônica do recurso de separação de privilégios, se houver alguma documentação desse tipo.

A última versão do item da página de manual antes da remoção dizia:

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.

fonte
Obrigado pelo ponteiro, depois de analisá-lo mais de perto, parece que existem 3 processos criados durante o login, um em execução no modo privilegiado, outro executado no usuário "sshd" sem privilégios, após a autenticação terminar, esse processo sem privilégios foi morto e um novo processo sshd criado com o nome de login. Existe algum lugar para documentar isso em detalhes, por exemplo, as interações entre esses processos? Obrigado.
wei
4
@wei, sim, está documentado em BXR.SU/OpenBSD/usr.bin/ssh/sshd.c . Se você pesquisar fork, verá que é usado uma privsep_preauth()e outra vez privsep_postauth().
CNST
@WumpusQWumbley, o link fornecido não parece conter nenhuma seção sobre UsePrivilegeSeparation. A única referência à separação de privilégios está na parte inferior, na seção de créditos. Estou esquecendo de algo? :)
Sorin Postelnicu
1
@SorinPostelnicu Você não está, mas parece que o projeto OpenBSD está sem qualquer documentação do privsep.