SelfLinux Sicherheit Samhain Abschnitt 8 | SelfLinux-0.13.0

| Samhain | Autor Formatierung GFDL

#### 8 Optionen in der Konfigurationsdatei

Standardmäßig heißt die Konfigurationsdatei /etc/samhainrc (Samhain) bzw. /etc/yulerc (Yule).

Die Konfigurationsdatei besteht aus einzelnen Sektionen, die jeweils mit einer Überschrift in der Form [Sektionsname] eingeleitet werden. Zeilen, die mit # beginnen, sind Kommentare und werden ignoriert.

Optionen haben die Form Optionsname = Wert; dabei sind Leerzeichen vor und nach dem Gleichheitszeichen optional.

Alles, was vor der ersten Sektion und nach einem [EOF] steht, wird ignoriert. Es ist nicht generell notwendig, die Datei mit [EOF] abzuschließen, aber empfehlenswert, wenn am Ende der Datei Dinge stehen, die nicht als Optionen interpretiert werden sollen (z. B. eine GnuPG-Signatur, siehe Abschnitt Signierte Datenbank- und Konfigurationsdateien).

Manche Optionen sind nur relevant, wenn Samhain bzw. Yule mit Unterstützung für entsprechende Möglichkeiten übersetzt wurde. Falls eine solche Option dennoch benutzt wird, erfolgt eine Warnung beim Lesen der Konfigurationsdatei.

#### 8.1 Bedingte Anweisungen

Bedingte Anweisungen ermöglichen es, in die Konfigurationsdatei Optionen zu schreiben, die nur auf bestimmten Rechnern interpretiert (und sonst ignoriert) werden.

Die Bedingung kann entweder der Name des Rechners sein, oder das Tripel Betriebssystem:Version:Hardware, das man mit uname -srm erhält. Durch Voranstellen eines Ausrufezeichens kann die Bedingung invertiert werden.

/etc/samhainrc

    @abc.example.com
    # Wird nur gelesen wenn 'abc.example.com' der Name dieses Rechners ist
    @end

    !@abc.example.com
    # Wird nicht gelesen wenn 'abc.example.com' der Name dieses Rechners ist
    @end

    $Linux:2.4.26:i686
    # Wird nur auf Rechnern gelesen, auf denen
    # 'uname -srm' "Linux 2.4.26 i686" ausgibt
    $end

    !$Linux:2.4.26:i686
    # Wird nicht auf Rechnern gelesen, auf denen
    # 'uname -srm' "Linux 2.4.26 i686" ausgibt
    $end

#### 8.2 Überwachte Dateien

Die möglichen Sektionsnamen sind hier: [Attributes], [LogFiles], [GrowingLogFiles], [IgnoreAll], [IgnoreNone], [ReadOnly], [User0], [User1], und [Prelink].

Jede dieser Sektionen entspricht einer gleichnamigen Policy zur Überwachung der Dateien in der betreffenden Sektion.

Jede dieser Sektionen kann beliebig viele Einträge der Form file = /absoluter/pfad/zur/datei und dir = optionale_rekursionstiefe/absoluter/pfad/zum/verzeichnis haben; dabei ist optionale_rekursionstiefe die Rekursionstiefe für das betreffende Verzeichnis (maximal 99).

/etc/samhainrc

    [ReadOnly]
    dir = /bin
    dir = /sbin
    dir = /usr/bin
    dir = /usr/sbin
    dir = 2/boot

    file = /etc/motd

    [GrowingLogFiles]
    file = /var/log/messages
    file = /var/log/mail

#### 8.3 Dringlichkeitsstufe von Ereignissen

In einer Sektion, die mit [EventSeverity] eingeleitet wird, ist es möglich, die Dringlichkeitsstufe mancher Ereignisse anzupassen. Mögliche Dringlichkeitsstufen sind: none (nichts loggen), debug (niedrigste Stufe), info, notice, warn, mark, err, crit, alert (höchste Stufe).

Mögliche Ereignisse sind hier:

- Veränderungen von überwachten Dateien unter den verschiedenen Policys (Optionen SeverityReadOnly, SeverityLogFiles, SeverityGrowingLogs, SeverityIgnoreNone, SeverityIgnoreAll, SeverityUser0, SeverityUser1, SeverityPrelink)
- Zugriffsfehler bei Dateien (Option SeverityFiles)
- Zugriffsfehler bei Verzeichnissen (Option SeverityDirs)
- Seltsame Dateinamen, verwaiste Dateien (Option SeverityNames)

/etc/samhainrc>

    [EventSeverity]
    #
    # Überwachte Dateien (für die Bedeutung von 'ReadOnly',
    # 'LogFiles', usw. siehe Abschnitt Konfiguration der Integritätseigenschaften innerhalb des Dateisystems).
    #
    SeverityReadOnly=crit
    SeverityLogFiles=crit
    SeverityGrowingLogs=warn
    SeverityIgnoreNone=crit
    SeverityIgnoreAll=info
    #
    # Zugriffsfehler für Dateien (Files) und Directories (Dirs)
    #
    SeverityFiles=err
    SeverityDirs=err
    #
    # Dateinamen, ungültige UIDS/GIDs
    #
    SeverityNames=info

#### 8.4 Filter für Log-Möglichkeiten

In einer Sektion, die mit [Log] eingeleitet wird, wird definiert, was zu welcher Log-Möglichkeiten geloggt werden soll. D. h., es werden die gewünschten Dringlichkeitsstufen und eventuell Ereignisklassen eingestellt.

Mögliche Optionen für Dringlichkeitsstufen sind: MailSeverity (Email), PrintSeverity (Konsole), LogSeverity (Logdatei), SyslogSeverity (Syslog), PreludeSeverity (Prelude), ExportSeverity (logging zu Yule), ExternalSeverity (externe Skripte), DatabaseSeverity (logging zu relationaler Datenbank).

Die zuweisbaren Dringlichkeitsstufen sind: none (kein Logging), debug (niedrigste Stufe), info, notice, warn, mark, err, crit, alert (höchste Stufe).

Mögliche Optionen für Ereignisklassen (Standard ist alle) sind: MailClass (Email), PrintClass (Konsole), LogClass (Logdatei), SyslogClass (Syslog), PreludeClass (Prelude), ExportClass (logging zu Yule), ExternalClass (externe Skripte), DatabaseClass (logging zu relationaler Datenbank).

Das Argument ist eine Liste (mit Komma oder Leerzeichen getrennt) von zugelassenen Ereignisklassen:

EVENT | Überwachte Ereignisse (z.B. Änderungen einer Datei)
START | Start/Stopp-Meldungen
STAMP | Zeitmarken
LOGKEY | Der Schlüssel zur Verifikation der Log-Datei (siehe Abschnitt Verifikation der lokalen Log-Datei)
ERROR | Fehlermeldungen
OTHER | Alles andere (z.B. detaillierte Informationen)
AUD | System-Aufrufe (für Fehlersuche)

/etc/samhainrc

    [Log]

    MailSeverity = alert
    PrintSeverity = mark
    LogSeverity = notice
    LogClass = EVENT, START, STAMP, ERROR
    SyslogSeverity = err

#### 8.5 Überwachung von Login/Logout-Ereignissen

In der Sektion [Utmp] werden Optionen für die Überwachung von Login/Logout-Ereignissen gesetzt.

LoginCheckActive = yes|no | yes zum Einschalten, no zum Ausschalten
LoginCheckInterval = Sekunden | Intervall zwischen Überprüfungen
SeverityLogin = Level | Level/Dringlichkeitsstufe für Login-Ereignis
SeverityLoginMulti = Level | Level/Dringlichkeitsstufe für mehrfaches Login
SeverityLogout = Level | Level/Dringlichkeitsstufe für Logout-Ereignis

/etc/samhainrc

    [Utmp]
    #
    LoginCheckActive = yes
    LoginCheckInterval = 10
    SeverityLogin = crit
    SeverityLoginMulti = crit
    SeverityLogout = notice

#### 8.6 Überprüfung des Kernels

In der Sektion [Kernel] werden Optionen zur Überprüfung des Kernels gesetzt. Die folgenden Optionen stehen zur Verfügung:

KernelCheckActive = yes|no | yes zum Einschalten, no zum Ausschalten
KernelCheckInterval = Sekunden | Intervall zwischen Überprüfungen
KernelCheckIDT = yes|no | Auch Kernel Interrupt Descriptor Table prüfen ? Standard ist ja (yes).
SeverityKernel = Level | Level/Dringlichkeitsstufe für Ereignis

Die folgenden Optionen sind nur notwendig, wenn der Kernel neu übersetzt wurde (auch wenn die Version gleich geblieben ist !). Das Argument Adresse ist eine hexadezimale Zahl, mit der die Zeile beginnt, die der jeweils angegebene grep-Befehl ausgibt. Die Zahl sollte mit dem Präfix 0x versehen werden.

KernelSystemCall = Adresse | Adresse der system_call Funktion (grep system_call System.map)
KernelSyscallTable = Adresse | Adresse der sys_call_table Tabelle (grep sys_call_table System.map)
KernelProcRoot = Adresse | Adresse der proc_root Funktion (grep proc_root$ System.map)
KernelProcRootIops = Adresse | Adresse der proc_root_inode_operations Funktion (grep proc_root_inode_operations System.map)
KernelProcRootLookup = Adresse | Adresse der proc_root_lookup Funktion (grep proc_root_lookup System.map)

/etc/samhainrc

    [Kernel]
    KernelCheckActive=yes
    KernelCheckInterval=20
    KernelCheckIDT=yes
    SeverityKernel=crit
    #
    KernelSystemCall = 0xc0106cf8
    KernelSyscallTable = 0xc01efb98
    KernelProcRoot = 0xc01efb98
    KernelProcRootIops = 0xc01efb98
    KernelProcRootLookup = 0xc01efb98

#### 8.7 Suchen nach SUID/SGID-Dateien

Die Suche nach SUID/SGID-Dateien wird konfiguriert in einer Sektion, die mit [SuidCheck] eingeleitet wird. Die Optionen sind:

SuidCheckActive = yes|no | yes zum Einschalten, no zum Ausschalten
SeveritySuidCheck= Level | Level/Dringlichkeitsstufe für Ereignis
SuidCheckInterval = Sekunden | Intervall zwischen Überprüfungen
SuidCheckSchedule = Zeitplan | Zeitplan im crontab-Stil
SuidCheckExclude = /path | Optional ein Verzeichnis, das ausgelassen werden soll
SuidCheckFps = Anzahl | Optional die maximale Anzahl Dateien/Sekunde, die überprüft werden sollen

Es kann entweder SuidCheckInterval oder SuidCheckSchedule angegeben werden, aber beides gleichzeitig ist sinnlos.

/etc/samhainrc

    [SuidCheck]
    SuidCheckActive = yes
    SuidCheckSchedule=0 * * * *
    SeveritySuidCheck=crit

#### 8.8 Logging zu einer relationalen Datenbank

Sofern man zu einer Datenbank loggen möchte, z.B. zu einer MySQL- oder PostgreSQL- - Datenbank, muss der Zugriff auf die Datenbank konfiguriert werden. Dies erfolgt in der [Database]-Sektion. Die Optionen sind:

SetDBHost = Rechner-Name | Name des Datenbank-Servers. Für PostgreSQL muss dies die numerische IP-Adresse sein.
SetDBName = Datenbank | Name der Datenbank (Standard: samhain)
SetDBTable = Tabelle | Name der Tabelle (Standard: log)
SetDBUser = Benutzer | Als Benutzer anmelden (Standard: samhain)
SetDBPassword = Passwort | Beim Anmelden Passwort benutzen
UsePersistent = yes|no | yes für dauerhafte Verbindung zur Datenbank
SetDBServerTstamp = yes|no | (nur Yule) Diese Option sagt dem Server, ob er eigene Zeitstempel für Nachrichten von Samhain loggen soll (yes) oder nicht (no)

/etc/samhainrc

    [Database]
    SetDBHost = mysql.example.com
    SetDBName = samhain
    SetDBTable = log
    SetDBUser = samhain
    SetDBPassword = jsabfkej
    UsePersistent = no

#### 8.9 Verschiedenes

In der Sektion [Misc] finden sich verschiedene weitere Optionen:

Daemon = yes|no | Als Dämon laufen (yes = ja)
ChecksumTest = none|init|update|check | Die Standard-Handlung, wenn nicht auf der Kommandozeile angegeben (keine|Datenbank initialisieren|Datenbank aktualisieren|mit Datenbank vergleichen). Standard ist none
VersionString = Zeichenkette | In der Datenbank Zeichenkette zum Markieren der Version einsetzen (zusammen mit Rechner-Name und Zeitstempel)
SetNiceLevel = -19..19 | Priorität des Prozesses für Dateiprüfung setzen (-19 = höchste, 19 = niedrigste)
SetIOLimit = kbps | Datenrate (Kilobytes pro Sekunde) begrenzen.
SetLoopTime = Sekunden | Intervall zwischen geloggten Zeitstempeln
SetFilecheckTime = Sekunden | Intervall zwischen Dateiprüfungen (Standard: 600)
FileCheckScheduleOne = Plan | Zeitplan im crontab-Stil für Dateiprüfungen (alternativ zu SetFilecheckTime)
UseHardlinkCheck = yes|no | Anzahl Hardlinks für Verzeichnisse prüfen (yes = ja, no = nein)
HardlinkOffset=N:/Pfad | Ausnahme für Hardlink-Prüfung. N ist der Unterschied (tatsächliche - erwartet) für /Pfad.
AddOKChars = N1, N2, .. | Liste der akzeptablen Zeichen (Byte-Werte) für den Test auf seltsame Dateinamen. Nn muß entweder hexadezimal (führendes 0x: 0xNN), oktal (führende Null: 0NNN), oder dezimal sein. Mit all als Argument wird der Test ausgeschaltet.
IgnoreAdded = /regex | Ignorieren, wenn die Datei /regex neu erzeugt wird. /regex kann ein regulärer Ausdruck sein, und muss einen absoluten Pfad bezeichnen.
IgnoreMissing = /regex | Ignorieren, wenn die Datei /regex gelöscht wird. /regex kann ein regulärer Ausdruck sein, und muss einen absoluten Pfad bezeichnen.
ReportOnlyOnce = yes|no | Jede Dateiveränderung nur einmal berichten (Standard: yes = ja)
ReportFullDetail = yes|no | Alle Details zu einer veränderten Datei berichten (Standard: no = nein)
UseLocalTime = yes|no | Zeitstempel für Dateien in lokaler Zeit statt GMT berichten. Diese Option sollte nicht benutzt werden, wenn Beltane eingesetzt wird.
SetConsole = Gerät | Das Konsolen-Gerät bestimmen (Standard: /dev/console).
MessageQueueActive = yes|no | Die System V IPC message queue benutzen (Standard: no = nein).
SetMailTime = Sekunden | Maximale Zeitspanne zwischen Email-Nachrichten (Standard: 86400).
SetMailNum = 0..127 | Maximale Anzahl wartender Emails in interner Warteschlange.
SetMailAddress = Empfänger | Einen Email-Empfänger hinzufügen (maximal 8).
SetMailRelay = IP-Adresse | Einen Relay-Rechner für Email festlegen.
MailSubject = Zeichenkette | Eigenes Format für die Betreff-Zeile definieren.
SamhainPath = /Pfad | Pfad des Programmes. Falls diese Option benutzt wird, wird die Prüfsumme beim Programmende mit derjenigen zum Programmstart verglichen.
SetBindAddress = IP-Adresse | IP-Adresse (Netzwerk-Karte) für ausgehende Verbindungen (auf Maschinen mit mehreren IP-Adressen).
SetTimeServer = IP-Adresse | Optionaler Zeitdienst. Es wird das einfache time-Protokoll (37/tcp) benutzt.
MessageHeader="\%S \%T \%F \%L \%C" | Benutzerdefiniertes Format für den Mail-Header
SyslogFacility = LOG_xxx | Welche syslog-Facility soll benutzt werden (Standard: LOG_AUTHPRIV)
HideSetup = yes|no | Beim Start keine Namen von Datenbank und Konfigurations-Dateien loggen
TrustedUser = user1, ... | Liste zusätzlicher vertrauenswürdiger Benutzer
SetDatabasePath = AUTO|/Pfad | Pfad zur Datenbank (AUTO um Rechner-Namen an Standard-Pfad anzuhängen)
SetLogfilePath = AUTO|/Pfad | Pfad zur Log-Datei (AUTO um Rechner-Namen an Standard-Pfad anzuhängen)
SetLockfilePath = AUTO|/Pfad | Pfad zur Lock-Datei, die den Zugriff zur Log-Datei blockiert (AUTO um Rechner-Namen an Standard-Pfad anzuhängen)
DigestAlgo = SHA1|MD5 | SHA1 oder MD5 anstelle von TIGER192 als Prüfsummenalgorithmus benutzen (Standard: TIGER192)
RedefReadOnly = +XXX|-XXX | Den Test XXX zur Policy ReadOnly hinzufügen bzw. von dieser wegnehmen (Liste möglich).
RedefAttributes= +XXX|-XXX | Den Test XXX zur Policy Attributes hinzufügen bzw. von dieser wegnehmen (Liste möglich).
RedefLogFiles= +XXX|-XXX | Den Test XXX zur Policy LogFiles hinzufügen bzw. von dieser wegnehmen (Liste möglich).
RedefGrowingLogFiles = +XXX|-XXX | Den Test XXX zur Policy GrowingLogFiles hinzufügen bzw. von dieser wegnehmen (Liste möglich).
RedefIgnoreAll = +XXX|-XXX | Den Test XXX zur Policy IgnoreAll hinzufügen bzw. von dieser wegnehmen (Liste möglich).
RedefIgnoreNone= +XXX|-XXX | Den Test XXX zur Policy IgnoreNone hinzufügen bzw. von dieser wegnehmen (Liste möglich).
RedefUser0 = +XXX|-XXX | Den Test XXX zur Policy User0 hinzufügen bzw. von dieser wegnehmen (Liste möglich).
RedefUser1 = +XXX|-XXX | Den Test XXX zur Policy User1 hinzufügen bzw. von dieser wegnehmen (Liste möglich).
SetLogServer = IP-Adresse | Adresse des Log-Servers
MACType=HASH-TIGER|HMAC-TIGER | Die Art der Authentifizierungs-Codes wählen. Falls diese Option benutzt wird, muss für Yule und Samhain derselbe Wert gesetzt sein. Standard ist HMAC-TIGER.
SetReverseLookup = yes|no | Wenn nein (no), dann keinen reverse DNS-Lookup durchführen, wenn Verbindung zu einem Rechner hergestellt wird, der mit Namen statt IP-Adresse angegeben ist.

Die folgenden Optionen sind nur relevant für den Log-Server (Yule).

SetClientFromAccept = yes|no | Wenn ja (yes), dann die Adresse des Clients benutzen, wie sie dem Kernel bekannt ist (kann falsch sein, wenn z. B. NAT-Router en route). Sonst (Standard) den Namen benutzen, den der Client bekanntgibt, gegen die IP-Adresse prüfen, und immer akzeptieren (mit einer Warnung, wenn die Prüfung fehlschlägt).
SeverityLookup = Level | Level/Dringlichkeitsstufe für Meldung, wenn die oen erwähnte Prüfung fehlschlägt.
UseClientSeverity = yes|no | Wenn ja (yes), Nachrichten von Samhain nicht mit spezieller Dringlichkeitsstufe loggen.
UseClientClass = yes|no | Wenn ja (yes), Nachrichten von Samhain nicht mit spezieller Ereignisklasse loggen.
UseSeparateLogs = yes|no | Wenn ja (yes), Nachrichten von unterschiedlichen Clients nach unterschiedlichen Log-Dateien loggen (Name des Clients wird an Standard-Pfad angehängt).
SetClientTimeLimit = Sekunden | Maximale Zeit bis zur nächsten Meldung eines Clients (bei Überschreitung Alarm).
SetUseSocket = yes|no | Wenn ja (yes), ein Unix Domain Socket öffnen, um Yule Kommandos zu übergeben, die an Clients weitergeleitet werden sollen (wenn diese Kontakt zu Yule aufnehmen).
SetSocketAllowUid = UID | Der Benutzer, der Kommandos über o. g. Socket absetzen kann (Standard: 0 = root)
SetChrootDir = /Pfad | Falls diese Option gesetzt ist, macht der Server nach dem Start ein chroot /Pfad
SetStripDomain = yes|no | Wenn ja (yes), wird der Name des Clients ohne die Domäne geloggt (Standard: ja)
SetUDPActive = yes|no | Auch auf 514/udp (syslog port) auf Nachrichten von syslog-Dämonen warten

#### 8.10 Externe Skripte

In der Sektion [External] ist es möglich, externe Skripte oder Programme zu definieren, die zum Loggen benutzt werden können. Das Skript/Programm erhält jeweils eine Zeile mit Informationen, gefolgt von einer weiteren Zeile mit [EOF]. Die Optionen sind:

OpenCommand=/Pfad/zum/Skript | Beginnt einen Definitions-Block
SetType = log|srv | Mit log wird das Programm als Log-Möglichkeit definiert; mit srv (nur Yule) wird es aufgerufen, wenn sich der Status eines Clients ändert.
SetCommandline = Liste | Die Kommandozeile (also Argumente für das Skript)
SetEnviron = Variable=Wert | Umgebungsvariable (kann mehrfach benutzt werden)
SetChecksum = TIGER Prüfsumme | Tiger/192-Prüfsumme des Skripts (optional)
SetCredentials = Benutzer | Der Benutzer, als der das Skript ausgeführt werden soll.
SetFilterNot = Liste | Worte, die in der geloggten Nachricht nicht vorkommen sollen
SetFilterAnd = Liste | Worte, die alle in der geloggten Nachricht vorkommen müssen
SetFilterOr = Liste | Worte, von denen mindestens eines in der geloggten Nachricht vorkommen muss
SetDeadtime = Sekunden | Minimale Zeit zwischen zwei Aufrufen des Skripts
SetDefault = yes|no | Standard-Umgebung setzen (yes = ja) Die Standard-Umgebung ist: HOME aus /etc/passwd, SHELL=/bin/sh, PATH=/sbin:/usr/sbin:/bin:/usr/bin

#### 8.11 Clients

In der [Clients]-Sektion, die nur für den Server (Yule) relevant ist, hat jeder Samhain-Client einen Eintrag der Form:

    Client = Rechnername@abc@xyz

Rechnername ist dabei der volle Name (üblicherweise keine IP-Adresse), unter dem Yule den Client kennt. Falls Rechnername falsch ist, wird Yule folgende Fehlermeldung ausgeben: Invalid connection attempt: Not in client list, und wird in dieser Fehlermeldung auch sagen, welchen Namen es für den Client ermittelt hat: client="client.example.com".