Linux: Datenintegrität und HIDS

Samhain

Samhain Logo

Vorbemerkung

Die Informationen beziehen sich auf den Einsatz einer Standalone Samhain Installation für einen einzelnen Rechner ohne Anbindung an den Yule Logserver, Einbindung in das Prelude IDS, Nagios oder Nutzung der Beltane Web-GUI. Samhain läuft als Daemon und nicht per Cron-Job. Der Output der Prüfprozesse wird per signierter Mail versendet und z. T. in die Samhain Logdatei geleitet. Für die Administration von Samhain wird das mitgelieferte samhainadmin-sig.pl Perlskript und ein eigenes Skript verwendet. Vom Samhain Funktionsumfang wird nur eine Teilmenge verwendet.

Eins vorweg: Zum Einsatz von Samhain reicht das Lesen des Beitrags oder irgendwelcher How-Tos im Netz nicht aus, sondern nur das Studium der Samhain Dokumentation.

Funktionsumfang

  • Überprüfung der Dateiattribute (Zugriffsrechte, Dateigröße usw.) per Richtlinien [x]
  • Überprüfung der SHA-256, TIGER-192, SHA-1 oder MD5 Datei-Prüfsummen [x]
  • Überprüfung per auditd und PAM, welche Benutzer/UIDs Dateiänderungen durchführen
  • Überprüfung auf neue SUID/SGID Dateien [x]
  • Überprüfung laufender Dienste bzw. geöffneter Ports [x]
  • Überprüfung von Logins/Logouts [x]
  • Überprüfung der laufenden Prozesse [x]
  • Überprüfung gemounteter Dateisysteme und ihrer Mountoptionen [x]
  • Überprüfung einzelner Dateien in Benutzer-Heimatverzeichnissen [x]
  • Überprüfung bzw. Überwachung von Logdateiinhalten

[x] gibt an, welche Funktionen genutzt und im Beitrag behandelt werden.

Für den Schutz von Samhain bzw. der Erschwerung von Angriffen gegen Samhain, kann Samhain mit verschiedenen Optionen eingesetzt werden:

  • Signierung der Datenbank- und Konfigurationsdatei mit OpenBSDs Signify [x]
  • Signierung der E-Mail Nachrichten und Logdateiinhalte mit internem Samhain Schlüssel [x]
  • Ausführung von Samhain Kommandos in der Konsole wird an die Angabe eines Samhain Passworts gebunden [x]
  • Strings in der Logdatei- und Datenbankinhalte werden geXORed [x]
  • Steganografische Einbettung der Konfigurationsdatei in Bilddatei
  • Anhängen der Log- und Datenbankdatei an Bilddatei
  • Kompilierung einer statischen und gepackten Samhain Programmdatei [x]
  • das komplette oder teilweise Verbergen („stealth“) der Existenz von Samhain durch Umbenennen der Samhain Dateien und Verbergen des Samhain Daemonprozesses. Auf der anderen Seite kann die Kenntnis von der Existenz Samhains eventuell einen Abschreckungseffekt auf einen potentiellen Angreifer haben.

[x] gibt an, welche Funktionen genutzt und im Beitrag behandelt werden.

Vorbereitungen

  • Aufgrund von Sicherheitserwägungen (internes Schlüsselmaterial, „stealth“ Option, Nutzung von Signify) und der unterschiedlichen Möglichkeiten zur Konfiguration von Samhain wird Samhain nicht als fertiges Paket installiert, sondern selbst kompiliert und installiert. Eine spätere Deinstallation ist über das mitgelieferte samhain-install.sh Skript einfach und problemlos möglich.
  • Installation benötigter Entwicklungspakete für die Verwendung von PCRE Regulären Ausdrücken in Richtlinien, der optionalen Möglichkeit komplette Dateinhalte komprimiert in der Datenbank zu speichern (Storing the full content of a file), zur optionalen Überwachung von SELinux Attributen und/oder POSIX ACLs und von Signify:
sudo aptitude install libpcreN-dev libaclN-dev libattrN-dev zlibNg-dev signify-openbsd
  • Wer per audit Daemon, Samhain und entsprechender Richtlinien-Definition überwachen will, welche Benutzer/UIDs Dateiänderungen durchführen, benötigt zusätzlich das libaudit Entwicklungspaket, den audit Daemon und die Beachtung der entsprechenden Anleitung (siehe Who made changes to a file? in der Samhain Dokumentation). Man kann natürlich auch nach den Anpassungen laut Anleitung seine eigenen audit Regeln erstellen und nutzen.
sudo aptitude install libaudit-dev auditd
  • Herunterladen und Überprüfung der SHA-256 Prüfsumme des aktuellen Samhain Archivs:
wget https://la-samhna.de/samhain/samhain-current.tar.gz
sha256sum samhain-current.tar.gz
  • Überprüfen der GnuPG Signatur des Samhain Archivs mit dem GnuPG Schlüssel und Entpacken des Samhain Archivs:
gpg --import s_rkey.html
tar -xzf samhain-current.tar.gz
gpg --verify samhain-version.tar.gz.asc
tar -xzf samhain-version.tar.gz
cd samhain-version
  • Da von root Signify für die Signierung der Samhain Konfigurations- und Datenbankdatei und für die Anwendung des „Samhain Serviceskripts“ verwendet wird, erstellt man für root bzw. Signify einen Signify Schlüssel:
sudo -i
mkdir /root/.signify
cd /root/.signify
signify-openbsd -G -n -p name.pub -s name.sec

Falls man die Integrität der Signify Binärdatei sichern bzw. Samhain an eine bestimmte Signify Binärdatei binden will, lässt man sich vor der eigentlichen Konfiguration und Kompilierung die von Samhain berechnete TIGER-192 Prüfsumme von Signify ausgeben:

./configure --with-signify=/usr/bin/signify-openbsd --with-checksum="/usr/bin/signify-openbsd: 0"
make
./configure --with-signify=/usr/bin/signify-openbsd --with-checksum="/usr/bin/signify-openbsd: 0"

Die in der Warnmeldung ausgegebene Prüfsumme notieren und in den eigentlichen Konfigurationsaufruf einsetzen.

Kompilierung

Übersicht der Optionen

./configure --option
Konfigurations-Optionen
--prefix=(none)|USR|OPT|/pfad je nach Präfix Angabe werden Samhain Dateien in bestimmte Verzeichnisse installiert und gespeichert. Siehe auch Files and directory layout in der Samhain Dokumentation
--sysconfdir=/etc/samhain /etc/samhain/ statt /etc/ für das Verzeichnis, das die Samhain Konfigurationsdaten enthält
--enable-base=n1,n2 integrierter Schlüssel aus zwei Zahlenreihen, den Samhain erzeugt und der zur Verifizierung der Log und E-Mail Nachrichten dient. Bei einer neuen Kompilierung von Samhain kann ein zuvor erzeugter und gesicherter Schlüssel mit der Optione erneut angegeben werden. Deshalb sollte man sich den ausgegebenen Schlüssel nach Beendigung der Konfiguration sicher „notieren“.

Anmerkung: Mit samhain –add-key können auch weitere Schlüssel in die Samhain Binärdatei integriert werden
--disable-external-scripts durch Samhain können keine externen Skripte/Programme zur Weiterverarbeitung von Logausgaben aufgerufen werden
--disable-shellexpand keine Shell-Expansionen für Optionswerte und bedingte Anweisungen in der Konfigurationsdatei. Siehe auch Shell expansion in der Samhain Dokumentation
--enable-static kompiliert statische Samhain Binärdatei
--enable-login-watch Überwachung von An- und Abmeldungen per utmp und wtmp
--enable-micro-stealth=n n = 128 - 255, Strings in der Datenbank und in der Logdatei werden mit dem angebenem Wert geXORed, während die Konfigurationsdatei weiter im Klartext vorliegt
--enable-stealth=n wie --enable-micro-stealth, nur das die Konfigurationsdatei steganografisch in eine Bilddatei eingebettet wird
--enable-mounts-check Überprüfung, ob und wenn, mit welchen Optionen Dateisysteme gemountet sind
--enable-logfile-monitor Auswertung von Logdateien und Kommando-Ausgaben (kann z. B. auch durch bzw. anstatt logcheck wahrgenommen werden)
--enable-process-check Erkennung von Prozessen / Threads, die per ps nicht gelistet sind, weil sie sich verbergen oder aber eigentlich erforderlich sind oder gelistet sind, aber nicht existieren
--enable-port-check Überprüfung, welche Ports geöffnet sind bzw. ob Dienste an Ports lauschen mit Abgleich vorher als legitim definierter Ports
--enable-userfiles Überprüfung von Dateien und ihrer Attribute in Benutzer Heimatverzeichnissen
--disable-ipv6 deaktiviert IPv6
--enable-nocl=„Passwort“ Samhain Kommandos und Kommandozeilen-Argumente/-Optionen werden nur bei Angabe des Passworts interpretiert bzw. ausgeführt
--enable-suidcheck Durchsuchung des Dateisystems nach neuen Dateien mit SUID/SGID Bit plus optionaler Isolierung/Entfernung aufgefundener Dateien
--with-log-file=/var/log/logdateiname statt /var/log/samhain_log
--with-config-file=/etc/samhain/samhainrc Samhain Konfigurationsdatei im sysconfdir statt in /etc/samhainrc
--with-signify=/usr/bin/signify-openbsd

--without-checksum oder
--with-checksum=„/usr/bin/signify-openbsd: Prüfsumme“
Signify wird zum Erstellen und Überprüfen von Signaturen der Samhain Konfigurationsdatei und Datenbank verwendet.

Zusätzlich kann man die TIGER-192 Prüfsumme der Signify Binärdatei einkompilieren.
Beispiel
./configure --enable-micro-stealth=n --prefix=USR --sysconfdir /etc/samhain --disable-external-scripts --disable-shellexpand --enable-static --enable-login-watch --enable-mounts-check --enable-logfile-monitor --enable-process-check --enable-port-check --enable-userfiles --disable-ipv6 --emable-base=n1,n2 --enable-nocl="passwort" --enable-suidcheck --with-log-file=/var/log/samhain_log --with-config-file=/etc/samhain/samhainrc --with-pid-file=/run/samhain.pid --with-signify=/usr/bin/signify-openbsd --without-checksum

Installation

make
[make samhain.pk]
sudo make install

Der make Aufruf mit samhain.pk ist optional und dient der Erstellung und Nutzung der gepackten Version der Samhain Programmdatei (siehe auch Packing the executable in der Samhain Dokumentation).

sudo make install-boot

installiert abschließend das Samhain Init-Skript oder man startet Samhain per systemd:

samhain.service
[Unit]
Description=Samhain HIDS
After=network.target local-fs.target nss-lookup.target "dnsresolver".service "mta".service
Wants=network.target local-fs.target "dnsresolver".service "mta".service
 
[Service]
RestrictAddressFamilies=AF_INET AF_UNIX
Type=forking
GuessMainPID=yes
ExecStart=/usr/sbin/samhain start
ExecStop=/usr/sbin/samhain stop
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=10s
UMask=0027
 
[Install]
WantedBy=multi-user.target

Bis Samhain konfiguriert ist, bleibt das Init-Skript bzw. die systemd Unit deaktiviert:

sudo update-rc.d samhain disable
bzw.
sudo systemctl disable samhain.service

Deinstallation

sudo samhain-install.sh purge && sudo samhain-install.sh --force uninstall-boot

Abschlussarbeiten

Nach der Installation werden einige Skripte und die Samhain Dokumentation nicht mitinstalliert, die man nun „installieren“ und sichern sollte:

Logrotate

sudo cp scripts/samhain.logrotator /etc/logrotate.d/samhain

Dokumentation

sudo mkdir /usr/share/doc/samhain
sudo cp docs/* /usr/share/doc/samhain/

Danach können je nach Erfordernis einzelne Bestandteile der Dokumentation entfernt werden, die man nicht benöigt. Zum Beispiel die HTML Dokumentation verwenden und dafür die PDF Dokumentation entfernen:

cd /usr/share/doc/samhain/ && sudo tar -xf MANUAL-N_N.html.tar && rm MANUAL-N_N.html.tar
sudo rm /usr/share/doc/samhain/*.pdf

Skripte

sudo cp samhain-install.sh /usr/local/sbin/
sudo cp scripts/samhainadmin-sig.pl /usr/local/sbin/
chmod 700 /usr/local/sbin/samhain*

Konfiguration samhainrc

Allgemein

Der allgemeine Aufbau der Samhain Konfigurationsdatei:

Samhain Optionen:

[Misc]
Abschnitt mit 
Option = yes/no | true/false | 1/0 oder Wert oder $(Shell-Expansion)

[Kopfzeile]
Abschnitt mit 
Option = yes/no | true/false | 1/0 oder Wert oder $(Shell-Expansion)

Richtlinien zur Überprüfung der Datenintegrität:

[Misc]
RedefRichtlinie = +/-Liste,der,Attribute

# ----- Dateisystemkommentar -----
[Richtlinie]
dir  =
file =

[Misc]
IgnoreAdded   =
IgnoreMissing =

[Misc]

Samhain Daemon
Option Wert Information
Daemon yes Samhain wird als Daemon ausgeführt
SamhainPath /usr/sbin/samhain Vergleich der Prüfsumme der Samhain Programmdatei nach Start und Beendigung von Samhain
ChecksumTest check Standardmodus des Samhain Daemon: Abgleich/Überprüfung der Samhain Datenbankinhalte und Prüfvorgaben der Richtlinien
SetBindAddress 127.0.0.1 Interface für ausgehende Verbindungen (auch E-Mails)
SetNiceLevel n nice Level n während der Dateiüberprüfung
SetLoopTime n Samhain sendet alle n Sek. eine Zeitstempel-Nachricht
SetFilecheckTime n Samhain führt alle n Sekunden eine komplette Dateiüberprüfung durch
ReportOnlyOnce yes festgestellte Dateimodifikationen werden nur 1 x gemeldet
ReportFullDetail no keine detailierten Zusatzinformationen zu Dateimodifikationen
UseLocalTime yes Zeitstempel werden in lokaler Zeit abgebildet und nicht in GMT
E-Mail Benachrichtigungen
Option Wert Information
SetMailAddress root@localhost Empfänger (To:)
MailSubject [samhain] Nachricht Betreff (Subject:)
SetMailSender daemon@localhost Absender (From:)
SetMailTime n max. Zeitspanne in Sek. zwischen zwei Aussendungen von E-Mails durch Samhain
SetMailNum n max. Anzahl von Ereignis-Nachrichten pro E-Mail

Wie sich die Absender- und Empfängeradresse gestaltet, richtet sich nach der Konfiguration des MTA und der Namensauflösung des Systems. Siehe dazu E-mail, Client cannot self-resolve, but nslookup works fine und From daemon@example.com in der Samhain Dokumentation und FAQ Liste.

Logging
Option Wert Information
MessageHeader „%S %C %T “ Jede Ereignis-Nachricht in E-Mails bzw. in der Logdatei wird mit der Nennung der Dringlichkeitsstufe (S) bzw. Nachrichtenklasse (C) und einem Zeitstempel (T) eingeleitet
HideSetup yes Pfad zur Samhain Konfigurationsdatei und Datenbank wird nicht geloggt
SyslogFacility LOG_NAME verwendete Log-Instanz, wenn per syslogd geloggt wird
zusätzliche Prüfoptionen
Option Wert Information
UseHardlinkCheck yes Samhain vergleicht die Anzahl der Hardlinks eines Verzeichnisses mit der Anzahl der Unterverzeichnisse des Verzeichnisses
FilenamesAreUTF8 yes Samhain prüft Dateinamen auf ungültige UTF-8 Kodierung und Endungen mit nicht darstellbaren Zeichen
LooseDirCheck true Veränderungen in Verzeichnis Indodes werden ignoriert, wenn sich nur die Dateigrößen und Zeitstempel von Dateien geändert haben
UseACLCheck yes Samhain überprüft POSIX ACLs auf Änderungen

[EventSeverity]

SeverityReadOnly crit
SeverityLogFiles crit
SeverityGrowingLogs crit
SeverityIgnoreNone crit
SeverityAttributes crit
SeverityUserN crit
SeverityIgnoreAll crit
SeverityFiles crit
SeverityDirs crit
SeverityNames crit

Im [EventSeverity], [Utmp] und [ProcessCheck] Abschnitt wird den Ereignissen angelehnt an die Konfiguration des syslogd eine Dringlichkeitsstufe zugeordnet, die neben der Wichtigkeit und dem Informationsumfang in Verbindung mit der Konfiguration der Log-Ziele im [Log] Abschnitt auch bestimmt, an welches Log-Ziel welche Ereignis-Benachrichtigungen gesendet werden. Möglich sind none, debug, info, notice, warn, mark, err, crit, alert.

Da bestimmte Ereignisse fest zugewiesene Dringlichkeitsstufen haben und Dringlichkeitsstufen wie debug oder none bestimmte Bedeutungen, sollte man sich auf info, notice, warn und crit beschränken. Wenn man allen Ereignissen die gleiche Dringlichkeitsstufe beimisst bzw. alle Ereignis-Benachrichtigungen eh an an eine Log-Instanz gehen, kann man auch allen Ereignissen die gleiche Dringlichkeitsstufe zuordnen.

[Log]

MailSeverity = err
MailClass EVENT LOGKEY ERROR
LogSeverity = info,!=crit
LogClass START ERROR OTHER
PrintSeverity = notice
SyslogSeverity = none

Im [Log] Abschnitt wird bestimmt, welche Log-Ziele verwendet werden und welche Ereignis-Benachrichtigungen in welches Log laufen. Mit der Auskommentierung eines Log-Ziels oder der Wertangabe LogZiel = none wird ein Log-Ziel deaktiviert. Hier wird die Angabe der Dringlichkeitsstufe als Schwellenwert verwendet: damit die Ausgabe eines Ereignisses an bestimmte Log-Ziele erfolgt, muss die Dringlichkeitsstufe des Ereignisses im [EventSeverity], [Utmp] und [ProcessCheck] Abschnitt mindestens so hoch sein wie der Schwellenwert der Log-Ziele, also Dringlichkeitsstufe >= Schwellenwert.

Da wie oben angeführt, nur E-Mail Benachrichtigungen, die Samhain Logdatei und die Konsole als Log-Ziele verwendet werden, während das Loggen per syslogd möglich wäre, sind nur die vier Log-Ziele aufgeführt. Mit der MailSeverity Wertangabe wird definiert, dass alle Log-Ausgaben zu allen Ereignissen ab Dringlichkeitsstufe err als Benachrichtigungen per E-Mail erfolgen, die LogSeverity Wertangabe bestimmt, dass alle Ereignisse ab der Dringlichkeitsstufe info mit Ausnahme der Ereignisse mit crit Schwellenwert in die Samhain Logdatei geloggt werden, da Ausgaben zu Ereignissen mit crit Dringlichkeitsstufe nur als E-Mail erfolgen sollen. Mit der PrintSeverity Wertangabe wird der Informationsumfang der Ausgaben in der Konsole festgelegt, wenn dort ein Samhain Kommando abgesetzt wird. Da eine Log-Ausgabe per syslogd nicht erfolgen soll, wird das Logziel mit none deaktiviert.

Mit der Angabe von Ereignis-Klassen, die Ereignistypen zusammenfassen, kann aus der Menge aller erfassten Ereignisse, die durch die Angabe des Schwellenwerts gebildet wird, die Logausgabe auf die Teilmenge der definierten Ereignis-Klassen beschränkt werden.

Im obigen Beispiel würden alle Ereignisse mit Dringlichkeitsstufe err bis alert per E-Mail ausgegeben. Mit der Angabe der EVENT LOGKEY ERROR Klassen werden aber nur die Ausgaben zu Richtlinien und Regel-Ereignissen, der Schlüssel zur Verifizierung der E-Mails und der Logdatei und Fehlermeldungen per E-Mail zugestellt, jedoch keine Samhain Start- und Stop Meldungen. Dagegen würden an die Samhain Logdatei als Log-Ziel alle Ereignisse mit Dringlichkeitsstufe info bis alert ohne crit gesendet werden, aber mit der Angabe der START ERROR OTHER Klassen nur die Samhain Start- und Stop Meldungen, Fehlermeldungen, sonstige Informationen und z. B. keine Zeitstempel-Ausgaben.

Überwachungsmodule

Dateien und Verzeichnisse

Welche Objekte (einzelne Dateien oder (rekursiv) ganze Verzeichnisse) und Attribute der Objekte überwacht werden, richtet sich nach der gewählten Richtlinie, unter der die Objekte aufgeführt werden. Eine Richtlinie fasst mehrere Attribute zusammen. Sechs benannte Richtlinien sind bereits in der Zusammensetzung der Attribute vordefiniert, können aber wie die fünf optionalen UserN Richtlinien umdefiniert werden.

Da eine Richtlinie ein- oder mehrmalig in der Konfigurationsdatei aufgeführt werden kann, bieten sich zwei mögliche Ordnungen an: entweder führt man unter eine einmalig genannte Richtlinie alle Objekte auf oder man setzt die gleiche Richtlinie mehrmals in dateisystemspezifische Abschnitte ein, wie es auch in der mitgelieferten Standard-Konfigurationsdatei der Fall ist.

[RichtLinie1]
dir =
file =

[RichtLinie2]
dir =
file =

oder

— /mountpoint1 —
[RichtLinie1]
dir =
file =

— /mountpoint2 —
[RichtLinie1]
dir =
file =

Eine Datei wird mit file=/path/file referenziert, ein Verzeichnis mit dir=[Rekursionstiefe]/path/dir mit Rekursionstiefe von 0 (Standard) - 99. Innerhalb von Pfadangaben kann man die *, ?, […] Wildcards verwenden.

Mit RedefRichtlinie = +/-ATT1,+/-ATTn kann man Attribute einer Richtlinie hinzufügen bzw. aus ihr entfernen. Alle RedefRichtlinie Optionen stehen gesammelt in einem mit [Misc] eingeleiteten Abschnitt. Mit RedefUser0 bis RedefUser4 kann man bis zu fünf eigene Richtlinien definieren, die später mit [UserN] in der Konfiguration referenziert werden.

[Misc]
RedefAttributes = +MTM
RedefUser0      = +AUDIT,-ATM
 
[Attributes]
...
 
[User0]
...

Die IgnoreAdded und IgnoreMissing Optionen können, jeweils mit [Misc] eingeleitet, beliebig oft in der Samhain Konfigurationsdatei verwendet werden, um für alle Richtlinien Ausnahmen für die Dateien zu definieren, die häufiger (neu) erstellt und wieder gelöscht werden (z. B. temporärere Dateien, bestimmte Logdateien), um nicht permanent Benachrichtigungen zu ihrer Erstellung und Löschung zu erhalten. Für die Angabe der Dateien können Regular Expressions verwendet werden.

--- /var ---
[Richtline]
dir  = ...
file = ...
 
[Misc]
IgnoreAdded   = /var/lib/dir/name.*\.tmp
IgnoreMissing = /var/lib/dir/name.*\.tmp

Weitere Informationen, Beispiele und Sonderfälle sind in Defining file check policies: what, and how, to monitor und Excluding files and/or subdirectories der Samhain Dokumentation aufgeführt.

[Richtlinien]
Richtlinie Attribute, die überwacht werden:
IgnoreNone Eigentümer, Gruppe, Zugriffsrechte, Gerätenr., Anzahl Hardlinks, Symlink Namen, Inode, Prüfsummen, Dateigrößen, Zeitstempel außer ctime
Akürzungen +USR,+GRP,+MOD,+RDEV,+HLN,+LNK,+INO,+CHK,+SIZ,+MTM,+ATM
ReadOnly Eigentümer, Gruppe, Zugriffsrechte, Gerätenr., Anzahl Hardlinks, Symlink Namen, Inode, Prüfsummen, Dateigrößen, Zeitstempel außer atime
Abkürzungen +USR,+GRP,+MOD,+RDEV,+HLN,+LNK,+INO,+CHK,+SIZ,+MTM,+CTM
GrowingLogfiles Eigentümer, Gruppe, Zugriffsrechte, Gerätenr., Anzahl Hardlinks, Symlink Namen, Inode. Dateigröße und Prüfsumme wird nur bei Zuwachs ignoriert, verkleinert sich die Dateigröße nach der erstmaligen Erfassung, erfolgt eine Benachrichtigung
Abkürzungen +USR,+GRP,+MOD,+RDEV,+HLN,+LNK,+INO,+SGROW
LogFiles Eigentümer, Gruppe, Zugriffsrechte, Gerätenr., Anzahl Hardlinks, Symlink Namen, Inode
Abkürzungen +USR,+GRP,+MOD,+RDEV,+HLN,+LNK,+INO
Attributes Eigentümer, Gruppe, Zugriffsrechte, Dateityp, Gerätenr. bei Gerätedateien
Abkürzungen +USR,+GRP,+MOD,+RDEV
IgnoreAll Existenz von Datei / Verzeichnis
Abkürzungen keine
IgnoreModified
Abkürzungen
UserN selbstdefiniert bzw. IgnoreNone als Standardbelegung

Der Dateityp wird von jeder Richtlinie überwacht.

In Logs und/oder E-Mail Benachrichtigungen werden für jedes Objekt, bei dem Samhain anschlägt, die Attribute mit msg=<POLICY [Richtlinie] CLDIHMUGTS> benannt, wobei nur die Kürzel der Attribute aufgeführt werden, für die eine Abweichung vom in der Datenbankdatei gespeicherten Wert festgestellt wurde.

CRIT   :  EVENT [2011-08-27T18:57:54+0200] msg=<POLICY [ReadOnly] C-------TS>, path=</etc/cron.d/dcheck>
CRIT   :  EVENT [2011-08-27T08:10:51+0200] msg=<POLICY [Process] Hidden pid: 0 tests:  getpriority sched_getparam getsid getpgid kill>
Abk. Richtlinie Abk. Bericht Erklärung
CHK C Prüfsumme
LNK L Symlinkname
RDEV D Gerätenr.
INO I Inode
HLN H Anzahl Hardlinks
MOD M Zugriffsrechte
USR U Eigentümer
GRP G Gruppe
MTM
ATM
CTM
T Zeitstempel (mtime, atime, ctime)
SIZ S Dateigröße
PRE prelinked Binärdatei
SGROW Dateigröße darf anwachsen, SIZ+CHK, wenn anfängliche Dateigröße unterschritten wird
AUDIT wird durch auditd überwacht
TXT Speicherung des Dateiinhalts

inotify Dateiüberwachung

Als Ergänzung oder Ersatz zur kompletten, statischen Überprüfung des Dateisystems in vorgegebenen Intervallen per SetFilecheckTime kann die permanente, dynamische Überwachung auf Datei- und Verzeichnisänderungen per inotify Kernel-Funktion genutzt werden. Im Gegensatz zur herkömmlichen Methode verteilt sich aufgrund der permanenten Überprüfung das Lastaufkommen und Änderungen werden unmittelbar erkannt und kontinuierlich berichtet.

Zur inotify Nutzung wird inotify in der Samhain Konfigurationsdatei aktiviert und die maximale Anzahl der Überwachungsobjekte („inotify watches“) festgelegt bzw. erhöht.

[Inotify]
InotifyActive yes aktiviert
InotifyWatches n n inotify watches

Siehe auch Inotify support on Linux in der Samhain Dokumentation.

Dienste/Ports

[PortCheck]
PortCheckActive 1 aktiviert
SeverityPortCheck crit Dringlichkeitsstufe
PortCheckMinPort 0 Der Portbereich 0 - 65535 wird überwacht
PortCheckMaxPort 65535
PortCheckRequired aaa.bbb.ccc.ddd:port/udp,port1/tcp,port2/tcp… Dienste/Ports, die laufen bzw. geöffnet sein müssen
PortCheckOptional aaa.bbb.ccc.ddd:port/udp,port1/tcp,port2/tcp… Dienste/Ports, die laufen bzw. geöffnet sein können
PortCheckSkip aaa.bbb.ccc.ddd:port/[udp|tcp] Dienst/Port, der nicht überprüft und ignoriert wird
PortCheckIgnore aaa.bbb.ccc.ddd:port/[udp|tcp] Dienst/Port, der überprüft, aber ignoriert wird und deshalb u. U. Fehlermeldungen seitens des Daemon produziert
PortCheckInterval n alle n Sek. Prüfung
PortCheckUDP yes TCP und UDP Ports werden überwacht

Standardmäßig wird die IP-Adresse (aaa.bbb.ccc.ddd) der Netzwerkkarte eingetragen (und überprüft), an das der offizielle Hostname gebunden ist. Sollen weitere IP-Adressen bzw. Netzwerkkarten überprüft werden, können sie mit der PortCheckInterface Option angegeben werden:

PortCheckInterface eee.fff.ggg.hhh
PortCheckInterface iii.jjj.kkk.lll

Wer RPC (Remote Procedure Call) Dienste (per portmapper) laufen lässt, muss weitere Besonderheiten beachten. Siehe auch Checking for open ports in der Samhain Dokumentation.

Kernelmodule

Die Überprüfung geladener Kernelmodule wurde ab Samhain Version 4.0 entfernt. Stattdessen kann man Kernelmodule signieren und das nachträgliche Laden und Entladen von Kernelmodulen nach dem Systemstart blockieren.

SUID/SGID Dateien

[SuidCheck]
SuidCheckActive 1 aktiviert
SuidCheckInterval n alle n Sek. Prüfung
SeveritySuidCheck crit Dringlichkeitsstufe
SuidCheckFps n überprüfe n Dateien/Sekunde

An- und Abmeldungen

[Utmp]
LoginCheckActive 1 aktiviert
LoginCheckInterval n alle n Sek. Prüfung
SeverityLogin crit Dringlichkeitsstufe für Anmeldungen
SeverityLogout crit Dringlichkeitsstufe für Abmeldungen
SeverityLoginMulti crit Dringlichkeitsstufe für mehrmalige Anmeldungen eines Benutzers

Im Verzeichnis, in dem Samhain seine Datenbankdatei speichert, werden zusätzlich Dateien mit alphanumerischem Dateinamen angelegt, in denen statistische Daten zu An- und Abmeldungen von Benutzern erfasst werden. Siehe auch Monitoring login/logout events in der Samhain Dokumentation.

Eingebundene Dateissysteme

[Mounts]
MountCheckActive 1 aktiviert
MountCheckInterval n alle n Sek. Prüfung
SeverityMountMissing crit Dringlichkeitsstufe bei nicht gemounteten Dateisystemen
SeverityOptionMissing crit Dringlichkeitsstufe bei gemounteten Dateisystemen mit nicht vorhandenen Mount-Optionen laut checkmount
CheckMount /mountpoint [liste,der,mount,optionen] Überprüfung des mountpoints und seiner Optionen. Pro mountpoint eine Zeile

Prozesse

[ProcessCheck]
ProcessCheckActive 1 aktiviert
ProcessCheckInterval n alle n Sek. Prüfung
SeverityProcessCheck crit Dringlichkeitsstufe
ProcessCheckMinPID 0 überwachter PID-Bereich von 0 - 32767
ProcessCheckMaxPID 32767
ProcessCheckExists Prozessname Überprüfung, ob ein Prozess läuft, der laufen „muss“. Die Angabe des Prozessnamens muss ein POSIX Regulärer Ausdruck sein, der auf einen Teilstring in einer Zeile der Ausgabe von ps zutrifft. Pro Prozess eine Zeile

Siehe auch Checking for hidden/fake/missing processes in der Samhain Dokumentation.

Benutzerdateien

[UserFiles]
UserfilesActive 1 aktiviert
UserfilesCheckUids UID Liste Liste der Benutzer UIDs, deren Dateien überwacht werden sollen
UserfilesName [pfad/]datei Richtlinie Datei relativ zum Benutzer-Heimatverzeichnis (/home/name), die gemäß Richtlinie überwacht werden soll.

Für die Liste der UIDs können eine einzelne UID, ein UID-Bereich mit UID1-UIDn und ein offener UID-Bereich ab UIDn mit UIDn- (auch in Kombination) eingesetzt werden. Für Richtlinie können analog zu den Richtlinien für die Dateiintegritätsprüfungen allignore, attributes, logfiles, loggrow, noignore, readonly, user0 - user4 verwendet werden.

Kommandos

Datenbank initialisieren

sudo sh -c 'echo -t init -p info | samhain "'Passwort'"'

Datenbank-Prüfung

sudo sh -c 'echo -t check | samhain "'Passwort'"'

Datenbank aktualisieren

sudo sh -c 'echo -t update -l none [--interactive] | samhain "'Passwort'"'

Service-Skript

Das Skript geht von folgenden Voraussetzungen aus:

  • Samhain wurde mit --enable-nocl und --with-signify kompiliert
  • für root wurde ein eigener Signify Schlüssel mit entsprechendem /root/.signify Verzeichnis erstellt
  • Samhain läuft immer als Daemon mit der Überprüfungsfunktion (check)
  • das samhainadmin-sig.pl Skript ist verfügbar
#!/bin/sh
 
shetc="/etc/samhain"
shconfig="$shetc/samhainrc"
shlog="/var/log/samhain.log"
shclpw="$shetc/datei"
shlibdir="/var/lib/samhain"
shdb="$shlibdir/samhain_file"
shadmin="/usr/local/bin/samhainadmin-sig.pl"
sudo="sudo -H"
mbox="/pfad/mbox_datei"
 
umask 077
 
echo ""
echo "=== Samhain Menü ==="
echo "[a] Signierung Konfigdatei"
echo "[b] Signierung DB"
echo "[c] Signaturen Konfigdatei+DB prüfen"
echo "[d] DB (neu) initialisieren"
echo "[e] Überpüfung starten"
echo "[f] DB manuell aktualisieren"
echo "[g] DB automatisch aktualisieren"
echo "[h] Konfiguration ändern"
echo "[i] Konfiguration einsehen"
echo "[j] DB Objekt ausgeben"
echo "[k] Logdatei-Ausgabe"
echo "[l] E-Mails überprüfen"
echo "[m] Samhain Informationen"
echo "[n] Samhain Status / Start"
echo "[o] Hilfe"
echo "[x] Exit"
echo "=== Samhain Menü ==="
echo ""
printf "Bitte Auswahl [a - x] treffen: " "$wahl"
read wahl
 
if [ $wahl = a ] ; then
  $sudo $shadmin --remove-signature $shconfig && $sudo $shadmin --sign $shconfig && \
  $sudo systemctl reload samhain.service
elif [ $wahl = b ] ; then
  $sudo $shadmin --remove-signature $shdb && $sudo $shadmin --sign $shdb && \
  $sudo systemctl reload samhain.service
elif [ $wahl = c ] ; then
  $sudo $shadmin --examine $shconfig ; $sudo $shadmin --examine $shdb
elif [ $wahl = d ] ; then
  $sudo systemctl stop samhain
    if [ -e $shdb ] ; then
      $sudo rm $shdb
    else
      echo ""
    fi
  cd $shlibdir && \
  nocl="$($sudo cat $shclpw)"
  $sudo sh -c 'echo --foreground -l none -t init | samhain "'$nocl'"' && \
  $sudo $shadmin --sign $shdb && $sudo chmod 600 $shlibdir/* && \
  $sudo systemctl start samhain
elif [ $wahl = e ] ; then
  nocl="$($sudo cat $shclpw)"
  $sudo sh -c 'echo --foreground -l none -t check | samhain "'$nocl'"'
elif [ $wahl = f ] ; then
  nocl="$($sudo cat $shclpw)"
  $sudo cp $shdb /pfad/.archiv/ && \
  $sudo sh -c 'echo --foreground -l none -t update --interactive | samhain "'$nocl'"' && \
  $sudo $shadmin --remove-signature $shdb && $sudo $shadmin --sign $shdb && \
  $sudo systemctl reload samhain.service ; rm /pfad/.archiv/samhain_file
elif [ $wahl = g ] ; then
  nocl="$($sudo cat $shclpw)"
  $sudo sh -c 'echo --foreground -l none -t update | samhain "'$nocl'"' && \
  $sudo $shadmin --remove-signature $shdb && $sudo $shadmin --sign $shdb && \
  zenity --info --title "Samhain" --text "DB-Update fertig" --ok-label "OK" >/dev/null 2>&1
  $sudo systemctl reload samhain.service
elif [ $wahl = h ] ; then
  $sudo vi $shconfig && \
  $sudo $shadmin --remove-signature $shconfig && $sudo $shadmin --sign $shconfig && \
  $sudo systemctl reload samhain.service
elif [ $wahl = i ] ; then
  $sudo less $shconfig
elif [ $wahl = j ] ; then
  nocl="$($sudo cat $shclpw)"
  printf "DB-Objekt: " "$dbobj"
  read dbobj
  $sudo sh -c 'echo --foreground -l none -a -d "'$shdb'" | samhain "'$nocl'" | egrep "'$dbobj'"'
elif [ $wahl = k ] ; then
  nocl="$($sudo cat $shclpw)"
  $sudo sh -c 'echo --foreground -l none -jL "'$shlog'" | samhain "'$nocl'"'
elif [ $wahl = l ] ; then
  nocl="$($sudo cat $shclpw)"
  $sudo sh -c 'echo --foreground -l none -M "'$mbox'" | samhain "'$nocl'"'
elif [ $wahl = m ] ; then
  nocl="$($sudo cat $shclpw)"
  $sudo sh -c 'echo --foreground -l none --version | samhain "'$nocl'"'
elif [ $wahl = n ] ; then
  printf "Statu(s) oder Star(t)? " "$stw"
  read stw
  if [ $stw = s ] ; then
    $sudo systemctl status samhain
  else
    $sudo systemctl start samhain
  fi
elif [ $wahl = o ] ; then
  nocl="$($sudo cat $shclpw)"
  $sudo sh -c 'echo --foreground -l none --help | samhain "'$nocl'"'
  $sudo $shadmin --help
elif [ $wahl = x ] ; then
  exit 0
else
  exit 0
fi
 
exit 0

fcheck

fcheck ist ein reiner Dateiintegrität-Prüfer, der Datei- und Verzeichnisattribute auf Veränderungen überwacht und Prüfsummen vergleicht.

Installation

sudo aptitude install fcheck

Konfiguration

In der fcheck Konfigurationsdatei /ect/fcheck/fcheck.cfg wird festgelegt, welche Verzeichnisse / Dateien auf Veränderungen überwacht werden sollen (oder nicht), der Speicherort für die Datenbanken, in denen fcheck die Prüfsummen speichert und welcher Hash-Algorithmus zur Erzeugung der Prüfsummen verwendet wird.

Option Erklärung
Directory = /pfad/verzeichnis/ für jedes Verzeichnis (rekursiv)
Exclusion = /pfad/verzeichnis/ für jedes auszuschließende Verzeichnis (rekursiv)
ReadDB = /pfad/.fcheck/fcheck.dbf fcheck Datenbank für den täglichen Abgleich der Prüfsummen
Als Pfad bietet sich ein Verzeichnis an, auf das nur root Zugriff hat, z. B ein Unterverzeichnis im /root Verzeichnis selbst
WriteDB = /var/lib/fcheck/fcheck.dbffcheck Datenbank zum Anlegen bzw. Erneuern der Prüfsummen
$Signature = /usr/bin/sha256sum SHA-256 zum Erzeugen von Prüfsummen in der fcheck Datenbank
Standardmäßig verwendet fcheck nur MD5
File = /pfad/verzeichnis/datei für eine einzelen Datei
z. B. für fcheck.dbf, sha256sum, fcheck selbst

Beispiel für Pfade und Dateien:

Directory       = /boot/
Directory       = /lib/modules/
Directory       = /etc/fcheck/
File            = /var/lib/fcheck/fcheck.dbf
File            = /usr/bin/gpg2
File            = /usr/bin/gpgv2
File            = /usr/bin/sha256sum
File            = /usr/sbin/fcheck

Damit kann man z. B. nach Anwendung der Ubuntu Standardmethode zur Systemverschlüsselung mit unverschlüsseltem boot Volume per Alternate CD bei der Ubuntu Installation das boot Volume auf Manipulationen überwachen lassen. Je mehr Verzeichnisse und Dateien mit fcheck überwacht werden, desto öfters wird man aufgrund der Paketaktualisierungen fcheckrenew ausführen müssen. Außerdem setzt die Anwendung eines HIDS wie fcheck voraus, dass man sein System bzw. speziell die Paketaktualisierungen und -installationen im Auge hat und nicht alles automatisiert ohne Nachfragen installieren lässt.

Kommandos

Erzeugen und Aktualisieren der fcheck Datenbank

sudo fcheck -cadisf /etc/fcheck/fcheck.cfg

Nach einer Aktualisierung wird die WriteDB fcheck Datenbank kopiert

sudo cp /var/lib/fcheck/fcheck.dbf /pfad/.fcheck/fcheck.dbf

Zusätzlich kann die ReadDB fcheck Datenbank mit OpenPGP signiert werden, um bei einer Manipulation festzustellen, ob Datenbank selbst manipuliert wurde.

sudo gpg -bas /pfad/.fcheck/fcheck.dbf

Manuelle Überprüfung mit fcheck

sudo fcheck -adisrf /etc/fcheck/fcheck.cfg

fcheck per cron

Die mitgelieferte /etc/cron.d/fcheck Crontab Datei wird in folgenden Inhalt geändert:

# Regular cron job for the fcheck package
MAILTO=""
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

30 */2  * * *   root    /pfad/bin/fcheckcron

# EOF

Damit wird z. B. das fcheckcron Skript alle 2,5 Stunden ausgeführt. Das fcheckcron Skript vergleicht die Daten in der fcheck Datenbank mit den aktuellen Verzeichnisinhalten und sendet bei Abweichungen eine E-Mail. Danach wird die OpenPGP Signatur der Datenbank überprüft und ebenfalls eine E-Mail gesendet, wenn die Datenbank manipuliert wurde.

fcheckron

#!/bin/sh
sigfile="/pfad/.fcheck/fcheck.dbf.asc"
keyring="/pfad/pubring.gpg"
sigstatus="$(gpgv --quiet --keyring "$keyring" --status-fd 1 "$sigfile")"
 
test -x /usr/sbin/fcheck && if ! /usr/sbin/fcheck -adsirf /etc/fcheck/fcheck.cfg >/var/run/fcheck.out 2>&1; then mail -s "ALERT: [fcheck] DB" root </var/run/fcheck.out ; fi ; rm -f /var/run/fcheck.out
 
if [ ! "$(echo "$sigstatus" | grep VALIDSIG | cut -d' ' -f2)" = VALIDSIG ]; then
   echo "Überprüfung der fcheck-DB ergab:\n$sigstatus\nDie fcheck-DB wurde wahrscheinlich manipuliert" | mail -s "ALERT: [fcheck] DB-Sig" root
else
   exit 0
fi  
 
exit 0

fcheckrenew

Das fcheckrenew Skript dient der Aktualisierung und GnuPG Signierung der fcheck Datenbank, nachdem eine legitime Datei- bzw. Verzeichnisinhaltsänderung stattgefunden hat. Das Skript kann man in den Suchpfad kopieren und dann mit sudo fcheckrenew als Benutzer aufrufen. Signiert wird mit einem privaten Schlüssel des Benutzers aus dessen privater Schlüsselringdatei.

#!/bin/sh
 
fcwritedb="/var/lib/fcheck/fcheck.dbf"
fcreaddb="/pfad/.fcheck/fcheck.dbf"
fcdbsig="/pfad/.fcheck/fcheck.dbf.asc"
fconf="/etc/fcheck/fcheck.cfg"
 
umask 077
 
fcheck -cadisf $fconf && cp $fcwritedb $fcreaddb
 
if test -f $fcdbsig
then
  rm $fcdbsig && gpg --no-ask-sig-expire -bas $fcreaddb ; clear ;
else
  gpg --no-ask-sig-expire -bas $fcreaddb ; clear ;
fi
 
exit 0

Weitere Anwendungen für HIDS und Dateiintegritäts-Prüfung

Verweise auf aktuelle Seite