AA-123RF-9407602-Alex_Varlakov-123RF.jpg

© Alex Varlakov, 123RF

Datenbestände auf Veränderungen oder Manipulationen prüfen

Erbsenzählerei

Ob Rsync, Integrit oder Aide – alle diese Werkzeuge beobachten den Verzeichnisbaum des Systems und schlagen Alarm, sobald sie dort unbefugte Veränderungen bemerken.

Der Datenbestand auf Speichermedien hält nicht ewig [1]. Es drohen Verluste durch natürliche Alterung, Defekte des Speichermediums, aber auch durch Fehler oder gar Einbrüche ins System. Daher zählt es zu den Aufgaben jedes verantwortungsvollen Systemadministrators, zu prüfen, ob das Speichermedium mit dem Datenbestand intakt ist und ob es darauf eine Änderung gab.

Um Schreibzugriffe auf ein Speichermedium oder Verzeichnis vollständig zu verhindern, nutzt man entweder ein Nur-Lese-Medium wie eine DVD oder aktiviert einen Schreibschutz, etwa bei einer SD-Speicherkarte. Versierte Benutzer binden das entsprechende Verzeichnis nur lesbar ein oder setzen für ausgewählte Dateien den Schreibschutz (siehe Kasten "Dateisysteme nur lesbar einbinden").

Dateisysteme nur lesbar einbinden

Die Datei /etc/fstab listet alle Partitionen auf, die das System in den Verzeichnisbaum einbindet. In der vierten Spalte jeder Zeile lässt sich mit ro ("read-only") oder rw ("read-write") bestimmen, ob man auf der Partition nur lesen oder auch schreiben darf (Listing 1).

Als Alternative dazu bietet sich das Immutable-Flag an [15]. Dieses Flag gehört zu den erweiterten Attributen eines Verzeichniseintrags, die jedoch nur wenige Linux-Anwender kennen und auch in der Praxis nutzen. Kommen darüber hinaus File-based Access Control Lists (FACLs) ins Spiel, etwa im Zusammenhang mit SELinux [16] unter Red Hat, Fedora oder CentOS, dann lassen sich Zugriffsrechte noch genauer festlegen.

Bei gesetztem Immutable-Flag lässt sich der Eintrag im Verzeichnis nicht mehr verändern – die Datei oder das Verzeichnis ist dann schreibgeschützt. Jeden Versuch, die Daten zu ändern, weist das Betriebssystem ab. Nur der Benutzer root kann dieses Flag für einzelne Benutzer setzen und wieder aufheben. Ersteres gelingt mittels chattr +i Datei, Letzteres durch chattr -i Datei. Das i in der vierten Zeile von Listing 2 zeigt an, dass die Datei beispiel.txt das Immutable-Flag trägt.

Listing 1

$ grep daten /etc/fstab
/dev/sdb1  /daten  ext4  ro  0  0

Listing 2

# touch beispiel.txt
# chattr +i beispiel.txt
# lsattr beispiel.txt
----i--------e-- beispiel.txt
# echo "# Kommentar" >> beispiel.txt
bash: datei: Keine Berechtigung
# chattr -i beispiel.txt

TIPP

Bei den BSD-Varianten und beim Mac heißt das Pendant zu Chattr chflags. Unter Solaris deckt das Kommando chmod die Funktion ab; Ähnliches gilt für lsattr, dessen Funktion bei Solaris eine Erweiterung des Ls-Kommandos abdeckt.

Eine Änderung des Datenbestands kann sowohl inhaltlich in Form von Ergänzungen und Löschungen erfolgen als auch die Zugriffsrechte und Freigaben umfassen. Das Hinzufügen, Umbenennen, Verschieben und Löschen von Dateien, Verzeichnissen und (symbolischen) Links gehört ebenfalls dazu. Ihr Anliegen als Systemadministrator besteht darin, nachzuvollziehen, zu welchem Zeitpunkt welche Änderungen erfolgten, welcher Benutzer das veranlasste und – bei Fehlern – wie Sie das wieder reparieren.

Das Erkennen von Veränderungen im Vorfeld samt einer passenden Reaktion auf einen solchen Vorfall würde den Rahmen dieses Beitrags sprengen. Im Folgenden steht daher im Fokus, wie Sie nachträglich solche Veränderungen feststellen. Exemplarisch zeigen wir das Vorgehen anhand von Rsync und Integrit.

Das Gezeigte lässt sich prinzipiell auf andere Werkzeuge übertragen, wie beispielsweise Tripwire, Aide und Iwatch, unterscheidet sich aber im Aufwand beim Erstellen der Konfiguration und beim Auswerten.

Rsync

Liegen Ihnen zwei Datenbestände vor – etwa ein Original und eine Datensicherung – hilft Ihnen bereits das Bordmittel Rsync [2], etwaige Unterschiede zwischen den beiden Datenbeständen festzustellen. Rsync dient eigentlich dem Synchronisieren zweier Verzeichnisse und gibt dabei im Terminal aus, welche Einträge sich unterscheiden.

Listing 3 demonstriert das anhand der zwei Verzeichnisse original/ und kopie/. Jedes davon enthält drei ursprünglich identische Dateien. Im Verzeichnis kopie/ haben wir jedoch Daten geändert. Dabei ließen wir intakt.txt unverändert, setzten bei irgendwas.txt ein Ausführungsbit für die Gruppe und ergänzten nochwas.txt um zusätzlichen Inhalt.

Listing 3

$ ls -la {original,kopie}
kopie:
insgesamt 16
drwxr-xr-x 2 frank frank 4096 Jun  1 14:28 .
drwxr-xr-x 4 frank frank 4096 Jun  1 14:25 ..
-rw-r-xr-- 1 frank frank   15 Jun  1 16:36 intakt.txt
-rw-r-xr-- 1 frank frank   10 Jun  1 14:28 irgendwas.txt
-rw-r--r-- 1 frank frank   24 Jun  1 14:30 nochwas.txt
original:
insgesamt 16
drwxr-xr-x 2 frank frank 4096 Jun  1 14:26 .
drwxr-xr-x 4 frank frank 4096 Jun  1 14:25 ..
-rw-r-xr-- 1 frank frank   15 Jun  1 16:36 intakt.txt
-rw-r--r-- 1 frank frank   10 Jun  1 14:26 irgendwas.txt
-rw-r--r-- 1 frank frank   10 Jun  1 14:26 nochwas.txt
$ rsync -anv --out-format="[%t]:%o:%f:Last Modified %M" kopie/* original
sending incremental file list
[2016/06/01 16:40:25]:send:kopie/intakt.txt:Last Modified 2016/06/01-16:36:14
[2016/06/01 16:40:25]:send:kopie/irgendwas.txt:Last Modified 2016/06/01-14:28:49
[2016/06/01 16:40:25]:send:kopie/nochwas.txt:Last Modified 2016/06/01-14:30:23
sent 137 bytes  received 25 bytes  324.00 bytes/sec
total size is 34  speedup is 0.21 (DRY RUN)

Rsync ermöglicht über den Schalter -n (Langoption --dry-run) einen Trockendurchlauf. Diesen "Betriebsmodus" machen Sie sich hier zunutze, um die Veränderungen zu ermitteln, ohne tatsächlich eine Synchronisation zwischen den beiden Verzeichnissen auszulösen. Rsync vergleicht beide Ordner mittels -a (Langoption --archive) bezüglich der Namen der vorhandenen Einträge, deren Größe und der gesetzten Zugriffsrechte.

Ohne weitere Schalter gibt sich Rsync etwas schmallippig. Erst mithilfe von -v (Langoption --verbose) gibt es die Details der erfolgten Transaktionen preis. Die Option v lässt sich gegebenenfalls mehrfach setzen, um die Menge der Details zu steigern. Der zusätzliche Schalter --out-format legt fest, wie Rsync die Details zum Datentransfer kommentiert.

Dabei gibt %t den Zeitstempel des Transfers aus, %o die auszuführende Aktion (Senden oder Empfangen), %f den Dateinamen und %M den Zeitstempel der letzten Änderung (siehe Tabelle "Rsync-Formatkürzel" [3]). Weitere Hilfe zu Rsync bieten ein Grundlagenartikel aus LU 04/2006 [4] sowie die Rsync-Manpage.

Rsync-Formatkürzel

Kürzel Bedeutung
%a IP-Adresse der Gegenstelle
%b Anzahl tatsächlich übertragener Bytes
%B Zugriffsrechte der Datei (etwa rwxrwxrwt)
%c Gesamtgröße der Blockprüfsummen für Basisdatei (gesendet)
%f Dateiname (lange Form auf dem Sender, kein "/" nach Verzeichnis)
%G GID der Datei (dezimal) oder DEFAULT
%h Hostname des Remote-Rechners
%i Punkteliste der aktualisierten Dateieigenschaften
%l Dateilänge in Byte
%L Text -> SYMLINK, => HARDLINK oder leer
%m Modulname
%M Datum und Uhrzeit der letzten Dateiänderung
%n Dateiname (Kurzform, "/" nach Verzeichnis)
%o Operation (send, recv oder del)
%p PID der Rsync-Sitzung
%P Modulpfad
%t Aktuelles Datum und Uhrzeit
%u Benutzername (authentifiziert) oder leerer Text
%U UID der Datei (dezimal)

Da es ausschließlich um die modifizierten Einträge geht, hilft Ihnen auch die Kombination aus rsync -i (Langform --info) und dem Filterwerkzeug grep. Aus der detaillierten, aber immer noch kompakten Darstellung von Rsync filtern Sie damit nur diejenigen Informationen heraus, die Änderungen beinhalten; alle anderen Zeilen entfallen.

Die Ausgabe umfasst eine Zeile pro Datei, die jeweils ein > einleitet. Die darauf folgenden zehn Zeichen repräsentieren die Eigenschaften, anhand derer Rsync die beiden Einträge miteinander vergleicht. Steht dort jeweils ein Punkt, liegt kein Unterschied der betreffenden Eigenschaft vor, bei Buchstaben gab es jedoch eine Veränderung. Dabei steht c beispielsweise für "checksum" (Prüfsumme oder Hash-Wert), s für "size" (Größe) und <p für "permissions" (Zugriffsrechte).

Als Nächstes filtern Sie mittels grep und eines passenden regulären Ausdrucks [5] die relevanten Zeilen aus der Ausgabe. Der in Listing 4 genutzte Ausdruck passt auf Zeichenfolgen, die mit einem f beginnen, gefolgt von einem beliebigen Zeichen, auf das entweder ein Punkt und tp, st sowie ein Punkt oder drei Punkte folgen. Die beiden letzten Zeilen enthalten die erzielten Treffer.

Listing 4

$ rsync -acniv kopie/* original | grep --color -E "f.(\.tp|st\.|\.\.\.)"
>f..tp..... irgendwas.txt
>fcst...... nochwas.txt

Mit dem im Rsync-Aufruf verwendeten Schalter -c hat es eine besondere Bewandtnis: Er veranlasst das Programm, die Dateien nicht nur anhand ihrer Größe zu vergleichen, sondern zusätzlich aus dem Dateiinhalt eine Prüfsumme in Form eines Hash-Werts zu errechnen (siehe Kasten "Hash-Wert"). Somit kommen Sie auch Modifikationen am Inhalt auf die Spur, bei denen die Größe beibehalten und zudem nachträglich der Zeitstempel auf den Ursprungswert zurückgesetzt wurde.

Hash-Wert

Hash-Funktionen zählen zu den kryptografischen Verfahren. Sie dienen unter anderem dazu, Prüfsummen zu berechnen. Unter Linux stehen Ihnen dazu beispielsweise die Werkzeuge md5sum (MD5 mit 128 Bit), sha1sum (SHA1 mit 160 Bit), sha224sum (SHA2 mit 224 Bit), sha256sum (SHA2 mit 256 Bit), sha384sum (SHA2 mit 384 Bit) und sha512sum (SHA2 mit 512 Bit) zur Verfügung. Die Ziffernfolge bezeichnet üblicherweise die Länge des resultierenden Hash-Werts in Bits, wobei MD5 und SHA1 eine Ausnahme darstellen. Verfügt Ihr System über keines der genannten Programme, greifen Sie stattdessen auf opensslc zurück, das ebenfalls Hashwerte berechnet.

Inhaltliche Gleichheit

Um schnell herauszufinden, ob zwei Dateien inhaltlich übereinstimmen, helfen Ihnen die Linux-Werkzeuge cmp, comm, diff und sdiff nur bedingt weiter. Sie arbeiten zeilen-, byte- oder blockweise und arbeiten mitunter recht langsam. Stattdessen nutzt das Shell-Skript aus Listing 5 in den Zeilen 3 und 4 das Verfahren SHA256 – MD5 und SHA1 gelten als nicht mehr wirklich sicher.

Listing 5

#! /bin/bash
# Hash-Werte erzeugen
hashValue1=$(sha256sum $1 | awk '{ print $1 }')
hashValue2=$(sha256sum $2 | awk '{ print $1 }')
# Hash-Werte vergleichen
if [ $(echo -e "$hashValue1\n$hashValue2" | uniq | wc -l) == 1 ]; then
  echo "$1 und $2 sind identisch."
  exit 0
fi
echo "$1 und $2 sind nicht identisch."
exit 1

Das kompaktere Listing 6 löst das Problem mit weniger Rechenaufwand, bedarf aber eines tieferen Verständnisses der Shell-Programmierung. Sie rufen es mit zwei Dateien als Parameter auf. Entsprechend den Unix-Gepflogenheiten dienen als Rückgabewert in Zeile 3 der Wert 0 für Gleichheit und in Zeile 5 der Wert 1 für Ungleichheit.

Listing 6

#! /bin/bash
if [ "$(sha256sum $1 | awk '{ print $1 }')" == "$(sha256sum $2 | awk '{ print $1 }')" ]; then
 echo "$1 und $2 sind identisch."; exit 0
fi
echo "$1 und $2 sind nicht identisch."
exit 1

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 7 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Große Dateien transferieren
    Einige Dateisysteme orientieren sich meist an Dateien kleiner und mittlerer Größe und bekommen bei größeren Brocken schnell Schluckauf. Kleine Umwege versprechen hier Abhilfe.
  • Dateien abgleichen mit Rsync
    Mit Rsync synchronisieren Sie Daten – auf dem lokalen Rechner oder über ein Netzwerk auf entfernte Maschinen. Dank guter Zusammenarbeit mit SSH überträgt das Tool die Daten verschlüsselt und arbeitet auch dann noch recht flott, wenn es an Bandbreite mangelt.
  • Spurensuche
    Fehlt das richtige Werkzeug, ist es recht mühselig, Unterschiede in PDF-Dokumenten aufzuspüren. Wir stellen fünf pfiffige Tools vor, die dabei helfen.
  • Hüben wie drüben
    Mit "rsync" synchronisieren Sie Dateien auf einem lokalen Rechner oder über ein Netzwerk. Beim Abgleich überprüft das Programm, welche Unterschiede es zwischen Quell- und Zieldateien gibt, und überträgt nur die Änderungen.
  • Synchron schalten
    Mit Rsync synchronisieren Sie Daten entweder auf einem lokalen Rechner oder über ein Netzwerk. Vor dem eigentlichen Abgleich überprüft das Programm, welche Unterschiede es zwischen Quell- und Zieldateien gibt, und überträgt nur die Änderungen.
Kommentare

Infos zur Publikation

LU 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Huawei
Pit Hampelmann, 13.12.2017 11:35, 1 Antworten
Welches Smartphone ist für euch momentan das beste? Sehe ja die Huawei gerade ganz weit vorne. Bi...
Fernstudium Informatik
Joe Cole, 12.12.2017 10:36, 2 Antworten
Hallo! habe früher als ich 13 Jahre angefangen mit HTML und später Java zu programmieren. Weit...
Installation Linux mint auf stick
Reiner Schulz, 10.12.2017 17:34, 3 Antworten
Hallo, ich hab ein ISO-image mit Linux Mint auf einem Stick untergebracht Jetzt kann ich auch...
Canon Maxify 2750 oder ähnlicher Drucker
Hannes Richert, 05.12.2017 20:14, 4 Antworten
Hallo, leider hat Canon mich weiterverwiesen, weil sie Linux nicht supporten.. deshalb hier die...
Ubuntu Server
Steffen Seidler, 05.12.2017 12:10, 1 Antworten
Hallo! Hat jemand eine gute Anleitung für mich, wie ich Ubuntu Server einrichte? Habe bisher...