ESPO-01: sshd -t scheitert auf einer VM ohne bisherige SSH-Verbindung

Gemeldet von der ersten Pilotkunden-VM: "Missing privilege separation
directory: /run/sshd". Ubuntu 24.04 startet sshd ueber ssh.socket erst bei
der ersten Verbindung; /run/sshd legt systemd dabei an (RuntimeDirectory).
Auf einer frisch installierten VM, an der bisher nur die Hyper-V-Konsole
benutzt wurde, existiert das Verzeichnis deshalb nicht - und sshd -t bricht
ab, obwohl die Konfiguration einwandfrei ist. Auf der Test-VM fiel das nicht
auf, weil dort per SSH gearbeitet wurde.

Das Skript legt /run/sshd jetzt selbst an (0755, wie die Unit), laedt sshd
nur neu, wenn er ueberhaupt als Dienst laeuft, und gibt die wirksamen Werte
aus sshd -T aus. Sind sie nicht auslesbar, ist die Haertung unbewiesen und
der Lauf ein Fehler.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
gordon.zimm 2026-09-25 10:09:24 +02:00
parent 75de1540b1
commit 6623036011

View File

@ -9,7 +9,7 @@
set -u
# Standzeile: zeigt im Protokoll, welche Fassung tatsaechlich gelaufen ist.
echo "ESPO-01-Grundeinrichtung, Skriptstand 2026-09-24"
echo "ESPO-01-Grundeinrichtung, Skriptstand 2026-09-25"
KUERZEL_ROH="${1:-}"
FEHLER=0
@ -51,7 +51,28 @@ PermitRootLogin no
MaxAuthTries 3
LoginGraceTime 20
CONF
if sshd -t; then systemctl reload ssh && echo "SSH: PermitRootLogin no, MaxAuthTries 3"; else echo "FEHLER: sshd-Konfiguration ungueltig"; FEHLER=1; fi
# /run/sshd muss dafuer existieren: `sshd -t` bricht ohne das Verzeichnis ab
# ("Missing privilege separation directory"). Ubuntu 24.04 startet sshd ueber ssh.socket
# erst bei der ersten Verbindung, und erst dann legt systemd (RuntimeDirectory=sshd) es an.
# Auf einer VM, auf der bisher nur die Konsole benutzt wurde, fehlt es deshalb.
install -d -m 0755 /run/sshd
if sshd -t; then
# Laeuft sshd als Dienst, muss er die Aenderung nachlesen. Unter ssh.socket laeuft er nicht
# dauerhaft - dort liest jede neue Verbindung die Konfiguration ohnehin neu.
if systemctl is-active --quiet ssh; then
systemctl reload ssh || { echo "FEHLER: sshd laedt die Konfiguration nicht neu"; FEHLER=1; }
fi
# Nachweis statt Zusicherung: die Werte so ausgeben, wie sshd sie tatsaechlich anwendet.
# Laesst sich das nicht auslesen, ist die Haertung unbewiesen - dann ist der Lauf ein Fehler.
SSH_IST="$(sshd -T | grep -iE '^(permitrootlogin|maxauthtries|logingracetime) ')"
if [ -n "$SSH_IST" ]; then
echo "$SSH_IST" | sed 's/^/SSH: /'
else
echo "FEHLER: wirksame SSH-Werte nicht auslesbar"; FEHLER=1
fi
else
echo "FEHLER: sshd-Konfiguration ungueltig"; FEHLER=1
fi
# 5. Journal begrenzen, damit Logs das Wurzeldateisystem nicht fuellen koennen.
install -d -m 755 /etc/systemd/journald.conf.d