Kategorien
Forensik Linux

Inotify: Dateien überwachen

Du kannst in Linux Systemen die Veränderungen an Dateien im Dateisystem mit inotify überwachen.

Um, sobald Dateien verändert wurden ein .tar.gz-Archiv zur Datensicherung zu erstellen oder die veränderte Datei auf einen anderen Server hochladen, oder auch an ein Filter / Beautifier zu übergeben oder auch einfach nur um auf meinem NAS eine LED anschalten ist inotify das Werkzeug auf das alle die es noch nicht kennen gewartet haben.

Ich bin schon vor einigen Jahren auf ein Problem gestoßen für das inotify die richtige Lösung gewesen wäre. Damals konnte ich nir nur eine Endlosschleife schreiben die immer wieder alle Dateien in meinen Verzeichnissen durchgegangen ist, keine schöne Lösung und endlose Festplattenzugriffe.
Diese Endlosschleife gefiel meinem damaligen Provider garnicht, da diese zu häufig auf die zu überwachenden Dateien Zugriff und die Festplatten am einschlafen hinderten und die Lebensdauer der Festplatten reduzierte.
Damals konnte ich die Schleife einfach mit einer längeren pause() zügeln, bin bald auf einen Cronjob gewechselt der noch seltener lief.

Auf meines eigenen NAS und meinen eigenen Servern bin ich jedoch nicht auf eine Schleife oder Cronjobs angewiesen! Mit einem Inotify Event kann ich die Änderungen direkt im Dateisystem abpassen und die gewünschte Anktion direkt nach der änderung starten.

apt install inotify-tools
Inotify-Events
KürzelFormat
ACCESSZugriff auf die Datei
ATTRIBMetadaten geändert
CLOSE_WRITEzum Schreiben geöffnete Datei geschlossen, sie muss nicht geändert worden sein
CLOSE_NOWRITEEine Datei wurde geschlossen nachdem sie schreibgeschützt geöffnet wurde
CREATENeue Datei angelegt
DELETEDatei gelöscht
DELETESELFÜberwachtes Verzeiuchnis gelöscht
MODIFYDatei modifiziert
MODIFYSELFÜberwachtes Verzeichnis modifiziert
MOVEDFROMDatei aus dem überwachten Verzeichnis verschoben
MOVEDTODatei in das überwachte Verzeichnis verschoben
OPENDatei geöffnet
inotifywait -mrq -e create --format %w%f /pfad/zum/verzeichnis/ | while read FILE
do
echo "neue Datei: $FILE"
done

Um zum Beispiel das WordPress Verzeichnises auf neue Dateien zu überwachen kann ich folgendes Snippet nutzen:

inotifywait -mrq -e create --format %w%f /home/customer/der_metzger/loteks_de/www/ | while read FILE;
 do
  echo "neue Datei: $FILE";
done

Dirch dieses Snippet werden alle im WordPressverzeichnis  neu erstellten Dateien ausgegeben.

In meinem Verzeichnis vor allem viele Dateien wp-content/temp-write-test-1492771373. (Die Zahl an ende ändert sich bei jedem Aufruf)
Jedoch werden auch alle Updates, Uploads, Plugin und Theme Installationen und auch all die neuen Dateien an die ich grade nicht denke.

Um herauszufinden welche Dateien „angefasst“ werden wird nur der Parameter „-e create“ auf „-e access“ geändert:

inotifywait -mrq -e access --format %w%f /pfad/zum/verzeichnis/ | while read FILE
do
echo "zugriff auf Datei: $FILE"
done

Inotify ist unter Linux ein sehr nützliches Werkzeug, auch für die Fehleranalyse. 😉

Kategorien
Linux

Dateisystem „nachträglich“ in RAID1 wandeln

Ich wurde im Februar 2015 bei einem erfolglosen Bewerbungsgespräch Zeuge, wie auf einem Arbeitsplatz-Computer das Dateisystem, welches ohne RAID-Verbund eingerichtet wurde, das System auf mittels mdadm in ein RAID 1 umgewandelt werden sollte.

Ich fand die Idee einen Arbeitsplatz Computer nachträglich, scheinbar direkt nach der Neuinstallation auf ein RAID zu verschieben überflüssig und umständlich.
Persönlich nutze ich lieber das Backup des Systems welches in jedem Fall vorhanden ist um nach einer Neuinstallation des Computers mit Einrichtung eines RAID Verbundes, zur Wiederherstellung der Daten.

Als Fingerübung fand ich die Idee jedoch interessant.
In meinen eigenen Überlegung gehe ich davon aus das im Notfall eine solche Nachträgliche Verschiebung der Daten in ein RAID die offline-Zeit eines Systems zugunsten einiger Arbeit und der zusätzlichen Chance das das System unerkannte Schäden enthält, reduziert werden. Daher ziehe ich auch in diesen Fällen eine saubere Neuinstallation vor.

Während des Bewerbungsgesprächs hörte ich nur ein paar Fetzen, ein Mitarbeiter fragte tatsächlich den Leiter seiner Abteilung wie mdadm und die Grub Installation erfolgreich durchzuführen seien. (Nein, es war ein fest eingestellter Mitarbeiter in der Administration, kein Azubi)

Nach nur zwei Versuchen, die beide erfolgreich waren, kann ich guten Gewissens berichten das die Umstellung eines Systems in ein RAID 1 ist tatsächlich so kompliziert nicht ist.

1.) Partitionierung klonen

Nach dem Einbau der zweiten Festplatte muss die Partitionierung der ersten Festplatte auf die neue Festplatte übertragen werden.

Auf der ersten Festplatte befinden sich 3 Partitionen, Boot, Swap und die eigentliche Datenpartition.

Der folgende Befehl liest die Partitionierung der Festplatte /dev/sda aus und schreibt diese auf die Festplatte /dev/sdb.

sfdisk -d /dev/sda | sfdisk /dev/sdb

„sfdisk -d“ gibt die aktuelle Partitionstabelle der Festplatte /dev/sda aus und „sfdisk“, ohne Parameter, nimmt diesen Export und schreibt die Partitionen auf die Festplatte /dev/sdb.
Das die Übertragung der Partitionen erfolgreich war prüfe ich vor dem nächsten Schritt mit Hife der Eingabe von „sfdisk -l /dev/sdb“.

Im Anschluss wechseln wir die Partitions-ID von den für das RAID vorgesehenen Partitionen /dev/sdb1 und /dev/sdb3 auf fd (Linux raid autodetect).
Mit fdisk kann dies über das Kommando t, zum ändern der Partitions-ID, gefolgt von der Nummer der gewünschten Partition, zuerst 1 für die erste Partition später 3 für die dritten Partition, und in Folge die Eingabe der Zeichenfolge fd erfolgen.

fdisk /dev/sdb

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): fd

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): fd

Command (m for help): w
The partition table has been altered!

2.) Raid initialisieren

Anschließend erstellen wir das RAID 1 Arrays mit den neuen Partitionen und „mit fehlendem zweiten Datenträger“.
Hierbei ist missing der Platzhalter für die aktuell fehlenden, da „aktiven“ und mit den Daten des Systems belegten Partitionen. „-l 1“ steht für RAID 1, „-n 2“ dafür daß das RAID 1 aus zwei Datenträgern bestehen wird.
(Bei einer minimal-Debian Installation muss mdadm zuvor mit dem Aufruf „apt install mdadm“ installiert werden.)

# mdadm -C /dev/md0 -l 1 -n 2 missing /dev/sdb1 --metadata=0.90
mdadm: array /dev/md0 started

# mdadm -C /dev/md1 -l 1 -n 2 missing /dev/sdb3
mdadm: Note: this array has metadata at the start and
     may not be suitable as a boot device. If you plan to
     store '/boot' on this device please ensure that
     your boot-loader understamds md/v1.x metadata, or use
     --metadata=0.90
Continue creating array? y
mdadm: Defaulting to version 1.2 metadata
msads: array /dev/md1 started.

3.) Daten übertragen

Nach dem Anlegen der beiden neuen RAID 1 Arrays erzeuge ich ein ext3-Dateisystem auf den neuen Partitionen und erzeuge die neue swap-Partition.:

mkfs.ext3 /dev/md0
mkfs.ext3 /dev/md1
mkswap /dev/sdb2

Nach dem anlegen des Dateisystems können die Datenträger eingehängt werden…

mount /dev/md1 /mnt
mkdir /mnt/boot
mount /dev/md0 /mnt/boot

…und im Anschluss die Daten auf den neuen Datenträger kopieren:

cp --no-dereference --preserve --recursive --one-file-system / /mnt
cp --no-dereference --preserve --recursive --one-file-system /boot/ /mnt/

4.) RAID ergänzen

Wie bereits im ersten Schritt, werden nun die Partitions-IDs angepasst. Diesmal jedoch für die Festplatte /dev/sda auf welcher zuvor noch unsere Nutzdaten gespeichert waren:

fdisk /dev/sda

Command (m for help): t
Partition number (1-4): 1
Hex code (type L to list codes): fd

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): fd

Command (m for help): w
The partition table has been altered!

Im Anschluss muss in der Datei /etc/fstab für / den Eintrag /dev/md0 und für /boot den Eintrag /dev/md1 hinerlegt werden.

Anschließend kann der Computer neu gestartet werden.

Sobald der Grub2 Bootloader erscheint mit der Taste e den Editor für den Booteintrag atarten. In dem Booteintarg die Zeile „linux /vmlinux-3.3 root=UUID=“ in das aktuell verwendete „linux /vmlinux-3.3 root=/dev/md1“ korrigieren und im Anschluss mit F10 den Bootvorgang starten.

Das RAID mit den folgenden beiden Befehlen vervollständigen.:

mdadm --add /dev/md0 /dev/sda1
mdadm --add /dev/md1 /dev/sda3

Der erste Aufruf fügt dem RAID Array md0 den Fehlenden Datenträger sda1 hinzu. Nicht schwer zu erraten fügt zweite Aufruf den Datenträger sda3 dem RAID md1 hinzu.

5.) Grub für das neue RAID Installieren

Jetzt abschließend den Grub Bootloader für beide Festplatten konfiguriert und auf diese Installieren.

nur noch die Zeile „GRUB_TERMINAL=console“ in der Datei /etc/default/grub auskommentieren und mit den folgenden Befehlen eine neue Grub Konfiguration schreiben.

grub-mkdevicemap -n
update-grub
grub-install /dev/sda
grub-install /dev/sdb

Jetzt kann der Computer auch mit nur einer einzelnen Festplatte, /dev/sda oder /dev/sdb, erfolgreich starten.