AIDE

Siehe auch

Verwandte Artikel
Offizielle Dokumentation

Das in C entwickelte AIDE (Advanced Intrusion Detection Environment) überwacht Programm- und Konfigurationsdateien auf Änderungen. Es berechnet deren Prüfsumme mit 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.

Begriffe

Baseline

Erstmalig gezogene Datenbank, die den Sollzustand repräsentiert. AIDE vergleicht bei jedem Lauf den aktuellen Zustand mit der Baseline. Änderungen an Systemdateien zwischen zwei Läufen müssen entweder bewusst bestätigt (aide --update) oder als Vorfall behandelt werden.

Check

Ein vollständiger Vergleich zwischen aktueller Festplatte und der Baseline-Datenbank. AIDE ist ein scheduled scanner - kein Real-Time-FIM wie OSSEC/Wazuh. Typisch läuft aide --check als systemd-Timer oder Cronjob einmal täglich.

FIM

File Integrity Monitoring. Oberbegriff für die Überwachung kritischer Systemdateien auf unerwünschte Änderungen. Bildet Teil der CIS-Benchmark-Empfehlungen (Section 6.1) und ist für PCI-DSS explizit vorgeschrieben.

HIDS

Host-based Intrusion Detection System. AIDE gehört - neben OSSEC, Samhain und Tripwire - in diese Kategorie. Bezieht seine Informationen ausschliesslich vom eigenen Host, im Gegensatz zu NIDS (Snort, Suricata), die Netzwerkverkehr inspizieren.

Hash-Gruppe

Eine in der aide.conf definierte Menge an Attributen, die bei einer Regel geprüft werden (z.B. PERMS, LOG, CONTENT_EX). Die AIDE-Standardkonfiguration liefert eine Reihe vorgefertigter Gruppen mit.

Installation und Verwendung

dnf --assumeyes install aide

Debian/Ubuntu:

apt-get --yes install aide aide-common

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. Alternativ und konventionell:

aide --init
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz

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 sie 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 aidecheck.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 zur aktiven Datenbank zu machen, mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz ausführen.

  • systemctl restart aidecheck

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. einschliesslich 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 mit demselben Anfang erfasst werden.
  • „Makro lines“ wie @@define VAR value:
    @@{VAR} referenziert das vorherige Makro.

Das Manual hilft, das Pattern-Matching zu verstehen.

Hash-Verfahren

AIDE unterstützt eine Reihe von Hash-Algorithmen. In einer Regel werden sie als Teil der Attributgruppe angegeben:

Attribut

Algorithmus

Bemerkung

md5

MD5

kollisionsanfällig, nur aus historischen Gründen

sha1

SHA-1

kollisionsanfällig, veraltet

sha256

SHA-256

empfohlener Standard

sha512

SHA-512

schneller auf 64-Bit, gleicher Sicherheitslevel

rmd160

RIPEMD-160

EU-Alternative

tiger

Tiger

selten gebraucht

haval

HAVAL

selten gebraucht

crc32

CRC-32

keine kryptografische Hash-Funktion, nur Änderungsheuristik

whirlpool

Whirlpool

512-Bit-Hash

gost

GOST R 34.11-94

russische Norm

Für eine belastbare Integritätsprüfung reicht sha256 (oder sha512) aus. Die klassische CIS-/Tripwire-Empfehlung, mehrere unterschiedliche Hash-Familien zu kombinieren (z.B. sha256+sha512+rmd160), stammt aus der Zeit, als die Kollisionsresistenz einzelner Verfahren in Frage stand - heute eher redundant, aber nicht schädlich.

aide.log

Das Logging ist viel zu umfangreich. Nach einem dnf update haben sich auf einem unbenutzten RHEL-Minimal-System 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 zum Doppelpunkt (:) 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.

Best Practices

  • Datenbank vor Manipulation schützen: die AIDE-Datenbank liegt standardmässig unter /var/lib/aide/aide.db.gz. Ein Angreifer mit Root-Rechten kann sie aber trivial manipulieren. Robust ist sie nur, wenn sie nach dem --init auf ein Read-Only-Medium oder off-host (z.B. auf einen Log-Server, ein zentrales Backup oder ein schreibgeschütztes Bind-Mount) kopiert wird und AIDE beim Check gegen diese Referenz prüft.

  • Datenbank signieren: die Hashes in der Datei sind nur dann glaubwürdig, wenn die Datei selbst signiert ist. Verfügbar über --gpg (seit 0.18) oder eine externe gpg --detach-sign-Pipeline.

  • Initial-Lauf nach jeder grösseren Änderung: ein dnf update oder apt upgrade erzeugt tausende Treffer. Ein aide --update direkt im Anschluss an geplante Systemänderungen verhindert, dass echte Treffer im Rauschen untergehen.

  • Log-Aggregation: /var/log/aide/aide.log nach Graylog / Loki / Elasticsearch forwarden. Alarmierung auf AIDE found differences between database and filesystem!! einrichten.

  • Konsistente Ausnahmen pflegen: Verzeichnisse wie /var/log, /var/cache, /var/spool, /tmp, /run, /proc, /sys von der strengen Prüfung ausnehmen (mit ! oder einer minimalen Attributgruppe). Die Default-Konfigurationen von RHEL und Debian machen das bereits grösstenteils - eigene Ergänzungen in einer eigenen Datei /etc/aide.conf.d/linuxfabrik.conf halten.

Unterschiede RHEL / Debian

  • Paketname: RHEL aide. Debian/Ubuntu aide + aide-common (enthält das update-aide.conf-Hilfsskript, das aus Fragmenten in /etc/aide/aide.conf.d/ eine finale Konfiguration zusammensetzt).

  • Konfiguration: RHEL nutzt eine einzige /etc/aide.conf. Debian verteilt die Konfiguration auf /etc/aide/aide.conf plus Fragmente in /etc/aide/aide.conf.d/.

  • Systemd-Timer: RHEL liefert aidecheck.service + aidecheck.timer mit. Debian legt einen cron-basierten Job unter /etc/cron.daily/aide ab; systemd-Timer müssen bei Bedarf selbst angelegt werden.

  • SELinux-Kontext: RHEL überwacht standardmässig das SELinux-Label (selinux in der Attributgruppe). Unter Debian mit AppArmor ist dieser Teil irrelevant; stattdessen lassen sich AppArmor-Profile selbst zur Prüfung heranziehen.

CIS-Benchmark

Der CIS-Benchmark für RHEL 10 verlangt in Section 6.1 die Installation und tägliche Ausführung von AIDE (oder eines gleichwertigen FIM-Tools). Konkret:

  • aide installiert und initialisiert.

  • Die AIDE-Datenbank liegt ausserhalb des überwachten Bereichs - idealerweise auf einem entfernten, schreibgeschützten Speicher.

  • aide --check läuft mindestens täglich, Ausgabe wird an einen privilegierten User oder an ein zentrales SIEM ausgeleitet.

  • Audit-Logs (auditd), SELinux-Policy und AIDE-Datenbank selbst stehen unter Überwachung.

Siehe dazu auch den auditd-Artikel für den passenden Regelsatz auf Kernel-Event-Ebene.