Splitting sshd

Damien Miller
Fri, 17 May 2024 04:47:39 -0000

Hi,

I've just committed a change to start the process of splitting the
monolithic sshd binary into pieces. This change splits sshd into a
listener and a session binary.

The listener binary does what it says on the tin: listens for incoming
connections. It will also do configuration validation, hostkey loading
and other housekeeping like enforcing MaxStartups.

The new sshd-session binary is executed for each connection. It handles
everything relating to a single connection, including understanding the
SSH protocol, user authentication, shell/command execution, etc.

Further splitting of the sshd-session binary is planned. Ultimately
we'd like to get to a place where all the privileged code is in a
completely separate binary to all the unprivileged code.

This change should be almost completely invisible to users. The most
apparent change should be that you will see "sshd-session" in your
process list when a connection is active:

[djm at djm ~]$ ps ax | grep sshd
30745 ??  S  0:00.00 sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups
64369 ??  S  0:00.03 sshd-session: djm [priv] (sshd-session)
70295 ??  S  0:00.00 sshd-session: djm at ttyp0 (sshd-session)

If you like killing specific ssh sessions via process name then you
might need to adjust your fingers/scripts.

Distributors of OpenSSH will need to package the new binary. By
default this goes to LIBEXECDIR as supplied to configure.

We'd appreciate testing of this change by the community. Please report
any problems resulting from this change either to this
list or to https://bugzilla.mindrot.org/

Thanks!