Dateisystem-Monitoring mit inotifywait
Änderungen am Dateisystem können trivial aber auch verheerend sein. Sind beispielsweise die Berechtigungen bestimmter Dateien oder Ordner nicht korrekt gesetzt, kann es zum Ausfall ganzer Dienste kommen. Ein Warnsystem kann hierbei helfen, falls (bewusst oder unbewusst) eine solche Änderung durchgeführt worden ist.
Aus diesem Grund werfen wir einen näheren Blick auf das Tool inotifywait.
Installation
inotifywait sollte mit den Standardpaketquellen des Distributors mitgeliefert sein und lässt sich folgendermaßen installieren:
### Ubuntu
sudo apt install inotify-tools
### Fedora
sudo dnf install inotify-tools
### Arch / Manjaro
sudo pacman -S inotify-tools
### openSUSE
sudo zypper install inotify-tools
### RHEL/CentOS/AlmaLinux/Rocky Linux
sudo yum install inotify-tools
Dateisystem-Überwachung einrichten
Die grundlegende Syntax von inotifywait sieht folgendermaßen aus:
inotifywait [Optionen] <Pfad>
Möchten wir nun ein bestimmtes Verzeichnis überwachen, erfolgt dies mit dem simplen Befehl:
inotifywait -m /Pfad/zum/Verzeichnis
-m steht hierbei für den -monitor Modus. Wird nun also eine Datei innerhalb dieses Ordners erstellt, gelöscht oder verändert, wird das Ereignis in die Kommandozeile ausgegeben:
In diesem Beispiel wurde die Datei neu im Ordner /opt/ erstellt.
Wir haben auch die Möglichkeit, die Ereignisse spezifischer zu filtern:
inotifywait -m -e delete /Pfad/zum/Verzeichnis
Hinter dem Parameter -e (oder auch -event) haben wir die Möglichkeit, unterschiedliche Schlüsselwörter zu verwenden, u.a. create, modify und/oder delete:
Hinweis:
Eine vollständige Liste der möglichen Filter lässt sich übrigens mit man inotifywait einsehen.
Mit der Anwendung dieses Filters hat die Erstellung der Datei neu1 keine Ausgabe erzeugt, wohl aber dessen Entfernen.
Derzeit werden mit der bisher gezeigten Syntax lediglich Ereignisse im angegebenen Ordner aufgezeichnet werden. Wir können das ganze aber auch auf alle Unterordner ausweiten:
inotifywait -m -r /Pfad/zum/Verzeichnis
-r (oder -rekursive) erfasst nicht mehr nur den angegebenen Ordner, sondern auch alle darunterliegenden:
Wenden wir inotifywait mit derart wenigen Parametern an, werden sämtliche Ordner- und Dateizugriffe, das Öffnen und Schließen von Dateien, das Verschieben usw. aufgezeichnet werden.
Spannender ist hierbei die gezielte Filterung nach attrib. Dann wird uns nämlich nur noch angezeigt, ob sich der Zeitstempel, der Besitzer der Datei- bzw. des Ordners oder die Zugriffsberechtigungen geändert haben:
inotifywait -m -r -e attrib /opt/
Hier habe ich beispielsweise mit chmod die Datei /opt/neu angepasst. Leider ist das Tool dabei nicht in der Lage anzuzeigen, welche spezifischen Änderungen durchgeführt worden sind. Lediglich der Ordner (in dem das ganze stattgefunden hat), das jeweilige Event und die angepasste Datei werden protokolliert.
Dauerhafte Protokollierung in Log-Datei
Nun haben wir die Funktionsweise von inotifywait kennengelernt. Allerdings hilft uns das Tool nur bedingt, wenn wir bei jeder gesetzten Änderung direkt vor dem Bildschirm sitzen und die Kommandozeile lesen müssen (und diese Ausgabe nach Beendigung des Terminal-Fensters ohnehin wieder verschwindet).
Abhilfe kann da ein Python-Skript schaffen, welches auf Änderungen reagiert und diese in eine Logdatei schreibt:
#!/usr/bin/env
import subprocess
import os
from datetime import datetime
def monitor(path):
process = subprocess.Popen(['inotifywait', '-m', '-r', '-e', 'attrib', path, '--format', '%w%f %e'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for line in iter(process.stdout.readline, b''):
line = line.decode('utf-8').strip()
if 'attrib' in line.lower():
inotifywait_output = line.split(' ')[0]
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
reaction(current_time, inotifywait_output)
def reaction(current_time, inotifywait_output):
os.system(f'echo "{current_time} - Zugriff auf folgende Datei: {inotifywait_output}" >> /var/log/filesystem_monitoring')
monitor ('/opt/')
Mit Hilfe dieses Skripts wird lokal eine Logdatei unter /var/log/filesystem_monitoring samt Zeitstempel erzeugt, sobald ein Zugriff innerhalb des Ordners /opt/ (und all seinen Unterordnern) stattfindet:
Fazit
inotifywait ist ein nützliches kleines Tool um Änderungen am Dateisystem festzuhalten. Sind auf dem System besonders kritische Dateien oder Ordner vorhanden, können diese leicht in die Überwachung aufgenommen werden. Das Tool ist außerdem ohne weiteres mit einem Python-Skript kombinierbar, sodass beispielsweise eine automatische Protokollierung in Form einer Log-Datei oder gar der Versand mittels einer E-Mail eingerichtet werden kann.
Bildquellen:
Ordner-Bild von OpenIcons auf Pixabay
Alarm-Bild von Alexey Hulsov auf Pixabay