Linux: Datenintegrität und HIDS
Samhain
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.dbf | fcheck 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