ADMIN

2021

02

2021-02-01T12:00:00

Sichere Virtualisierung

PRAXIS

054

Open-Source-Tipp

sudo-Logs zentral ablegen

Sammelstelle

von Thorsten Scherf

Veröffentlicht in Ausgabe 02/2021 - PRAXIS

Zur Administration von Linux-Systemen kommt gerne das Tool sudo zum Einsatz. In der aktuellen Version 1.9 wurden einige neue Features eingebaut. So ist es nun beispielsweise möglich, die sudo-Logs sowohl lokal als auch auf einem entfernten Rechner abzuspeichern. Der Open-Source-Tipp in diesem Monat zeigt, welche Konfigurationsschritte hierfür notwendig sind.

Das Tool sudo erlaubt das Ausführen von Programmen unter einer beliebigen Identität, solange dies zuvor explizit erlaubt wurde. Administratoren können somit die Kontrolle über bestimmte Bereiche des Systems an andere Benutzer abgeben. Beispielsweise könnten Sie jemandem das Recht zuweisen, Benutzer auf einem System anzulegen, zu löschen oder zu modifizieren. Mithilfe von visudo fügen Sie hierfür die Anweisung "<foobar> ALL=(ALL) /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod" in die sudo-Konfigurationsdatei "/etc/sudoers" ein.
Möchte der Benutzer "<foobar>" nun eines dieser administrativen Kommandos ausführen, stellt er einfach das Kommando sudo vor das auszuführende Programm. Für Neueinsteiger in die Welt von sudo empfiehlt sich ein Blick in die Hilfeseiten der Konfigurationsdatei "/etc/sudoers (man sudoers)", um einen Überblick zu bekommen, wie die sudo-Konfiguration im Detail aussehen kann.
I/O-Logging mit sudo
An dieser Stelle soll es nun darum gehen, wie Sie ein spezielles Feature von sudo nutzen. Die Rede ist vom I/O-Logging. Hiermit können Sie sudo anweisen, jedes Kommando innerhalb eines Pseudo-Terminals auszuführen, um sämtliche Ein- und Ausgaben zu loggen. Diese Funktion ist sehr hilfreich, wenn Sie auf Basis von bestimmten Compliance-Anforderungen einen Audit-Trail für einen Benutzer anlegen wollen. Bisher konnte sudo die so erzeugten Logdateien lediglich lokal ablegen. Seit der Version 1.9 besteht nun aber auch die Möglichkeit, diese auf einem entfernten Rechner zu speichern.
Das Tool sudo erlaubt das Ausführen von Programmen unter einer beliebigen Identität, solange dies zuvor explizit erlaubt wurde. Administratoren können somit die Kontrolle über bestimmte Bereiche des Systems an andere Benutzer abgeben. Beispielsweise könnten Sie jemandem das Recht zuweisen, Benutzer auf einem System anzulegen, zu löschen oder zu modifizieren. Mithilfe von visudo fügen Sie hierfür die Anweisung "<foobar> ALL=(ALL) /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod" in die sudo-Konfigurationsdatei "/etc/sudoers" ein.
Möchte der Benutzer "<foobar>" nun eines dieser administrativen Kommandos ausführen, stellt er einfach das Kommando sudo vor das auszuführende Programm. Für Neueinsteiger in die Welt von sudo empfiehlt sich ein Blick in die Hilfeseiten der Konfigurationsdatei "/etc/sudoers (man sudoers)", um einen Überblick zu bekommen, wie die sudo-Konfiguration im Detail aussehen kann.
I/O-Logging mit sudo
An dieser Stelle soll es nun darum gehen, wie Sie ein spezielles Feature von sudo nutzen. Die Rede ist vom I/O-Logging. Hiermit können Sie sudo anweisen, jedes Kommando innerhalb eines Pseudo-Terminals auszuführen, um sämtliche Ein- und Ausgaben zu loggen. Diese Funktion ist sehr hilfreich, wenn Sie auf Basis von bestimmten Compliance-Anforderungen einen Audit-Trail für einen Benutzer anlegen wollen. Bisher konnte sudo die so erzeugten Logdateien lediglich lokal ablegen. Seit der Version 1.9 besteht nun aber auch die Möglichkeit, diese auf einem entfernten Rechner zu speichern.
Das lokale Logging sämtlicher Ein- und Ausgaben einer Benutzer-Session aktivieren Sie mit visudo, indem Sie die bestehende Konfiguration um die Anweisung "Defaults log_output" erweitern. Verwendet ein Benutzer nun das sudo-Kommando, wird für jede Session ein neues Log im Verzeichnis "/var/log/sudo-io" erzeugt. Möchten Sie die Logs lieber in einem anderen Ordner abspeichern, können Sie den Ordner mithilfe der Konfigurationsoption" iolog_dir" innerhalb der sudoers-Datei bestimmen. Die Logs enthalten neben den eigentlichen Nutzdaten auch Timestamps, um eine Session in Echtzeit wiedergeben zu können. Eine Übersicht der von sudo erzeugten Log-Sessions zeigt Ihnen sudoreplay -l an. Jede Session ist mit einer eindeutigen ID gekennzeichnet (TSID), die sich zum Abspielen einer Session an sudoreplay übergeben lässt:
sudoreplay 000001
Das Tool zeigt Ihnen nun die komplette sudo-Session in der Originalgeschwindigkeit an. Mit den Optionen "-s" und "-m" können Sie allerdings die Ablaufgeschwindigkeit beziehungsweise die maximal zulässige Länge einer Pause, die zwischen der Ausführung von zwei Kommandos liegt, festlegen.
sudo sendet Loggingdaten über das Netzwerk
Zu beachten ist an dieser Stelle jedoch, dass die von sudo erzeugten Logdateien immer lokal gespeichert werden. Nun sehen aber nicht wenige Compliance-Anforderungen das Speichern von Logdateien an einem zentralen Ort vor, sodass eine Modifikation der Logs auch nach einem erfolgreichen Angriff nicht mehr möglich ist. Auch aus rein praktischen Gründen ergibt es Sinn, die Logs auf einem zentralen und besonders gesicherten Server zu speichern.
Klassische Loggingdienste wie beispielsweise syslogd oder journald bieten eine solche Funktion an, aber auch das Tool sudo unterstützt das Remote-Logging seit Version 1.9 [1]. Damit das Ablegen der Logs auf einem entfernten Rechner funktioniert, ist nun der Dienst "sudo_logsrvd" Teil des sudo-Sourcecodes [2]. Der Server nimmt auf einem Netzwerkport die sudo-Logs von Clientsystemen entgegen. Standardmäßig lauscht der Dienst auf dem TCP-Port 30343. Für verschlüsselten Datenverkehr kommt der TCP-Port 30344 zum Einsatz.
Zertifikate zur sicheren Kommunikation
Zu Testzwecken ist das Übertragen der sudo-Logs im Klartext vertretbar, für den produktiven Einsatz ist allerdings die verschlüsselte Übertragung der Daten unabdingbar. Hierfür benötigt der Server ein eigenes X.509-Zertifikat. Dieses müssen Sie mit dem dazugehörigen privaten Schlüssel und dem Zertifikat der Zertifizierungsstelle, die das Zertifikat für "sudo_logsrvd" ausgestellt hat, in der Konfigurationsdatei "/etc/sudo_logsrvd.conf" hinterlegen. Listing 1 zeigt eine beispielhafte TLS-Konfiguration.
Listing: /etc/sudo_logsrvd.conf
tls = true listen_address = *:30344(tls) tls_cacert = /etc/pki/tls/cert.pem tls_cert = /etc/pki/tls/certs/logsrvd-cert.pem tls_key = /etc/pki/tls/certs/private/logsrvd-key.pem
Die Hilfeseite man sudo_logsrvd enthält einige Hinweise, wie Sie mithilfe einer OpenSSL-basierten CA zu Testzwecken ein selbstsigniertes X.509-Zertifikat erzeugen können. Für ernsthafte Versuche sollten Sie aber natürlich ein Zertifikat von einer Zertifizierungsstelle ausstellen lassen, die auf Ihren Systemen bereits als vertrauenswürdig gilt. Wird das Zertifikat von einer anderen Stelle ausgegeben, müssen Sie es zuerst im Zertifikatsspeicher all Ihrer Systeme hinterlegen, da sich das Zertifikat sonst nicht erfolgreich verifizieren lässt und somit eine Übertragung der sudo-Logdaten fehlschlägt.
Nach dem Einbinden des Zertifikats können Sie sudo_logsrvd schließlich starten. Die bereits fertig kompilierten Pakete auf der sudo-Webseite [3] verfügen sowohl über ein systemd- als auch ein System-V-Init-Skript. Setzen Sie die sudo-Pakete aus dem Repository Ihrer Linux-Distribution ein, kann es sein, dass die Pakete teilweise etwas veraltet sind und noch kein Init-Skript anbieten. Wir haben Fedora 33 zusammen mit den folgenden Paketen verwendet:
rpm -qa sudo*
 
sudo-1.9.2-1.fc33.x86_64
sudo-logsrvd-1.9.2-1.fc33.x86_64
Das Paket sudo-logsrvd enthält jedoch noch kein Init-Skript, sodass Sie den Service manuell durch den Aufruf von sudo_logsrvd starten müssen. Der Prozess wandert dabei direkt in den Hintergrund, um die Shell nicht zu blockieren. Wer dies nicht möchte, der verwendet beim Starten des Services einfach die Option "-n", die den Dienst im Vordergrund laufen lässt. Um zu verifizieren, dass sudo-logsrvd erfolgreich gestartet wurde, können Sie netstat aufrufen:
netstat -tlpn|grep sudo_logsrvd
Clientkonfiguration zur sicheren Datenübertragung
Damit der Client weiß, an welches System er die sudo-Logs senden soll, fügen Sie mittels visudo in der sudoers-Datei die folgenden Anweisungen hinzu:
Defaults log_servers=<IP-Adresse>:30344(tls)
Defaults log_server_cabundle=/etc/pki/tls/cert.pem
Die Anweisung "<IP-Adresse>" ersetzen Sie dabei natürlich mit der IP-Adresse des Systems, auf dem Sie soeben den sudo_logsrvd-Dienst eingerichtet haben. Von nun an landen die sudo-Session-Logs des Clients auf dem zentralen Loggingsystem. Ein Aufruf von sudoreplay -l sollte dies bestätigen.
Fazit
Mit der neuen Version 1.9 unterstützt sudo nun auch das Speichern von I/O-Logs auf entfernten Systemen. Hierfür existiert mit sudo_logsrvd ein neuer Service, der mit Clients auch über einen sicheren TLS-Kanal kommunizieren kann. Zur Strukturierung der zu übertragenden Daten setzt sudo dabei auf Googles Protocol Buffer Language [4].
(jm)
Link-Codes
[1] Neuerungen in sudo Version 1.9.0: https://www.sudo.ws/stable.html#1.9.0/