AIDE

Siehe auch

Das in C entwickelte AIDE (Advanced Intrusion Detection Environment) überwacht Programm- und Konfigurationsdateien auf Änderungen. Es berechnet deren Prüfsumme mit sechs verschiedenen Hash-Verfahren (was der Kollisionsvermeidung dienen soll) und bemerkt Timestamp-, Berechtigungs- und Owner-Änderungen. AIDE erkennt auch, falls Dateien hinzugekommen oder entfernt worden sind.

Die erste Version wurde 1999 vorgestellt. Die Konfiguration ist stark an Tripwire angelehnt.

Links

Installation und Verwendung

dnf -y install aide

Das Kommando /usr/sbin/aide --init --before 'database_out=file:/var/lib/aide/aide.db.gz' initialisiert die Datenbank und füllt sie mit den aktuellen Hashes aller Dateien des Systems.

Die Systemprüfung wird mit aide --check angestossen und sollte regelmässig mit Hilfe eines Cronjobs oder Systemd-Timers durchgeführt werden. Auf einem frisch installierten RHEL 8 Minimal benötigt diese knapp 20 Sekunden.

Ablauf, wenn Dateien gemeldet werden

Kurzform:

sudo cat /var/log/aide/aide.log
sudo aide --update
sudo mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
sudo systemctl restart aide-check.service

Meldet sich AIDE mit einem Fehler, dann haben sich gegenüber der Datenbank Dateien geändert, sind entfernt worden oder neu hinzugekommen. Das Vorgehen ist dann wie folgt:

  • Prüfung des AIDE-Logs in /var/log/aide/aide.log. Wie das Log zu interpretieren ist, siehe weiter unten.

  • Ursachen beheben oder Dateien und Verzeichnisse in der /etc/aide.conf von der Prüfung ausnehmen, Attribute besser prüfen etc.

  • aide --update ausführen, was eine neue Datenbank in /var/lib/aide/aide.db.new.gz erzeugt, die den aktuellen Systemzustand repräsentiert.

  • Um diese zu einer aktiven Datenbank zu machen, mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz ausführen.

  • systemctl restart aide-check

aide.conf

Um die Konfiguration anzupassen, editiert man /etc/aide.conf und prüft mit aide --config-check auf syntaktische Korrektheit.

In der aide.conf wird zwischen Gross- und Kleinschreibung unterschieden. Führende und nachfolgende Leerzeichen werden ignoriert. AIDE verwendet den Backslash \ als Escape-Zeichen für `` `` (Leerzeichen), @ und \ (Backslash) (z.B. \ `` oder ``\@). Um ein \ in einer Pfadangabe mit einem Perl-kompatiblen regulären Ausdruck zu matchen, muss der Backslash zweimal escaped werden (\\\\).

Die Konfigurationsdatei enthält

  • „Configuration options“ in der Form key = value:
    PERMS = p+i+u+g+acl+selinux definiert eine Gruppe namens „PERMS“, die nach Änderungen in den File Permissions (p), inode (i), user ownership (u), group ownership (g), ACLs (acl) oder SELinux context (selinux) schaut.
    LOG = p+u+g+n+S+acl+selinux+xattrs prüft auf Änderungen in den File Permissions (p), user ownership (u), group ownership (g), link count (n), growing size (S), ACLs (acl), SELinux context (selinux) oder Extended Attributes.
  • „Rules“ wie /dir1 group:
    Definieren, welche Regeln auf welche Verzeichnisse anzuwenden sind:
    /dir1 wendet die Regel auf das Verzeichnis inkl. aller Unterverzeichnisse und Dateien an
    =/dir1 nicht-rekursiv auf das Verzeichnis inkl. aller enthaltenen Dateien
    !/dir1 und darunter wird von der Prüfung ausgenommen
    Jeder reguläre Ausdruck muss mit einem / beginnen. Ihm wird implizit ein ^ vorangestellt, was heisst: Die regulären Ausdrücke matchen ab der ersten Position mit dem vollständigen Dateinamen (d. h. einschließlich des Pfads). Sonderzeichen in Dateinamen können mit Hilfe von URL-Encoding maskiert werden (z. B. %20 für ein Leerzeichen).
    Um eine einzelne Datei zu matchen, sollte der reguläre Ausdruck mit $ enden, damit nicht auch Dateien, die denselben Anfang haben könnten.
  • „Makro lines“ wie @@define VAR value:
    @@{VAR} referenziert das vorherige Makro.

Das Manual hilft, das Pattern-Matching zu verstehen.

aide.log

Das Logging ist viel zu umfangreich. Nach einem yum update haben sich auf einem unbenutzten RHEL 8 Minimal mit knapp 50’000 Dateien ca. 25’000 Dateien geändert. Im AIDE-Log wird berichtet, …

  • verbose=0: … dass Unterschiede gefunden wurden, aber nicht, welche.

  • verbose=2: Loggt über 24’000 Zeilen.

  • verbose=5: Loggt über 50’000 Zeilen.

  • verbose=7: Loggt über 300’000 Zeilen.

Geänderte Dateien werden je mit einer Zeile im Log aufgelistet. Beispiel für solch eine Zeile: f = ...    . .X. : /var/log/messages. Jedes Zeichen bis `` : `` hat seine Bedeutung:

YlZbpugamcinCAXS : /var/log/messages
1234567890123456 (= Position)

Y: File Type
    ? otherwise
    B for a block device
    D for a character device
    d for a directory
    F for a FIFO
    f for a regular file
    L for a symbolic link
    s for a unix socket
l: link name
Z: Size Comparison
    = size has not changed
    < reports a shrinked size
    > reports a grown size
b: block count
p: permissions
u: uid
g: gid
a: access time
m: modification time
c: change time
i: inode
n: link count
C: one or more checksums
A: access control list
X: extended attributes
S: check for growing size

".": no change
"+": attribute has been added
"-": attribute has been removed
":": attribute is listed in ignore_list
" ": attribute has not been checked

Die Log-Zeile f = ...    . .X. : /var/log/messages bedeutet damit, dass von 16 möglichen Attributen 9 geprüft wurden:

  1. Pos 01 f: Datei ist ein regular file

  2. Pos 03 =: size geprüft, aber unverändert

  3. Pos 05 .: permissions geprüft, aber unverändert

  4. Pos 06 .: uid geprüft, aber unverändert

  5. Pos 07 .: gid geprüft, aber unverändert

  6. Pos 12 .: link count geprüft, aber unverändert

  7. Pos 14 .: access control list geprüft, aber unverändert

  8. Pos 15 X: extended attributes - geändert (!)

  9. Pos 16 .: check for growing size geprüft, aber unverändert

Punktangaben können also ignoriert werden. Die Leerzeichen sind keine Trenner, sondern zeigen an, dass die für die Zeichenposition zuständige Eigenschaft gar nicht geprüft wurde.

Built on 2024-04-18