Почему sshd (openssh) создает два процесса на соединение?

26

до входа в систему:

$ 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

после входа в систему:

$ 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

Для чего нужны два процесса?

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

Благодарность,

вэй
источник

Ответы:

39

Разделение привилегий - один процесс, который сохраняет права root для выполнения действий, которые может выполнять только root, а другой - все остальное.

В то время, когда задавался этот вопрос, разделение привилегий контролировалось параметром in sshd_config, и sshd_configстраница руководства объясняла, для чего это нужно. Разделение привилегий стало обязательным в версии 7.5 , так что опция и ее документация исчезли. Я больше не знаю, где найти каноническую документацию функции разделения привилегий, если такая документация существует.

Последняя версия элемента справочной страницы перед удалением сказала:

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.

источник
Спасибо за указатель, после того, как я посмотрел на него поближе, похоже, что во время входа в систему создано 3 процесса, один из которых работает в привилегированном режиме, другой - в непривилегированном «sshd» пользователе, после завершения аутентификации этот непривилегированный процесс был убит и новый процесс sshd, созданный под именем входа. Есть ли где-нибудь подробное документирование этого, например, взаимодействие между этими процессами? Спасибо.
Вэй
4
@ wei, да, это задокументировано в BXR.SU/OpenBSD/usr.bin/ssh/sshd.c . Если вы ищете fork, вы обнаружите, что он используется один раз privsep_preauth()и снова в privsep_postauth().
CNST
@WumpusQWumbley, предоставленная ссылка не содержит какого-либо раздела о UsePrivilegeSeparation. Единственная ссылка на разделение привилегий находится внизу, в разделе кредитов. Я что-то пропустил? :)
Сорин Постельнику
1
@SorinPostelnicu Вы нет, но, похоже, в проекте OpenBSD отсутствует какая-либо документация по privsep.