ADMIN

2024

08

2024-07-30T12:00:00

Helpdesk und Support

PRAXIS

056

Open-Source-Tipp

Logdateien

sudo

Neues sudo-Logformat

Handlich verpackt

von Thorsten Scherf

Veröffentlicht in Ausgabe 08/2024 - PRAXIS

Das Tool sudo führt in der aktuellen Version ein neues Format für das Logging von Meldungen ein. Das verbessert die Interoperabilität mit anderen Log-Managementtools, da Logdateien nun unterschiedliche JSON-Formate verwenden können. Der Open-Source-Tipp zeigt anhand eines Beispiels, wie syslog-ng das neue Logging-Format zur Weiterverarbeitung der sudo-Meldungen einsetzt.

Mithilfe von sudo erlauben Linux-Administratoren Anwendern das Ausführen von bestimmten Programmen unter dem Kontext eines anderen Benutzers, zumeist root. Somit sind auch nicht-privilegierte User in der Lage, administrative Programme auf einem System auszuführen. Um nachverfolgen zu können, welche Benutzer sudo zur Ausführung von Programmen verwendet haben, führt das Tool ein Log.
sudo-Logging
Standardmäßig versendet sudo sämtliche Logmeldungen mithilfe von syslog. Auf einem Linux-System landen diese somit im System-Journal. Als Logformat stehen json und sudo zur Auswahl. Letzteres ist die Standardeinstellung und sorgt dafür, dass die Meldungen einfach zu lesen sind und lediglich wenige Informationen im Log landen (Bild 1).
Bild 1: sudo verwendet standardmäßig ein einfach zu lesendes Logformat für sämtliche Meldungen, die via syslog versendet werden.
Wer mehr Infos zu einem sudo-Logevent haben möchte, kann das Format der Logmeldung auf json ändern. Hierdurch stehen mehrere Datenfelder im Journal zur Verfügung (Bild 2). Genauere Informationen zu den einzelnen Feldern des Logformats finden Sie in der Hilfeseite zu sudoers: man 5 sudoers.
Mithilfe von sudo erlauben Linux-Administratoren Anwendern das Ausführen von bestimmten Programmen unter dem Kontext eines anderen Benutzers, zumeist root. Somit sind auch nicht-privilegierte User in der Lage, administrative Programme auf einem System auszuführen. Um nachverfolgen zu können, welche Benutzer sudo zur Ausführung von Programmen verwendet haben, führt das Tool ein Log.
sudo-Logging
Standardmäßig versendet sudo sämtliche Logmeldungen mithilfe von syslog. Auf einem Linux-System landen diese somit im System-Journal. Als Logformat stehen json und sudo zur Auswahl. Letzteres ist die Standardeinstellung und sorgt dafür, dass die Meldungen einfach zu lesen sind und lediglich wenige Informationen im Log landen (Bild 1).
Bild 1: sudo verwendet standardmäßig ein einfach zu lesendes Logformat für sämtliche Meldungen, die via syslog versendet werden.
Wer mehr Infos zu einem sudo-Logevent haben möchte, kann das Format der Logmeldung auf json ändern. Hierdurch stehen mehrere Datenfelder im Journal zur Verfügung (Bild 2). Genauere Informationen zu den einzelnen Feldern des Logformats finden Sie in der Hilfeseite zu sudoers: man 5 sudoers.
Bild 2: Alternativ kann sudo Logmeldungen im json-Format via syslog versenden.
Kindprozesse erfassen
Seit Version 1.9.8 bietet sudo die Möglichkeit, auch Kindprozesse der mit sudo gestarteten Anwendung zu protokollieren [1]. Wenn Sie beispielsweise einem Benutzer das Recht geben, einen Editor mittels sudo zu starten, würden Sie normalerweise nur den Aufruf des Editor-Kommandos in der Logdatei sehen. Ruft der Benutzer aber aus dem Editor andere Kommandos auf, tauchen diese nicht in den Logs auf. Dies ist besonders in Fällen interessant, in denen Sie einem Benutzer vielleicht sogar das Recht geben, mittels sudo eine neue Shell zu starten, um so einen kompletten Root-Zugriff auf das System zu bekommen. In den Logs sehen Sie dann wieder nur den Aufruf der Shell, nicht aber welche Tools innerhalb der Shell-Sitzung gestartet wurden.
Um nun sämtliche Kommandos einer sudo-Session zu loggen, können Sie die Option "log_subcmds" innerhalb der sudoers-Datei verwenden. Dies sorgt allerdings auch dafür, dass sehr viele Logmeldungen in das Journal gelangen. Diese lassen sich manuell fast gar nicht mehr analysieren und im Zweifelsfall entgehen Ihnen hilfreiche Informationen, um bestimmte Aktionen auf einem System nachzuverfolgen.
Zentrales Protokoll
Um dieses Problem zu lösen, bietet es sich an, sämtliche Logmeldungen der einzelnen Rechner auf einem zentralen System zu sammeln, um diese dann dort mit einer beliebigen Logmanagement-Software, wie beispielsweise Elasticsearch, zu verwalten und analysieren. Glücklicherweise erlaubt sudo ein Logging nicht nur via syslog, sondern kann stattdessen die Logmeldungen auch in einer regulären Datei ablegen. Als Format verwenden Sie dann das maschinenlesbare json, um die sudo-Meldungen automatisiert zu verarbeiten.
Nun ist es allerdings so, dass sudo bisher ein menschenlesbares json-Format verwendet hat, wenn das Tool Meldungen in eine Datei schreibt (Listing 1). Dieses ist sehr angenehm zu lesen, da die Datenfelder einer Logmeldung jeweils über mehrere Zeilen gehen und Sie somit sehr leicht die gewünschte Information finden. Besser wäre es allerdings, wenn sudo das gleiche kompakte JSON-Format verwenden würde, das auch zum Einsatz kommt, wenn Sie die Meldungen mittels syslog an das lokale Journal versenden. Dies spart nicht nur Platz, sondern erleichtert auch die maschinelle Verarbeitung der Logdateien.
Listing 1: JSON-Format von sudo
{
      "accept": {
           "server_time": {
                "seconds": 1716370731,
                "nanoseconds": 137298080,
                "iso8601": "20240522093851Z",
                "localtime": "May 22 09:38:51"
          },
[...]
}
Kompaktes JSON für Logdateien
Und genau dies ist mit der aktuellen sudo-Version 1.9.16 möglich. Mit ihr stehen neben dem Logformat sudo die beiden neuen Formate json_pretty und json_compact zur Verfügung. Während json_pretty identisch mit dem alten Format json ist, sorgt json_compact dafür, dass die Logmeldungen im JSON-Format in einer einzelnen Zeile dargestellt werden, ähnlich also wie beim Logging über syslog. Diese können Sie dann entweder lokal mit einem JSON-Parser, wie beispielsweise jq, weiterverarbeiten oder zur weiteren Analyse an eine zentrale Logging-Instanz senden.
Im folgenden Beispiel möchten wir sämtliche Logs nun von einer lokalen syslog-ng-Instanz auswerten. Alternativ können Sie die Logs von dort natürlich auch an eine andere Software oder einen zentralen Logserver senden. Das Beispiel soll lediglich die Möglichkeiten des neuen Log-Formats verdeutlichen. Um die sudo-Konfiguration anzupassen, rufen Sie klassischerweise das Tool visudo auf, das Ihnen einen exklusiven Lock auf die Datei verschafft. Damit verhindern Sie, dass eventuell parallel stattfindende Änderungen an der Datei Ihre Einstellungen wieder überschreiben. Alternativ können Sie für eigene Anpassungen auch eine neue Datei unterhalb des Ordners "/etc/sudoers.d/" anlegen. Um diese zu editieren, rufen Sie visudo einfach mit der Option "-f", gefolgt vom Dateinamen, auf:
# visudo -f /etc/sudoers.d/logging
In der Datei legen Sie nun fest, dass sudo Logmeldungen lediglich in ein Textfile schreibt und diese nicht auch noch via syslog an das lokale Journal sendet. Als Format verwenden Sie nun das neue json_compact. Zusätzlich möchten Sie den Aufruf sämtlicher Kindprozesse der erlaubten sudo-Kommandos loggen:
Defaults !syslog
Defaults logfile=/var/log/sudo
Defaults log_format=json_compact
Defaults log_subcmds
Listing 2 zeigt eine einfache syslog-ng-Konfigurationsdatei, die sich den Support von syslog-ng zunutze macht, um die JSON-formatierte Logdatei "/var/log/sudo" auszuwerten und die Logs in ein anderes Format umzuwandeln, um daraus dann die neue Logdatei "/var/log/sudo-text" zu erzeugen. Das Ergebnis sieht wie folgt aus:
May 22 09:38:51 user tscherf ran /usr/bin/vim on host master.ipa.test using sudo
May 22 09:38:52 user tscherf ran /usr/bin/who on host master.ipa.test using sudo
Natürlich können Sie die JSON-formatierte Logdatei auch einfach an eine andere Logging-Instanz senden, um die Logs dort zu analysieren. Die syslog-ng-Webseite hält hierfür einige Beispiele bereit [2].
Listing 2: /etc/syslog-ng/conf.d/sudo.conf
# cat sudo.conf
source s_sudojson {
   file("/var/log/sudo" flags(no-parse));
};
parser p_json {
     json-parser();
};
destination d_sudo-welf {
   file("/var/log/sudo"
     template("$(format-welf --scope nv_pairs --exclude MESSAGE --exclude accept.submitenv)\n\n")
   );
   file("/var/log/sudo-text"
     template("${DATE} user ${accept.submituser} ran ${accept.command} on host ${HOST} using sudo\n")
   );
};
log {
   source(s_sudojson);
   parser(p_json);
   destination(d_sudo);
};
Fazit
Mithilfe des neuen sudo-Logformats json_compact erzeugen Sie ganz einfach maschinenlesbare sudo-Logdateien, die Sie dann zur weiteren Analyse an ein Logmanagement-System senden können. Wer die Meldungen stattdessen lieber manuell durchforsten möchte, greift entweder auf das Format sudo oder, um mehr Informationen zu erhalten, auf json_pretty zurück.
(dr)
Link-Codes