Daten sammeln ist bekanntlich schwer in Mode, aus diesen Daten aber sinnvolle Erkenntnisse zu gewinnen, eine Kunst. Der Hype der Stunde ist dabei Big Data, aber manchmal geht es auch ein paar Hausnummern kleiner. Um zum Beispiel Korrelationen von Events in verschiedenen Logdateien zu finden, bietet sich der Simple Event Correlator (SEC) an. Damit übernimmt SEC zumindest einen großen Teil der Aufgaben sogenannter Security Information und Event Management (SIEM) Software, die versucht, Sinn in eine Unmenge von (Security-)Logs zu bringen. Anders als etwa OSSIM (Open Source Security Information Management) wird SEC dabei aber nicht selbst aktiv, sondern beschränkt sich auf Logdateien, die aus anderen Quellen stammen.
Wer sich jetzt schon auf einen ausgedehnten Installationshürdenlauf freut, wird ennttäuscht sein: Das kleine Tool ist letztlich nur ein Perl-Skript. Die restlichen Dateien sind Dokumentation und diverse Startup-Skripts, mit denen sich SEC etwa in verschiedene Linux-Distributionen, FreeBSD und Solaris integrieren lässt. Auch ein Installationsprogramm gibt es nicht, man muss also Manpage und Binary von Hand an einen passenden Ort kopieren. Entwickelt wurde SEC um das Jahr 2000 herum von Riso Vaarandi, die neueste Version stammt aber aus dem Januar dieses Jahres.
Das Funktionsprinzip von SEC ist, in Logdateien nach einem Muster zu suchen und wenn es auftritt, eine vorkonfigurierte Aktion einzuleiten. Der besteht darin, dass es das nicht nur mit einem, sondern gleichzeitig mit mehreren Logdateien machen kann und die Aktionen in vielfältiger Weise voneinander abhängen dürfen. Dafür bietet SEC eine ganze Reihe vorkonfigurierter Optionen. Wenn das nicht reicht, bleibt noch der Ausweg über Perl-Code, mit dem sich die meisten Anwendungsfälle erledigen lassen dürften.
Für den einfachsten Fall sieht SEC den Regeltyp
»Single
«
vor, bei dem ein einzelnes Fundstück des gesuchten Patterns, ein Match, für eine Aktion genügt. Die Syntax dafür sieht so aus:
type=Single ptype=RegExp pattern=Failed password for root desc=Matched: $0 action=logonly
Nach dem Regeltyp in der ersten Zeile folgen der Patterntyp (hier: Regular Expression), das Suchmuster, die Variablendefinition für die Pattern-Beschreibung und schließlich die auszuführende Aktion. Um die Konfiguration auszuprobieren, genügt es, sie in eine Datei zu speichern, etwa
»ssh.conf
«
. Zum Testen ist es praktisch, dass SEC auch Text von der Standardeingabe verarbeitet. Dazu ruft man das Programm so auf:
sec -conf=ssh.conf -input=-
Gibt man nun im Terminalfenster beliebige Strings ein, passiert nichts. Tippt man aber die Wortkombination
»Failed password for root
«
, quittiert SEC das mit der Ausgabe von
»Matched: Failed password for root
«
. Mit der Aktion
»logonly
«
schreibt SEC die Ausgabe in die Logdatei, wenn eine eingestellt ist, sonst auf die Standardausgabe (
Abbildung 1
).
Um SEC mit einer Logdatei aufzurufen, übergibt man ihren Namen als Argument für den Input-Parameter. Will man mehrere Logdateien gleichzeitig im Blick behalten, verwendet man mehrere Input-Optionen. Zum Debuggen bietet SEC sechs Debugging-Level, die sich mit dem Schalter
»--debug
«
aktivieren lassen. Funktioniert alles wie gewünscht und man entschließt sich, SEC im Hintergrund zu betreiben, hilft der Kommandozeilenschalter
»--detach
«
.
Von Regular Expressions, wie man sie kennt, war bisher nicht viel zu sehen. Zwar ist das oben verwendete Pattern eine, aber es trifft nur zu, wenn der String genau wie aufgeführt vorkommt. Typischerweise verwendet man die bekannten Platzhalter, um für etwas größere Toleranz zu sorgen. So könnte das obige Pattern etwa auch so aussehen:
pattern=Failed password for (\w+)
Jetzt schlägt SEC bei jedem fehlgeschlagenen SSH-Login Alarm, denn die Regex
»\w+
«
steht für ein oder mehrere "Wort-Zeichen", also Zahlen, Buchstaben, Bindestrich und Unterstrich. Die Klammern geben eine Match-Group an, die man später verwenden kann, zum Beispiel in
»desc=Matched: $1
«
. Wie oben gesehen, steht
»$0
«
für den kompletten Match,
»$1
«
für die erste Match-Group,
»$2
«
für die zweite und so weiter.
Statt die Aktion nur zu loggen, bietet SEC auch eine Reihe weiterer Möglichkeiten. Ähnlich wie
»logonly
«
schreibt etwa
»write
«
in eine Datei der Wahl oder mit
»-
«
ebenfalls nach Stdout, den Standardausgabekanal. Wer zum Beispiel eine E-Mail verschicken möchte, kann das mit
»shellcmd
«
machen, das ein beliebiges externes Programm ausführt. Ähnlich funktioniert
»spawn
«
, das aber die Ausgabe des aufgerufenen Programms wieder an SEC zurückgibt, um sie weiterzuverarbeiten. Eine Liste der verfügbaren Aktionen ist in
Tabelle 1
zu sehen.
Tabelle 1
SEC-Befehle
Kommando |
Funktion |
---|---|
write |
Schreibe auf Stdout. |
shellcmd |
Führe Skript aus. |
spawn |
Führe Skript aus und lies Ergebnistext ein. |
eval, assign |
Weise Variable zu. |
event |
Erzeuge internes Event. |
create |
Erzeuge Kontext. |
set |
Ändere Kontext-Parameter. |
add |
Füge Event zu einem Kontext hinzu |
fill |
Füge Event zu einem Kontext hinzu, aber lösche vorher andere Events. |
delete |
Lösche Kontext. |
copy |
Kopiere Inhalt eines Kontexts in eine Variable. |
Bis jetzt war die Funktionalität von SEC nicht besonders beeindruckend, zumal es viele ähnliche Programme gibt, die Logdateien überwachen können. Allerdings bietet SEC noch eine Menge weiterer Regeltypen, die seine Funktion beträchtlich erweitern (siehe Tabelle 2 ).
Tabelle 2
Regeltypen
Typ |
Verwendung |
---|---|
Single |
Löse eine einzelne Aktion aus, wenn ein Ereignis eintritt. |
SingleWithScript |
Einfacher Match unter Einbeziehung eines externen Skripts. |
SingleWithSuppress |
Einfacher Match, der nur einmal eine Aktion auslöst und anschließend das Ereignis eine bestimmte Zeit lang ignoriert. |
Pair |
Löst beim Eintreffen eines Ereignisses eine Aktion aus und ignoriert weitere gleichartige Events, bis ein bestimmtes anderes auftritt. Daraufhin wird eine zweite Aktion ausgelöst. |
PairWithWindow |
Wie
» |
SingleWith2Thresholds |
Zähle gleichartige Events eine bestimmte Zeit lang und löse eine Aktion aus, wenn ein Grenzwert überschritten ist. Zähle dann wieder die Events und löse eine Aktion aus, wenn der zweite Grenzwert unterschritten wird. |
Calendar |
Führe eine Aktion zu einem bestimmten Zeitpunkt aus. |
Suppress |
Filtere Ereignisse aus. |
Seinem Namen gerecht wird der Simple Event Correlator spätestens mit der Pair-Regel, die nach dem Eintreffen eines Ereignisses alle weiteren gleichartigen Matches ignoriert und eine bestimmte Zeit lang auf ein zweites Event wartet. Trifft es ein, löst SEC die konfigurierte Aktion aus.
Ergänzend dazu gibt es noch den Regeltyp
»PairWithWindow
«
, der beinahe genauso funktioniert wie Pair, aber eine von zwei möglichen Aktionen nur dann ausführt, wenn beide Events in dem Zeitfenster auftreten. Tritt nur das eine Ereignis ein und nicht das andere, führt SEC die zweite Aktion aus. Alle weiteren Regeltypen sind in
Tabelle 2
zu finden.
Ein besonders leistungsfähiges Feature zur Kreuzreferenzierung mehrerer Logdateien sind die sogenannten Kontexte, die sich dazu eignen, Daten zwischen mehreren Regeln und Matches auszutauschen.
Implementiert sind Kontexte als Perl-Hashes, weshalb sich darin die meisten Datentypen speichern lassen. Die meisten Regeln besitzen eine Bedingung namens
»context
«
, die dann erfüllt ist, wenn der entsprechende Kontext existiert. Analog dazu gibt es die Möglichkeit, im Rahmen einer Aktion einen Kontext zu erzeugen:
action=create FOO_CONTEXT
Für einen zeitlich beschränkten Kontext schreibt man hinter den Kontextnamen die Zeitdauer in Sekunden. Listing 1 zeigt ein paar von Regeln, von denen die eine einen Kontext erzeugt, dessen Existenz die zweite prüft.
Listing 1
Kontexte
Neben der Tatsache der Existenz eines Kontexts kann man auch mit dessen Inhalten arbeiten. So fügt der Befehl
»add
«
in einer Action einem Kontext ein Event hinzu, zum Beispiel:
action=add MY_CONTEXT "ipmatch"
Alternativ zu
»add
«
gibt es noch den Befehl
»fill
«
, der beinahe das Gleiche tut, aber den Kontext zuerst leert. Ausgeben lässt sich ein solches Event wieder mit dem Befehl
»report
«
, der den Inhalt des Events an ein Shell-Kommando übergibt.
Wie man sich leicht vorstellen kann, eignen sich Kontext für alle möglichen Anwendungen, etwa auch dafür, ähnlich wie bei
»SingleWithSuppress
«
bei einem Match in einen anderen Zustand überzugehen und künftige Ereignisse anders zu behandeln. Nützlich zur Korrelierung mehrerer Logs ist auch die Spawn-Aktion. Sie ermöglicht es, beim Auftreten eines Ereignisses ein oder mehrere andere Logs zu öffnen und zum gleichen Zeitpunkt nach interessanten Mustern zu suchen.
SEC ist ein flexibles und leistungsfähiges Tool zur Korrelation bei der Logfile-Analyse, das insbesondere keine Klimmzüge zur Installation erfordert. In einfachen Fällen ist es auch ohne große Einarbeitung zu verwenden. Durch sein Vokabular an Regeln und Aktionen eignet es sich für ein breites Spektrum an Anwendungsfällen. Wenn das noch nicht genügt, bietet es als Ausweg immer noch den Einsatz von kurzen oder langen Perl-Funktionen, mit denen sich am Ende jedes Problem erledigen lässt.
Infos
Das Wildcard-Sternchen zum Anzeigen von Dateien, die einem bestimmten Muster entsprechen, kennt jeder. Doch was kann man tun, um alle Files anzuzeigen, die bestimmte Zeichen nicht enthalten?