Ssh en CoreOS Container Linux via systemd

De estas cosas que me habia acostumbrado a que funcionaran de una forma y de repente cambian.

CoreOS descansa en gran manera en systemd y sin embargo sshd esta deshabilitado al inicio y detenido.

systemctl status sshd
sshd.service - OpenSSH server daemon
Loaded: loaded (/usr/lib/systemd/system/sshd.service; disabled; vendor preset: disabled)
Active: inactive (dead)

¿como puede ser que pueda acceder por ssh?

Para ellos debemos mirar la unit de tipo socket sshd.socket. Si miramos en /usr/lib/systemd/system/sshd.socket vemos que contiene una linea con WantedBy=sockets.target

Segun leo en https://www.freedesktop.org/software/systemd/man/systemd.special.html sockets.target es un target destinado para sockets que quieres que se creen al inicio.

Lo curioso es que para que sshd.socket pertenezca a ese target no es necesario hacerle un systemctl enable sshd.socket. El mismo WantedBy=sockets.target lo incluye. Es decir, existe el fichero /usr/lib/systemd/system/sockets.target.wants/sshd.socket

En https://www.freedesktop.org/software/systemd/man/systemd.unit.html podemos leer mas sobre WantedBy.

De hecho el sshd.socket como tal esta deshabilitado. Es el sockets.target quien lo inicia.

sshd.socket - OpenSSH Server Socket
Loaded: loaded (/usr/lib/systemd/system/sshd.socket; disabled; vendor preset: disabled)

Bien, ahora veremos que hace ese socket. En su configuracion (/usr/lib/systemd/system/sshd.socket) vemos una linea Accept=yes

Esta linea hace que si está en "Yes" al recibir peticiones el socket levantara lo definido en un template denominado sshd@.service.
Si la cambiamo a "No", levantara lo definido en sshd.service.

Esto podemos verlo mas explicado en https://www.freedesktop.org/software/systemd/man/systemd.socket

En CoreOS Container Linux la linea está a "Yes", lo que hace que el sshd al que accedemos por defecto no es el clasico sshd.service, sino un socket activado via sockets.target y que levanta lo definido en el template sshd@.service. Curioso.

systemctl cat sshd@.service
# /usr/lib64/systemd/system/sshd@.service
[Unit]
Description=OpenSSH per-connection server daemon
After=syslog.target auditd.service

[Service]
ExecStart=-/usr/sbin/sshd -i -e
StandardInput=socket
StandardError=syslog

# /usr/lib64/systemd/system/sshd@.service.d/sshd-keygen.conf
[Unit]
Wants=sshd-keygen.service
After=sshd-keygen.service