Analysieren von Linux-Protokollen

In Ihren Linux-Protokollen sind viele Informationen gespeichert, aber die Herausforderung besteht darin, zu wissen, wie man sie extrahiert. Es gibt eine Reihe von Tools, die Sie dazu verwenden können, von Befehlszeilen-Tools bis hin zu fortschrittlicheren Analyse-Tools, die in der Lage sind, nach bestimmten Feldern zu suchen, Zusammenfassungen zu berechnen, Diagramme zu erstellen und vieles mehr.

In diesem Abschnitt zeigen wir Ihnen, wie Sie einige dieser Tools verwenden können und wie Log-Management-Lösungen wie SolarWinds® Loggly® dabei helfen können, den Log-Analyseprozess zu automatisieren und zu rationalisieren.

Suchen mit Grep

Eine der einfachsten Möglichkeiten, Logs zu analysieren, ist das Durchführen von reinen Textsuchen mit grep. grep ist ein Befehlszeilen-Tool, das nach übereinstimmendem Text in einer Datei oder in der Ausgabe anderer Befehle suchen kann. Es ist standardmäßig in den meisten Linux-Distributionen enthalten und steht auch für Windows und Mac zur Verfügung.

Um eine einfache Suche durchzuführen, geben Sie Ihre Suchzeichenfolge gefolgt von der Datei ein, die Sie durchsuchen möchten. Hier suchen wir im Authentifizierungsprotokoll nach Zeilen, die „user hoover“ enthalten.

$ grep "user hoover" /var/log/auth.logpam_unix(sshd:session): session opened for user hoover by (uid=0)pam_unix(sshd:session): session closed for user hoover

Beachten Sie, dass dies Zeilen zurückgibt, die die genaue Übereinstimmung enthalten. Das macht es nützlich für Suchen, bei denen Sie genau wissen, wonach Sie suchen.

Reguläre Ausdrücke

Ein regulärer Ausdruck (oder Regex) ist eine Syntax zum Auffinden bestimmter Textmuster in einer Datei. Reguläre Ausdrücke sind viel flexibler als reine Textsuchen, da sie eine Reihe von Techniken jenseits der einfachen Zeichenkettenübereinstimmung zulassen. Sie ermöglichen ein hohes Maß an Kontrolle, aber das Konstruieren eines genauen Musters kann schwierig sein.

Angenommen, wir wollen Authentifizierungsversuche auf Port 4792 finden. Eine einfache Suche nach „4792“ würde auf den Port passen, aber sie könnte auch auf einen Zeitstempel, eine URL oder eine andere Zahl passen. In diesem Fall wurde ein Apache-Protokoll gefunden, das zufällig 4792 in der URL enthielt.

$ grep "4792" /var/log/auth.logAccepted password for hoover from 10.0.2.2 port 4792 ssh274.91.21.46 - - "GET /scripts/samples/search?q=4792HTTP/1.1" 404 545 "-" "-”

Um dies zu verhindern, könnten wir eine Regex verwenden, die nur Instanzen von 4792 mit vorangestelltem „port“ und einem Leerzeichen zurückgibt. Wir tun dies mit einer Technik, die als positives Lookbehind bekannt ist. Unser Ausdruck sieht wie folgt aus (das -P-Flag zeigt an, dass wir die Perl-Syntax für reguläre Ausdrücke verwenden).

$ grep -P "(?<=port\s)4792" /var/log/auth.logAccepted password for hoover from 10.0.2.2 port 4792 ssh2

Umkreissuche

Die Umkreissuche gibt eine Anzahl von Zeilen vor oder nach einer Übereinstimmung zurück. Dadurch erhalten Sie einen Kontext für jedes Ereignis, indem Sie die Ereignisse nachverfolgen können, die dem Ereignis vorausgingen oder ihm unmittelbar folgten. Das -B-Flag gibt an, wie viele Zeilen vor dem Ereignis zurückgegeben werden sollen, und das -A-Flag gibt die Anzahl der Zeilen nach dem Ereignis an.

Suchen wir zum Beispiel nach Anmeldeversuchen mit einem ungültigen Benutzernamen und zeigen die Umgebungsergebnisse. Wir sehen, dass Benutzer, die sich nicht anmelden können, auch bei der Prüfung der Rückwärtszuordnung scheitern. Das bedeutet, dass der Client keinen gültigen Reverse-DNS-Eintrag hat, was bei öffentlichen Internet-Verbindungen üblich ist. Das bedeutet nicht, dass Ihr SSH-Server verwundbar ist, aber es könnte bedeuten, dass Angreifer aktiv versuchen, sich Zugang zu ihm zu verschaffen.

$ grep -B 3 -A 2 'Invalid user' /var/log/auth.logApr 28 17:06:20 ip-172-31-11-241 sshd: reverse mapping checking getaddrinfo for 216-19-2-8.commspeed.net failed - POSSIBLE BREAK-IN ATTEMPT!Apr 28 17:06:20 ip-172-31-11-241 sshd: Received disconnect from 216.19.2.8: 11: Bye Bye Apr 28 17:06:20 ip-172-31-11-241 sshd: Invalid user admin from 216.19.2.8Apr 28 17:06:20 ip-172-31-11-241 sshd: input_userauth_request: invalid user admin Apr 28 17:06:20 ip-172-31-11-241 sshd: Received disconnect from 216.19.2.8: 11: Bye Bye 

Tail

Tail ist ein weiteres Kommandozeilenwerkzeug, das die letzten Änderungen einer Datei in Echtzeit anzeigen kann. Dies ist nützlich, um laufende Prozesse zu überwachen, wie z. B. den Neustart eines Dienstes oder das Testen einer Codeänderung. Sie können tail auch verwenden, um die letzten Zeilen einer Datei auszudrucken, oder es mit grep kombinieren, um die Ausgabe aus einer Protokolldatei zu filtern.

$ tail -f /var/log/auth.log | grep 'Invalid user'Apr 30 19:49:48 ip-172-31-11-241 sshd: Invalid user ubnt from 219.140.64.136Apr 30 19:49:49 ip-172-31-11-241 sshd: Invalid user admin from 219.140.64.136

Eine vollständige Einführung in grep und reguläre Ausdrücke würde den Rahmen dieses Handbuchs sprengen, aber am Ende dieses Abschnitts finden Sie weitere Ressourcen.

parse

Cut

Mit dem Befehl cut können Sie Felder aus begrenzten Protokollen analysieren. Begrenzungszeichen sind Zeichen wie Gleichheitszeichen oder Kommas, die Felder oder Schlüssel-Wert-Paare trennen.

Angenommen, wir wollen den Benutzer aus diesem Protokoll auslesen.

pam_unix(su:auth): authentication failure; logname=hoover uid=1000 euid=0 tty=/dev/pts/0 ruser=hoover rhost= user=root

Wir können den cut-Befehl wie folgt verwenden, um die achte Übereinstimmung zu erhalten. Dieses Beispiel läuft auf einem Ubuntu-System.

$ grep "authentication failure" /var/log/auth.log | cut -d '=' -f 8root

Filtern und Parsen mit Awk

Das Filtern erlaubt Ihnen, nach einem bestimmten Feldwert zu suchen, anstatt eine Volltextsuche durchzuführen. Dies macht Ihre Protokollanalyse genauer, da unerwünschte Übereinstimmungen aus anderen Teilen der Protokollnachricht ignoriert werden. Um nach einem Feldwert zu suchen, müssen Sie Ihre Protokolle zuerst analysieren oder zumindest eine Möglichkeit haben, auf der Basis der Ereignisstruktur zu suchen. Dazu können wir awk verwenden.

Awk ist ein leistungsfähiges Kommandozeilenwerkzeug, das eine komplette Skriptsprache bietet, mit der Sie Felder effektiver filtern und analysieren können. Nehmen wir zum Beispiel an, wir wollen den Benutzernamen aus allen fehlgeschlagenen Anmeldeversuchen extrahieren. Unsere Protokolle haben das folgende Format.

Mar 24 08:28:18 ip-172-31-11-241 sshd: input_userauth_request: invalid user guest 

Hier sehen Sie, wie Sie den awk-Befehl verwenden können. Zunächst verwenden wir den regulären Ausdruck /sshd.*ungültiger Benutzer/, um die Zeilen sshd ungültiger Benutzer zu finden. Dann geben wir das neunte Feld unter Verwendung des Standardbegrenzers (ein Leerzeichen) mit { print $9 } aus. Dies gibt die Benutzernamen aus.

$ awk '/sshd.*invalid user/ { print $9 }' /var/log/auth.logguest

Filterung auf Fehler mit Awk

Eines der häufigsten Dinge, die Leute in ihren Logs sehen wollen, sind Fehler. Leider gibt die Standard-Syslog-Konfiguration den Schweregrad von Fehlern nicht direkt aus, was es schwierig macht, nach ihnen zu filtern.

Es gibt zwei Möglichkeiten, dieses Problem zu lösen. Erstens können Sie Ihre rsyslog-Konfiguration so ändern, dass der Schweregrad in der Protokolldatei ausgegeben wird, um das Lesen und Durchsuchen der Datei zu erleichtern. In Ihrer rsyslog-Konfiguration können Sie eine Vorlage mit pri-text wie die folgende hinzufügen.

"<%pri-text%> : %timegenerated%,%HOSTNAME%,%syslogtag%,%msg%n"

Dieses Beispiel gibt Ihnen eine Ausgabe im folgenden Format. Sie können sehen, dass der Schweregrad in dieser Meldung „err“ ist:

<authpriv.err> : Mar 11 18:18:00,hoover-VirtualBox,su:, pam_authenticate: Authentication failure

Sie können awk verwenden, um nur nach den Fehlermeldungen zu suchen. In diesem Beispiel fügen wir einige umgebende Syntax ein, um speziell dieses Feld zu finden.

$ awk '/.err>/ {print}' /var/log/auth.log<authpriv.err> : Mar 11 18:18:00,hoover-VirtualBox,su:, pam_authenticate: Authentication failure

Während Befehlszeilen-Tools für die schnelle Suche in kleinen Dateien nützlich sind, skalieren sie nicht gut für große Dateien oder über mehrere Systeme. Log-Management-Systeme sind viel effektiver bei der schnellen Suche in großen Mengen von Log-Daten. Wir besprechen Log-Management-Systeme im nächsten Abschnitt.

Suchen mit Log-Management-Systemen

Log-Management-Systeme vereinfachen den Prozess der Analyse und Suche in großen Sammlungen von Log-Dateien. Sie können gängige Protokollformate wie Syslog-Ereignisse, SSH-Protokolle und Webserver-Protokolle automatisch parsen. Sie indizieren auch jedes Feld, so dass Sie schnell Gigabytes oder sogar Terabytes von Protokolldaten durchsuchen können. Sie verwenden oft Abfragesprachen wie Apache Lucene, um flexiblere Suchen als grep mit einer einfacheren Suchsyntax als regex zu ermöglichen. Das spart sowohl Zeit als auch Aufwand, da Sie nicht für jede einzelne Suche eine eigene Parsing-Logik erstellen müssen.

Zum Beispiel sammeln wir hier Logs von einem Debian-Server mit SolarWinds® Loggly®, einem Cloud-basierten Log-Management-Service. Hier ist eine Beispiel-Protokollmeldung von sshd, die automatisch das Benutzerfeld analysiert.

Ein fehlgeschlagener Anmeldeversuch, der von Loggly analysiert wurde.

Sie können auch benutzerdefiniertes Parsing für nicht standardisierte Formate durchführen. Mit abgeleiteten Feldern können wir den nicht geparsten Teil der Nachricht parsen, indem wir sein Layout definieren. Dadurch können wir jedes einzelne Feld in den unparsierten Daten indizieren, anstatt sie als eine einzige Zeichenkette zu behandeln. Zum Beispiel können wir ein neues Feld mit dem Namen „auth_stage“ erstellen und es verwenden, um die Stufe im Authentifizierungsprozess zu speichern, in der der Fehler aufgetreten ist, was in diesem Beispiel „preauth“ ist.

Ein abgeleitetes Feld im Feld-Explorer von Loggly betrachten.

Filterung nach Fehlern mit Log-Management-Systemen

Log-Management-Systeme machen es einfach, nach Fehlern zu filtern, da sie Logs automatisch für uns parsen. In vielen Fällen können Sie einfach auf das gewünschte Feld klicken und einen Wert eingeben, um die resultierenden Protokolle zu filtern. Zum Beispiel können wir Fehler in Loggly anzeigen, indem wir auf das Syslog-Schwerefeld klicken und „Fehler“ auswählen.

Filtern auf Syslog-Meldungen mit Schweregrad „Fehler“ in SolarWinds Loggly.

Grep und reguläre Ausdrücke! (Ryans Tutorials)

The GNU Awk User’s Guide (GNU)

Using Grep + Regex (Regular Expressions) to Search Text in Linux (DigitalOcean)

See it. Analysieren Sie es. Inspect it. Lösen Sie es

Sehen Sie, worauf es ankommt.

START FREE TRIAL

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.