AIDE
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
Homepage: https://aide.github.io/
Source Code: https://github.com/aide/aide
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 ausgenommenJeder 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:
Pos 01
f
: Datei ist einregular file
Pos 03
=
:size
geprüft, aber unverändertPos 05
.
:permissions
geprüft, aber unverändertPos 06
.
:uid
geprüft, aber unverändertPos 07
.
:gid
geprüft, aber unverändertPos 12
.
:link
count geprüft, aber unverändertPos 14
.
:access control list
geprüft, aber unverändertPos 15
X
:extended attributes
- geändert (!)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-11-18