ssh.service and ssh.socket both running.

Bug #2020560 reported by moose
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
openssh (Ubuntu)
Fix Released
Undecided
Colin Watson

Bug Description

I am running Ubuntu 23.04. The out-of-the-box configuration allows SSH access on port 22. I wish to have ssh listen on both ports 22 and 7022. The ssh_config file contains a comment that Ubuntu now uses socket activated connections and thus ignores the Port and ListenAddress entries. I looked up the ssh socket activation and found that I needed a /etc/systemd/system/ssh.socket.d directory that contains a listen.conf file. I created the directory and the listen.conf file that contains this.

[Socket]
# Uncomment the following line to turn of listening on port 22.
#ListenStream=
ListenStream=7022

I then ran these two commands:
sudo systemctl daemon-reload
sudo systemctl restart ssh

I then checked for port listeners:
root# lsof -i -P -n | grep LISTEN
systemd 1 root 454u IPv6 25979 0t0 TCP *:22 (LISTEN)
systemd-r 638 systemd-resolve 14u IPv4 35332 0t0 TCP 127.0.0.53:53 (LISTEN)
systemd-r 638 systemd-resolve 16u IPv4 35334 0t0 TCP 127.0.0.54:53 (LISTEN)
Xtigervnc 941 moose 9u IPv4 22485 0t0 TCP 127.0.0.1:5902 (LISTEN)
Xtigervnc 941 moose 10u IPv6 22486 0t0 TCP [::1]:5902 (LISTEN)
cupsd 2258639 root 6u IPv6 33526334 0t0 TCP [::1]:631 (LISTEN)
cupsd 2258639 root 7u IPv4 33526335 0t0 TCP 127.0.0.1:631 (LISTEN)
sshd 3698765 root 3u IPv6 25979 0t0 TCP *:22 (LISTEN)

I then discovered that both ssh.service and ssh.socket are running:
root@/etc/netplan# systemctl status ssh.service
? ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; disabled; preset: enabled)
    Drop-In: /etc/systemd/system/ssh.service.d
             ??00-socket.conf
     Active: active (running) since Tue 2023-05-23 11:17:29 EDT; 36min ago
TriggeredBy: ? ssh.socket
       Docs: man:sshd(8)
             man:sshd_config(5)
    Process: 3698763 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
   Main PID: 3698765 (sshd)
      Tasks: 3 (limit: 38046)
     Memory: 3.6M
        CPU: 206ms
     CGroup: /system.slice/ssh.service
             ??3698765 "sshd: /usr/sbin/sshd -D [listener] 1 of 10-100 startups"
             ??3777496 "sshd: root [priv]"
             ??3777497 "sshd: root [net]"

May 23 11:51:44 alces sshd[3771657]: ...
Hint: Some lines were ellipsized, use -l to show in full.
root@/etc/netplan# systemctl status ssh.socket
? ssh.socket - OpenBSD Secure Shell server socket
     Loaded: loaded (/lib/systemd/system/ssh.socket; enabled; preset: enabled)
    Drop-In: /etc/systemd/system/ssh.socket.d
             ??listen.conf
     Active: active (running) since Mon 2023-05-15 09:23:44 EDT; 1 week 1 day ago
      Until: Mon 2023-05-15 09:23:44 EDT; 1 week 1 day ago
   Triggers: ? ssh.service
     Listen: [::]:22 (Stream)
             [::]:7022 (Stream)
      Tasks: 0 (limit: 38046)
     Memory: 8.0K
        CPU: 569us
     CGroup: /system.slice/ssh.socket

May 15 09:23:44 alces systemd[1]: ...
Hint: Some lines were ellipsized, use -l to show in full.

Finally, I found that /lib/systemd/system contains both ssh.service and ssh.socket configurations.
ssh.service:
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify

[Install]
WantedBy=multi-user.target
Alias=sshd.service

ssh.socket:
[Unit]
Description=OpenBSD Secure Shell server socket
Before=sockets.target
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Socket]
ListenStream=22
Accept=no

[Install]
WantedBy=sockets.target

Finally, in /etc/systemd/system there is an ssh.service.d directory that contains the 00-socket.conf file that contains:

[Unit]
After=ssh.socket
Requires=ssh.socket

This is very confusing. I could disable ssh.service, but I am concerned that if I do this I will lose ssh connectivity to my headless server. What is the way out of this morass? It would be VERY helpful if there was a comprehensive guide to the current ssh configuration that explains what services to run, how to configure those services, and where the configuration files should reside.

Tags: bot-comment

CVE References

Revision history for this message
Ubuntu Foundations Team Bug Bot (crichton) wrote :

Thank you for taking the time to report this bug and helping to make Ubuntu better. It seems that your bug report is not filed about a specific source package though, rather it is just filed against Ubuntu in general. It is important that bug reports be filed about source packages so that people interested in the package can find the bugs about it. You can find some hints about determining what package your bug might be about at https://wiki.ubuntu.com/Bugs/FindRightPackage. You might also ask for help in the #ubuntu-bugs irc channel on Libera.chat.

To change the source package that this bug is filed about visit https://bugs.launchpad.net/ubuntu/+bug/2020560/+editstatus and add the package name in the text box next to the word Package.

[This is an automated message. I apologize if it reached you inappropriately; please just reply to this message indicating so.]

tags: added: bot-comment
Revision history for this message
moose (moose-quadruped) wrote :

This is probably not a bug related to ssh but to the configuration changes introduced by Ubuntu.

affects: ubuntu → openssh (Ubuntu)
Revision history for this message
Nick Rosbrook (enr0n) wrote :

It is expected that you have both ssh.socket and ssh.service on your system. The ssh.socket unit is enabled by default and is responsible for listening on the configured port. Once it receives a connection it activates ssh.service (which is what actually spawns sshd).

As the comment in /etc/ssh/sshd_config explains, sshd_config(5) and contain additional documentation about how to configure a non-default port. It may help to read about systemd socket units as well [1].

From what I can tell, you have taken the correct steps to enable port 7022. I do not think there is a bug here, but please let me know if you think I am missing something.

[1] https://www.freedesktop.org/software/systemd/man/systemd.socket.html

Changed in openssh (Ubuntu):
status: New → Incomplete
Revision history for this message
moose (moose-quadruped) wrote :

Thank you for the prompt reply. If my configuration is correct, why is it that I cannot connect on port 7022? I don't see a listener for it, so I suspect my configuration in /etc/systemd/system/ssh.socket.d/listen.conf is either not being read or is being supplanted by the configuration in /lib/systemd/system/ssh.socket (which only specifies ListenStream=22).

Revision history for this message
moose (moose-quadruped) wrote :

Ok. The solution to this problem was to restart not ssh.service but ssh.socket. Thus:
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

I think the documentation, such as it is, should make this clear. Googling around gets you several hits that say you should sudo systemctl restart ssh (which is ssh.service) which is incorrect.

Revision history for this message
Nick Rosbrook (enr0n) wrote (last edit ):

According to your output from `systemctl status ssh.socket`, it is listening on both ports. But, to be sure, I tried this in a fresh 23.04 container:

root@lunar:~# systemctl edit ssh.socket # This opens a text editor to create /etc/systemd/system/ssh.socket.d/override.conf
root@lunar:~# cat /etc/systemd/system/ssh.socket.d/override.conf
[Socket]
ListenStream=7022
root@lunar:~# systemctl daemon-reload
root@lunar:~# systemctl restart ssh.socket
root@lunar:~# systemctl status ssh.socket
● ssh.socket - OpenBSD Secure Shell server socket
     Loaded: loaded (/lib/systemd/system/ssh.socket; enabled; preset: enabled)
    Drop-In: /etc/systemd/system/ssh.socket.d
             └─override.conf
     Active: active (listening) since Tue 2023-05-23 18:03:31 UTC; 3s ago
      Until: Tue 2023-05-23 18:03:31 UTC; 3s ago
   Triggers: ● ssh.service
     Listen: [::]:22 (Stream)
             [::]:7022 (Stream)
     CGroup: /system.slice/ssh.socket

May 23 18:03:31 lunar systemd[1]: Stopping ssh.socket - OpenBSD Secure Shell server socket...
May 23 18:03:31 lunar systemd[1]: Listening on ssh.socket - OpenBSD Secure Shell server socket.

Then, after copying my public key to the server, I was able to connect to the instance with:

$ ssh -p 7022 root@10.136.78.53

After that, the server shows:

root@lunar:~# lsof -i :7022
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 28u IPv6 5619190 0t0 TCP *:7022 (LISTEN)
sshd 1054 root 4u IPv6 5619190 0t0 TCP *:7022 (LISTEN)
sshd 1055 root 4u IPv6 5613043 0t0 TCP lunar.lxd:7022->_gateway.lxd:50488 (ESTABLISHED)

Also, configuration files in /etc/systemd/ override corresponding files in /lib/systemd/. See https://www.freedesktop.org/software/systemd/man/systemd.unit.html#System%20Unit%20Search%20Path.

Revision history for this message
moose (moose-quadruped) wrote :

As I noted above, the key was restarting ssh.socket, not ssh. Even though systemctl status ssh.socket reported (claimed) that the service was listening on both 22 and 7022, this didn't come into effect until I restarted ssh.socket. This last step was essential to getting this to work. Restarting ssh.socket did not appear in any of the documentation or Googling hits until I found this reference: https://www.flatcar.org/docs/latest/setup/security/customizing-sshd/

Revision history for this message
Colin Watson (cjwatson) wrote :

I adjusted our documentation for the next Debian upload (which will get merged into Ubuntu at some point and will close this bug then):

  https://salsa.debian.org/ssh-team/openssh/-/commit/a183f4934873b0dd663177e1772090d1d7a6a631

Changed in openssh (Ubuntu):
assignee: nobody → Colin Watson (cjwatson)
status: Incomplete → Fix Committed
Revision history for this message
Launchpad Janitor (janitor) wrote :
Download full text (5.1 KiB)

This bug was fixed in the package openssh - 1:9.3p1-1ubuntu1

---------------
openssh (1:9.3p1-1ubuntu1) mantic; urgency=medium

  * Merge with Debian unstable (LP: #2025664). Remaining changes:
    - debian/rules: modify dh_installsystemd invocations for
      socket-activated sshd
    - debian/openssh-server.postinst: handle migration of sshd_config options
      to systemd socket options on upgrade.
    - debian/README.Debian: document systemd socket activation.
    - debian/patches/socket-activation-documentation.patch: Document in
      sshd_config(5) that ListenAddress and Port no longer work.
    - debian/openssh-server.templates: include debconf prompt explaining
      when migration cannot happen due to multiple ListenAddress values
    - debian/.gitignore: drop file
    - debian/openssh-server.postrm: remove systemd drop-ins for
      socket-activated sshd on purge
    - debian/openssh-server.ucf-md5sum: update for Ubuntu delta
    - debian/openssh-server.tmpfile,debian/systemd/ssh.service: Move
      /run/sshd creation out of the systemd unit to a tmpfile config so
      that sshd can be run manually if necessary without having to create
      this directory by hand.
    - debian/patches/systemd-socket-activation.patch: Fix sshd
      re-execution behavior when socket activation is used
    - debian/tests/systemd-socket-activation: Add autopkgtest for systemd socket
      activation functionality.
    - d/p/test-set-UsePAM-no-on-some-tests.patch: set UsePAM=no for some tests
    - Ensure smooth upgrade path from versions affected by LP: #2020474:
      + debian/openssh-server.postint: do not try to restart systemd units,
        and instead indicate that a reboot is required
      + debian/tests/systemd-socket-activation: Reboot the testbed before starting the test
      + debian/rules: Do not stop ssh.socket on upgrade

openssh (1:9.3p1-1) unstable; urgency=medium

  * Debconf translations:
    - Romanian (thanks, Remus-Gabriel Chelu; closes: #1033178).
  * Properly fix date of 1:3.0.2p1-2 changelog entry (closes: #1034425).
  * New upstream release (https://www.openssh.com/releasenotes.html#9.3p1):
    - [CVE-2023-28531] ssh-add(1): when adding smartcard keys to
      ssh-agent(1) with the per-hop destination constraints (ssh-add -h ...)
      added in OpenSSH 8.9, a logic error prevented the constraints from
      being communicated to the agent. This resulted in the keys being added
      without constraints. The common cases of non-smartcard keys and keys
      without destination constraints are unaffected. This problem was
      reported by Luci Stanescu (closes: #1033166).
    - [SECURITY] ssh(1): Portable OpenSSH provides an implementation of the
      getrrsetbyname(3) function if the standard library does not provide
      it, for use by the VerifyHostKeyDNS feature. A specifically crafted
      DNS response could cause this function to perform an out-of-bounds
      read of adjacent stack data, but this condition does not appear to be
      exploitable beyond denial-of-service to the ssh(1) client.
    - ssh-keygen(1), ssh-keyscan(1): accept -Ohashalg=sha1|sha256 when
      outputting SSHFP fingerprints to allow algorit...

Read more...

Changed in openssh (Ubuntu):
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.