Der Simple Event Correlator

cepixx, 123RF

Logfiles im Blick

Der Simple Event Correlator erlaubt die Analyse von Logdateien im Hinblick auf Security- und beliebige andere Events. Dieser Artikel gibt eine Einführung in das kleine Perl-Programm.
Das Titelthema im ADMIN 04/14 "Vernetzt speichern" sind Netzwerkdateisysteme, etwa Samba 4, verteilter Storage mit Ceph & GlusterFS und der Unix-Klassiker ... (mehr)

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 ).

Abbildung 1: Im einfachsten Fall matcht SEC einen String und führt dann eine Aktion aus.

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 »Pair« , aber mit einem definierten Zeitfenster, innerhalb dessen das zweite Ereignis eintreten muss.

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.

Fazit

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

  1. Simple Event Correlator: http://simple-evcorr.sourceforge.net

Ähnliche Artikel

comments powered by Disqus
Mehr zum Thema

ADMIN-Tipp: Suchmuster in der Bash umkehren

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?

Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023