Login
Newsletter
Werbung

Do, 11. April 2013, 15:00

Dateiüberprüfung mit iWatch

Einbruchserkennung in Echtzeit

Schauen wir uns ein minimales Beispiel einer Konfigurationsdatei an:

<?xml version="1.0" ?>
<!DOCTYPE config SYSTEM "/etc/iwatch/iwatch.dtd" >

<config>
  <guard email="root@localhost" name="iWatch www.pro-linux.de"/>
  <watchlist>
    <title>Operating System</title>
    <contactpoint email="root@localhost" name="Administrator"/>
    <path type="recursive" events="default,attrib" syslog="on">/root</path>
    <path type="regexception">.*\.tmp</path>
    <path type="exception">/root/.bash_history</path>
  </watchlist>
</config>

Das Element <config> darf nur einmal vorkommen. Unter diesem wird mit <guard> die E-Mail-Adresse festgelegt, mit der iWatch seine Benachrichtigungen verschickt.

Innerhalb von <config> dürfen beliebig viele <watchlist>-Elemente eingetragen werden. Jede Watchlist besitzt einen eigenen Titel (<title>) und eine E-Mail-Adresse, an die die Benachrichtigungen verschickt werden (<contactpoint>). Lässt man den Eintrag <contactpoint> weg, wird keine Benachrichtigung verschickt.

Den Rest der <watchlist> bildet eine Liste von <path>-Elementen. Von diesen gibt es verschiedene Typen:

single
Angabe einer einzelnen Datei oder eines einzelnen Verzeichnisses. Im Falle eines Verzeichnisses werden keine Unterverzeichnisse überwacht.
recursive
Angabe eines einzelnen Verzeichnisses, das mitsamt Unterverzeichnissen überwacht wird.
exception
Angabe einer einzelnen Datei oder eines einzelnen Verzeichnisses, die von der Überwachung ausgeschlossen sind. Dabei ist der volle Pfadname anzugeben. Nicht dokumentiert ist die Tatsache, dass der Name ein beliebiger regulärer Ausdruck sein kann, der nur auf den Anfang des Dateinamens passen muss.
regexception
Wie exception, aber mit einem regulären Ausdruck, der zwei Besonderheiten aufweist. Zum einen darf er keinen absoluten, sondern nur einen relativen Pfadnamen enthalten. Zum anderen bezieht er sich auf den zuletzt angegebenen Pfadnamen, ist also relativ zu diesem.

Im obigen Beispiel wurde zur Illustration die Datei /root/.bash_history vom Verzeichnis /root ausgeschlossen, dazu auch noch alle Dateien, die auf .tmp enden. Hierzu ist das Attribut regexception und die Syntax von regulären Ausdrücken (nicht diejenige von Shell-Wildcards) zu verwenden.

Das <path>-Element kann weitere Attribute enthalten. Hier ist insbesondere events zu nennen, das festlegt, welche Ereignisse der Dateien gemeldet werden sollen. Der Standardwert defaults wird von iWatch als Vereinigung von close_write, create, delete, move, delete_self und move_self definiert. Im Beispiel oben wurde attrib hinzugefügt. Die möglichen Ereignisse sind in der Dokumentation erläutert.

Mit alert="off" werden E-Mail-Benachrichtigungen unterdrückt, auch wenn eine Empfängeradresse angegeben wurde. Mit syslog="on" werden Einträge ins Syslog geschrieben, normalerweise unterbleibt das. Die Syslog-Einträge sehen ungefähr so aus:

iWatch[25279]: * Send email to root@localhost
iWatch[25279]: * Send email to root@localhost
iWatch[25279]: * Send email to root@localhost
iWatch[25279]: * /etc/.crontab.swpx is deleted
iWatch[25279]: * Send email to root@localhost
iWatch[25279]: * /etc/.crontab.swp is closed
iWatch[25279]: * Send email to root@localhost
iWatch[25279]: * /etc/.crontab.swp is deleted
iWatch[25279]: * Send email to root@localhost
iWatch[25279]: * Send email to root@localhost
iWatch[25279]: * Send email to root@localhost
iWatch[25279]: * Send email to root@localhost
iWatch[25279]: * /etc/.crontab.swp is deleted

Die flexibelste Option schließlich ist exec="Kommando". Hier kann Kommando für jedes beliebige Programm stehen, das von der Shell ausgeführt werden kann, auch mehrere Statements, Pipes und weitere Konstrukte. Da dieses Statement aber durch den XML-Parser geschleust werden muss, wird man im Allgemeinen einfach einen kurzen Aufruf eines externen Programms bevorzugen, sonst muss man sich mit dem Escapen der in XML speziellen Zeichen befassen, was den Code schnell schwer lesbar macht. Ein triviales Beispiel:

exec="for i in 1 2; do echo $i %f; done"

Hier wird %f von iWatch durch den Dateinamen ersetzt. Weitere mögliche Ersetzungen, teils nur im Quellcode dokumentiert, sind

  • %p: Programmname
  • %v: Programmversion
  • %F: Wenn das Ereignis MOVED_TO ist, wird der alte Dateiname ausgegeben, sonst nichts
  • %e: Ereignisname
  • %c: Cookie

Einen Nachteil kann iWatch in der Praxis haben: Für jede einzelne Änderung an jeder einzelnen überwachten Datei wird ein Ereignis ausgelöst; dies kann zu einer Flut von E-Mails bei Änderungen führen. Man bekommt das in den Griff, indem man die Konfigurationsdatei sorgfältig anpasst, bis unwichtige Ereignisse nicht mehr auftreten. Vor größeren Änderungen schaltet man iWatch besser kurzzeitig ab.

Problemlösung

Wenn man viele Dateien überwacht, dann besitzen viele Systeme standardmäßig nicht genug Ressourcen, um alle Dateien zu überwachen. Leider liefert iWatch selbst keine Fehlermeldung in diesem Fall (es wäre eine leichte Übung, den Quellcode zu verbessern). Symptome des Problems sind beispielsweise, dass Änderungen an Dateien von iWatch nicht wahrgenommen werden, oder dass es beim Aufruf von tail -f zu einem Fehler kommt:

# tail -f /var/log/messages
tail: kann „/var/log/messages“ nicht beobachten: Auf dem Gerät
 ist kein Speicherplatz mehr verfügbar

Wie viele Watches möglich sind, wird mit Parametern im Verzeichnis /proc/sys/fs/inotify festgelegt. Standardmäßig haben die drei dort definierten Grenzen folgende Werte:

Parameter Wert Bedeutung
max_queued_events 16384 Maximale Zahl von Events, die gespeichert werden können, bevor Events verloren gehen
max_user_instances 128 Maximale Zahl von Inotify-Handles pro Benutzer
max_user_watches 8192 Maximale Zahl von Watches pro Inotify-Handle

Die obige Fehlermeldung deutet darauf hin, dass die dritte Zahl zu klein ist. Beheben kann man das mit

echo 100000 > /proc/sys/fs/inotify/max_user_watches

als Root. Auf den meisten Systemen kann man auch eine Zeile

fs.inotify.max_user_watches = 100000

zu /etc/sysctl.conf hinzufügen, um die Änderung dauerhaft zu machen.

Fazit

iWatch ist ein interessantes und nützliches Programm für alle, die Dateien und Verzeichnis-Hierarchien effizient auf Änderungen überwachen wollen. Manchmal muss man experimentieren, um die gewünschte Funktionalität zu erreichen, da die Dokumentation nicht immer eindeutig ist und sich über manches Detail ausschweigt. Hilfreich ist dabei, dass iWatch in Perl geschrieben ist und ein Blick in den Code jederzeit möglich ist. So offenbart dieser quasi auf den ersten Blick, dass aus den Kommandozeilenoptionen eine interne XML-Datei konstruiert wird, die dann genau wie eine Konfigurationsdatei geparst und ausgewertet wird. Ohne Nachsehen im Code wären einige Aspekte des Programmes kaum herauszufinden gewesen. Auf der anderen Seite ist es für jeden Perl-Kundigen kein Problem, das Programm zu erweitern, sollte sich einmal der Bedarf ergeben.

  • Das Werk darf vervielfältigt, verbreitet und öffentlich zugänglich gemacht werden, Abwandlungen und Bearbeitungen des Werkes müssen unter den gleichen Bedingungen weitergegeben werden. Der Name des Autors/Rechteinhabers muss in der von ihm festgelegten Weise genannt werden.

    - Weitere Informationen
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung