Mit iWatch lässt sich das ganze Dateisystem eines Rechners auf Veränderungen überwachen, die sofort gemeldet werden. Dies kann zur schnellen Einbruchserkennung und für andere Zwecke dienen.
Von Hans-Joachim Baader
Eines der probatesten Mittel, um Einbrüche in Rechner zu erkennen, ist die Überwachung aller kritischen Dateien auf Veränderungen. Diverse Programme stehen für solche Zwecke zur Verfügung, beispielsweise Tripwire, AIDE, Samhain und noch andere. Sie arbeiten nach dem Prinzip, Prüfsummen aller Dateien zu bilden und diese regelmäßig zu prüfen. Ihr Hauptnachteil ist die Reaktionszeit, die im ungünstigsten Fall so lang ist wie das Intervall zwischen zwei Prüfungen. Auch die Systemressourcen, die zum Verifizieren der Prüfsummen benötigt werden, können nachteilig sein.
iWatch behebt den Nachteil der Reaktionszeit auf, indem es über alle Änderungen unmittelbar informiert. Von den obigen Werkzeugen hat Samhain (ab Version 3.0) ähnliche Fähigkeiten, aber iWatch ist deutlich simpler, da es nur diese eine Funktion hat.
Installation
iWatch dürfte bei vielen Distributionen im Paketarchiv zu finden sein. Dies dürfte dann auch meist aktuell sein, denn iWatch selbst hat seit 2009 kein Update mehr erfahren. Wahrscheinlich war einfach keines mehr nötig, nachdem das Programm seinen aktuellen Funktionsumfang erreicht hatte. Es ist in Perl geschrieben und veraltet dementsprechend auch nicht. Effektiv besteht es nur aus einer Datei, die gut 500 Zeilen Perl-Code umfasst. Es steht zum Download auf Sourceforge bereit.
Bei einer manuellen Installation muss man die Voraussetzungen beachten. iWatch benötigt einen Kernel mit inotify-Unterstützung, die seit Linux 2.6.13 existiert. Die Perl-Module Linux::Inotify2, Event, Mail::Sendmail und XML::Simple müssen installiert sein, die man entweder in seinem Distributions-Archiv oder bei CPAN findet.
Einsatz
iWatch kann in zwei Modi zum Einsatz kommen: Auf der Kommandozeile und als Daemon. Ersteres ist wahrscheinlich nur für Ad-Hoc-Aktionen interessant und kann nicht gemeinsam mit dem Daemon-Modus verwendet werden. Die Einzelheiten zur Ausführung als Kommandozeilenprogramm kann man der Online-Hilfe bzw. der Dokumentationsseite entnehmen. Ein sehr einfaches Beispiel wäre:
iwatch /tmp
Eine mögliche Ausgabe dieses Aufrufs wäre (nachdem man lange genug gewartet hat):
[16/Feb/2013 19:45:01] IN_CREATE /tmp/tmpfTN2ok1 [16/Feb/2013 19:45:01] IN_DELETE /tmp/tmpfTN2ok1 [16/Feb/2013 19:45:01] * /tmp/tmpfTN2ok1 is deleted [16/Feb/2013 19:45:01] IN_CLOSE_WRITE /tmp/tmpfTN2ok1
Das Programm läuft weiter, bis man es unterbricht.
iWatch kann grundsätzlich als Root oder normaler Benutzer ausgeführt werden. Dateien, für die man keine Zugriffsrechte hat, werden natürlich nicht überwacht, und für Dateien in einem überwachten Verzeichnis, auf das man keine Rechte hat, erhält man vom Kernel keine Benachrichtigungen.
Wird von iWatch ein Ereignis registriert, so kann es verschiedene Aktionen ausführen. Es kann eine E-Mail an eine festgelegte Adresse senden, einen Eintrag in Syslog vornehmen oder ein externes Programm ausführen. Alle diese Aktionen sind optional und können auch kombiniert werden. Im Kommandozeilenmodus wird auf jeden Fall auch eine Ausgabe auf das Terminal geschrieben.
Der gebräuchlichere Modus ist der Daemon-Modus, der z.B. von Debian standardmäßig bereits eingerichtet wird. Tatsächlich gestartet wird iWatch allerdings erst (durch /etc/init.d/iwatch start
), wenn man in der Datei /etc/default/iwatch die Variable START_DAEMON
auf true
gesetzt hat. Zuvor sollte man die Konfigurationsdatei /etc/iwatch/iwatch.xml in Augenschein nehmen. Es handelt sich hierbei um eine XML-Datei, deren Syntax von iWatch strikt geprüft wird. Welche Einträge zulässig sind, wird aus der Dokumentation schnell klar, allerdings sind nicht alle Attribute ausdrücklich erklärt.
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.
