ADMIN

2023

05

2023-04-28T12:00:00

Lokale Netzwerke

PRAXIS

058

Open-Source-Tipp

OpenSSH

Dateiübertragung

OpenSSH-Sitzungen automatisch beenden

Die Uhr läuft

von Thorsten Scherf

Veröffentlicht in Ausgabe 05/2023 - PRAXIS

Eine gängige Compliance-Anforderung lautet, offene Benutzersitzungen nach einer bestimmten Zeit der Inaktivität zu trennen. Aktuelle OpenSSH-Versionen bringen jedoch eine Änderung mit, die einen hierfür genutzten Workaround blockieren. Glücklicherweise kommt Systemd-logind zur Hilfe. Wir zeigen in diesem Open-Source-Tipp, wie Sie den Systemdienst dazu nutzen, offene OpenSSH-Sitzungen zu beenden.

Um bestimmten Compliance-Anforderungen gerecht zu werden, sind bei der Konfiguration eines Systems eine Vielzahl unterschiedlicher Einstellungen notwendig. Common Criteria [1] ist ein internationaler Standard für die Sicherheitszertifizierung von Rechnersystemen. Der Standard definiert bestimmte Anforderungen in sogenannten Security Targets.
Je nach eingesetztem System sind diese jedoch unterschiedlich ausgelegt, da die Anforderungen für ein Mobilfunkgerät beispielsweise anders aussehen als für ein Desktopsystem. Daher existieren unterschiedliche Protection Profiles, um die unterschiedlichen Aspekte abzubilden. Im Protection Profile für General Purpose Operating Systems [2] ist klar definiert, dass Benutzersessions nach einer bestimmen Zeit der Inaktivität entweder zu beenden oder alternativ zu sperren sind.
Compliance ausgehebelt
Auch die Security Technical Implementation Guides (STIGs) [3] der Defense Information Systems Agengy (DISA) beinhalten diese Anforderungen für Betriebssysteme. Im Guide für Red Hat Enterprise Linux 8 [4] wird vorgeschlagen, diese Regeln mit bestimmten Konfigurationen des OpenSSH-Diensts umzusetzen. Die beiden Anweisungen "ClientAliveInterval" und "ClientAliveCountMax" sollen dabei helfen, den Compliance-Maßgaben gerecht zu werden:
Um bestimmten Compliance-Anforderungen gerecht zu werden, sind bei der Konfiguration eines Systems eine Vielzahl unterschiedlicher Einstellungen notwendig. Common Criteria [1] ist ein internationaler Standard für die Sicherheitszertifizierung von Rechnersystemen. Der Standard definiert bestimmte Anforderungen in sogenannten Security Targets.
Je nach eingesetztem System sind diese jedoch unterschiedlich ausgelegt, da die Anforderungen für ein Mobilfunkgerät beispielsweise anders aussehen als für ein Desktopsystem. Daher existieren unterschiedliche Protection Profiles, um die unterschiedlichen Aspekte abzubilden. Im Protection Profile für General Purpose Operating Systems [2] ist klar definiert, dass Benutzersessions nach einer bestimmen Zeit der Inaktivität entweder zu beenden oder alternativ zu sperren sind.
Compliance ausgehebelt
Auch die Security Technical Implementation Guides (STIGs) [3] der Defense Information Systems Agengy (DISA) beinhalten diese Anforderungen für Betriebssysteme. Im Guide für Red Hat Enterprise Linux 8 [4] wird vorgeschlagen, diese Regeln mit bestimmten Konfigurationen des OpenSSH-Diensts umzusetzen. Die beiden Anweisungen "ClientAliveInterval" und "ClientAliveCountMax" sollen dabei helfen, den Compliance-Maßgaben gerecht zu werden:
grep -i clientalive /etc/ssh/sshd_config
ClientAliveInterval 600
ClientAliveCountMax 0
Haben Sie diese Änderungen an Ihrer OpenSSH Konfiguration vorgenommen, wird nach zehn Minuten Inaktivität eine SSH-Verbindung zu diesem System getrennt, genau wie es die Anforderungen laut Common Criteria und dem Security Technical Implementation Guide der DISA verlangen.
Das Problem ist jedoch, dass diese beiden Optionen eigentlich einen ganz anderen Sinn hatten und eher zum Überprüfen der SSH-Verbindung selbst, nicht jedoch für die Aktivität der Benutzersession gedacht waren. Nur durch das Setzen der Option "ClientAliveCountMax=0" in Kombination mit einem beliebigen Wert für "ClientAliveInterval" konnte hiermit die Session auch bei Inaktivität eines Benutzers beendet werden – selbst wenn die Verbindung an sich intakt war. Dies ist aber lediglich ein Seiteneffekt und war so niemals gedacht.
Dieses Fehlverhalten der Software wurde in der OpenSSH-Upstream-Version 8.2 bereits Ende 2020 behoben [5]. Dadurch besteht nun jedoch keine Möglichkeit mehr, eine SSH-Verbindung bei Inaktivität eines Benutzers zu beenden. Dies ist gerade in Umgebungen, in denen die Systeme zwingend gewissen Compliance-Anforderungen entsprechen müssen, sehr ärgerlich.
In der OpenSSH-Upstream-Community gibt es zwar seit langer Zeit Feature Requests [6,7], um doch eine Konfigurationsoption für den SSH-Server zu implementieren, mit deren Hilfe sich inaktive Sitzungen beenden lassen. Diese Anfragen wurden jedoch bislang immer abgelehnt. Dies unter anderem auch mit der Begründung, dass die meisten Shells die Umgebungsvariable "TIMOUT" unterstützen, mit der Sie ein Timeout für Benutzereingaben setzen können. Dieser Ansatz hat allerdings eine Vielzahl an Nachteilen und lässt sich leicht umgehen. Details hierzu finden Sie in einem Stackoverflow-Artikel [8].
Systemd-logind eilt zu Hilfe
Nachdem die Upstream-Änderungen langsam Einzug in die diversen Linux-Distributionen gehalten haben, war der Aufschrei der Benutzer natürlich groß. Schließlich kommen manche Linux-Distributionen wie beispielsweise Red Hat Enterprise Linux oder der SUSE Linux Enterprise Server bei vielen Firmen in Compliance-kritischen Umgebungen zum Einsatz. Da die OpenSSH-Upstream-Community nicht wirklich bereit ist, sich dem Problem anzunehmen, wurde insofern nach alternativen Lösungswegen gesucht. Das nun vorliegende Ergebnis ist eigentlich sehr naheliegend und basiert auf dem Service "systemd-logind" [9].
Dieser Service ist explizit zur Überwachung von Benutzern und deren Sessions entwickelt worden und kann ebenfalls auch den Idle-Zustand von Benutzer­sitzungen erkennen. Möglich wird dies durch den Einsatz eines eigenen PAM-Moduls "pam_systemd" [10], das sich darum kümmert, die Session eines Benutzers nach dem Login beim systemd-logind-Service zu registrieren, um somit eine eigene systemd-Slice-Unit für jeden neuen Benutzer und jeweils eine Scope-Unit für parallel laufende Sessions des selben Benutzers zu erzeugen.
Ende 2022 wurde der systemd-logind-Service durch einen Patch erweitert [11]. Hiermit können Sie dem Dienst nun die neue Konfigurationsoption "StopIdleSessionSec" mit übergeben. Diese sorgt dafür, dass die Session eines Benutzers endet, sobald systemd-logind erkennt, dass die Sitzung länger inaktiv ist als erlaubt. Möchten Sie also beispielsweise, dass inaktive Benutzersessions automatisch nach zehn Minuten ablaufen, verwenden Sie für die neue Option den Wert 600:
# grep StopIdleSessionSec /etc/systemd/logind.conf
StopIdleSessionSec=600
Nach diesen Änderungen vergessen Sie nicht, den Service neu zu starten mit
# systemctl restart systemd-logind
Zu Testzwecken haben wir den Wert einmal auf zehn Sekunden eingestellt und einen neuen SSH-Login auf dieses System durchgeführt. Im System-Journal ist mittels journctl -u systemd-logind nun zu erkennen, wie die inaktive Session des Benutzers nach zehn Sekunden automatisch beendet wird (siehe Listing-Kasten).
Listing: Beendete Sitzung
Mar 7 05:06:07 kvm-04-guest19 systemd-logind[46596]: New session 5 of user root. Mar 7 05:06:17 kvm-04-guest19 systemd[1]: session-5.scope: Killing process 46282 (sshd) with signal SIGTERM. Mar 7 05:06:17 kvm-04-guest19 systemd[1]: session-5.scope: Killing process 46285 (sshd) with signal SIGTERM. Mar 7 05:06:17 kvm-04-guest19 systemd[1]: session-5.scope: Killing process 46286 (bash) with signal SIGTERM. Mar 7 05:06:17 kvm-04-guest19 systemd[1]: Stopping Session 5 of user root. Mar 7 05:06:17 kvm-04-guest19 systemd[1]: session-5.scope: Succeeded. Mar 7 05:06:17 kvm-04-guest19 systemd[1]: Stopped Session 5 of user root. Mar 7 05:06:17 kvm-04-guest19 systemd-logind[46596]: Removed session 5.
Fazit
Gängige Compliance-Anforderungen sehen vor, dass inaktive Benutzersessions entweder zu beenden oder alternativ zu sperren sind. Bis vor kurzem konnten hierfür Konfigurationsoptionen des OpenSSH-Dienstes verwendet werden. Dieses Verhalten wurde in aktuellen Versionen der Software jedoch bewusst geändert, ohne alternative Optionen zum Beenden inaktiver SSH-Verbindungen zur Verfügung zu stellen. Um das Manko zu beheben, hat der systemd-Service "systemd-logind" die fehlende Funktion spendiert bekommen. Dadurch teilen Sie diesem Dienst nun mit, nach welcher Zeit inaktive Benutzersessions automatisch zu beenden sind.
(dr)
Link-Codes
[2] Protection Profile for General Purpose Operating Systems: https://www.niap-ccevs.org/MMO/PP/-442-/#FMT_SMF_EXT.1.1