All checks were successful
release-tag / release-image (push) Successful in 2m10s
4549 lines
91 KiB
Markdown
4549 lines
91 KiB
Markdown
# SIEM-lite Admin-Handbuch: Anlernphase, manuelle Bewertung und Lerneffekt
|
|
|
|
Stand: 2026-04-27
|
|
Zielgruppe: Administratoren ohne SIEM-/SOC-Vorerfahrung
|
|
Projekt: `siem-backend` / `SIEM-lite Security Operations`
|
|
|
|
---
|
|
|
|
## 1. Ziel dieses Dokuments
|
|
|
|
Dieses Dokument erklärt, wie die Software lernt, wie die Anlernphase funktioniert und wie man Detections manuell bewertet, ohne den Lerneffekt zu verfälschen.
|
|
|
|
Es richtet sich ausdrücklich an Administratoren, die die Software sicher im Alltag betreiben sollen. Der Fokus liegt nicht auf Go-Code, sondern auf dem praktischen Umgang mit der Oberfläche, den Bewertungen und den Auswirkungen auf Baseline, UEBA und Host-Risiko.
|
|
|
|
Nach dem Lesen sollte ein Admin verstehen:
|
|
|
|
- warum am Anfang viele Meldungen entstehen,
|
|
- welche Meldungen normal sind,
|
|
- welche Meldungen nicht einfach weggeklickt werden dürfen,
|
|
- wie die Status `plausible`, `legitimate`, `false_positive`, `suppressed`, `resolved` und `confirmed_incident` zu verwenden sind,
|
|
- wann eine Baseline lernen darf,
|
|
- wann eine Baseline nicht lernen darf,
|
|
- wie man Wartungsfenster, Patchtage und bekannte Sonderfälle korrekt bewertet,
|
|
- warum eine falsche Bewertung gefährlich sein kann,
|
|
- wie der Host Risk Score beeinflusst wird.
|
|
|
|
---
|
|
|
|
## 2. Grundprinzip der Software
|
|
|
|
SIEM-lite sammelt Windows-Events von Agents, speichert diese zentral und wertet sie regelmäßig über Regeln aus.
|
|
|
|
Es gibt grob vier Arten von Erkennung:
|
|
|
|
1. **Feste Regeln**
|
|
- z. B. viele fehlgeschlagene Logons, Reboot-Spikes, Password-Spray.
|
|
|
|
2. **Dynamische Regeln**
|
|
- Regeln, die ein Admin in der Weboberfläche selbst anlegt.
|
|
|
|
3. **Baseline-Regeln**
|
|
- statistische Erkennung von ungewöhnlich vielen Events im Vergleich zum gelernten Normalzustand.
|
|
|
|
4. **UEBA-Regeln**
|
|
- verhaltensbasierte Regeln, z. B. neuer Login-Kontext für Benutzer oder privilegierter Benutzer auf neuem Host.
|
|
|
|
Die Software ist kein fertiges „Wahrheitsorakel“. Sie liefert Hinweise. Ein Mensch muss bewerten, ob ein Hinweis legitim, plausibel, ein Fehlalarm oder ein echter Vorfall ist.
|
|
|
|
---
|
|
|
|
## 3. Was bedeutet „Anlernphase“?
|
|
|
|
Die Anlernphase ist der Zeitraum, in dem SIEM-lite sammelt, was in der Umgebung normal ist.
|
|
|
|
Beispiele:
|
|
|
|
- Welche EventIDs sendet ein bestimmter Host normalerweise?
|
|
- Wie viele Security-Events erzeugt ein Domain Controller typischerweise pro 5-Minuten-Fenster?
|
|
- Welche Benutzer melden sich normalerweise an welchen Hosts an?
|
|
- Von welchen Quell-IPs kommt ein Benutzer normalerweise?
|
|
- Welche Workstations sind für einen Benutzer bekannt?
|
|
- Welche privilegierten Benutzer arbeiten auf welchen Systemen?
|
|
|
|
Die Software baut daraus Baselines und bekannte Kontexte auf.
|
|
|
|
---
|
|
|
|
## 4. Warum ist die Anlernphase kritisch?
|
|
|
|
Während der Anlernphase entscheidet sich, was später als „normal“ gilt.
|
|
|
|
Wenn während der Anlernphase ein Sicherheitsvorfall passiert und dieser unkritisch eingelernt wird, kann die Software dieses Verhalten später als normal ansehen.
|
|
|
|
Beispiel:
|
|
|
|
Ein Angreifer nutzt nachts einen Admin-Account auf einem ungewöhnlichen Client. Wenn dieses Verhalten als normal eingelernt wird, kann später ein ähnlicher Zugriff weniger auffallen.
|
|
|
|
Deshalb ist wichtig:
|
|
|
|
- Die Anlernphase sollte bewusst begleitet werden.
|
|
- Auffällige Detections sollten nicht wahllos als legitim markiert werden.
|
|
- Confirmed Incidents dürfen nicht in die Baseline einfließen.
|
|
- Wartungsfenster sollten dokumentiert und korrekt bewertet werden.
|
|
|
|
---
|
|
|
|
## 5. Welche Lernmechanismen gibt es?
|
|
|
|
SIEM-lite hat mehrere Lernbereiche. Diese müssen getrennt verstanden werden.
|
|
|
|
---
|
|
|
|
# 6. Lernmechanismus 1: Event-Rate-Baseline
|
|
|
|
## 6.1 Zweck
|
|
|
|
Die Event-Rate-Baseline lernt, wie viele Events eines bestimmten Typs normalerweise auftreten.
|
|
|
|
Sie betrachtet Kombinationen aus:
|
|
|
|
```text
|
|
Host
|
|
Channel
|
|
EventID
|
|
Wochentag
|
|
Stunde
|
|
```
|
|
|
|
Beispiel:
|
|
|
|
```text
|
|
DC01
|
|
Security
|
|
4625
|
|
Montag
|
|
08:00 Uhr
|
|
```
|
|
|
|
Die Software lernt also nicht nur: „DC01 hat normalerweise 4625-Events“, sondern genauer: „DC01 hat montags um 08:00 Uhr normalerweise eine bestimmte Menge 4625-Events“.
|
|
|
|
---
|
|
|
|
## 6.2 Warum nach Wochentag und Stunde?
|
|
|
|
Viele Systeme haben zeitabhängige Muster.
|
|
|
|
Beispiele:
|
|
|
|
- morgens viele Logons,
|
|
- nachts Backup-Jobs,
|
|
- montags mehr Fehlversuche nach Passwortänderungen,
|
|
- Patchfenster am Mittwochabend,
|
|
- GPO-/Softwareverteilung morgens nach dem Einschalten vieler Clients,
|
|
- Monitoring-Jobs alle paar Minuten.
|
|
|
|
Ohne Zeitbezug würde die Baseline zu ungenau.
|
|
|
|
---
|
|
|
|
## 6.3 Was wird gespeichert?
|
|
|
|
In `baseline_event_stats` werden statistische Werte gespeichert:
|
|
|
|
| Wert | Bedeutung |
|
|
|---|---|
|
|
| `avg_count` | durchschnittliche Event-Anzahl |
|
|
| `stddev_count` | Standardabweichung |
|
|
| `sample_count` | Anzahl gelernter Samples |
|
|
| `m2_count` | Hilfswert für laufende Varianzberechnung |
|
|
| `last_updated` | letzter Lernzeitpunkt |
|
|
|
|
---
|
|
|
|
## 6.4 Wann lernt die Baseline?
|
|
|
|
Die Baseline wird regelmäßig durch diese Regel aktualisiert:
|
|
|
|
```text
|
|
baseline_update
|
|
```
|
|
|
|
Sie betrachtet das aktuelle Zeitfenster, z. B. 5 Minuten, zählt Events und aktualisiert die Statistik.
|
|
|
|
Default:
|
|
|
|
```text
|
|
BASELINE_WINDOW=5m
|
|
```
|
|
|
|
---
|
|
|
|
## 6.5 Wann erzeugt die Baseline einen Alarm?
|
|
|
|
Die Detection-Regel heißt:
|
|
|
|
```text
|
|
baseline_event_rate_anomaly
|
|
```
|
|
|
|
Sie erzeugt einen Alarm, wenn die aktuelle Event-Anzahl deutlich vom gelernten Normalwert abweicht.
|
|
|
|
Vereinfacht:
|
|
|
|
```text
|
|
aktueller Wert deutlich größer als gelernter Durchschnitt
|
|
```
|
|
|
|
Technisch wird ein Z-Score berechnet:
|
|
|
|
```text
|
|
z = (aktueller Wert - Durchschnitt) / Standardabweichung
|
|
```
|
|
|
|
---
|
|
|
|
## 6.6 Mindestvoraussetzungen für Baseline-Alarme
|
|
|
|
Ein Baseline-Alarm entsteht nicht sofort am ersten Tag. Die Software benötigt zuerst Samples.
|
|
|
|
Default-Werte:
|
|
|
|
| Parameter | Default | Bedeutung |
|
|
|---|---:|---|
|
|
| `BASELINE_MIN_SAMPLES` | `24` | mindestens 24 Vergleichswerte |
|
|
| `BASELINE_MIN_COUNT` | `10` | mindestens 10 Events im aktuellen Fenster |
|
|
| `BASELINE_MEDIUM_Z` | `2.5` | ab hier Medium |
|
|
| `BASELINE_HIGH_Z` | `4.0` | ab hier High |
|
|
|
|
Das bedeutet: Ein Eventtyp muss erst mehrfach beobachtet worden sein, bevor eine zuverlässige Abweichung erkannt werden kann.
|
|
|
|
---
|
|
|
|
## 6.7 Typisches Verhalten während der Anlernphase
|
|
|
|
In den ersten Stunden oder Tagen können folgende Effekte auftreten:
|
|
|
|
- noch keine Baseline-Alerts, weil `sample_count` zu niedrig ist,
|
|
- später plötzlich Baseline-Alerts, weil genug Samples vorhanden sind,
|
|
- einzelne Systeme wirken auffällig, obwohl sie nur besondere Aufgaben haben,
|
|
- Domain Controller erzeugen viel mehr Events als Clients,
|
|
- Patch-/Wartungstage erzeugen Sondermuster,
|
|
- neue Software erzeugt neue EventIDs oder neue Mengen.
|
|
|
|
Das ist normal.
|
|
|
|
---
|
|
|
|
## 6.8 Wie lange sollte die Baseline lernen?
|
|
|
|
Eine sinnvolle Mindestdauer hängt von der Umgebung ab.
|
|
|
|
Empfehlung:
|
|
|
|
| Umgebung | Mindest-Anlernzeit |
|
|
|---|---:|
|
|
| kleine Testumgebung | 2 bis 3 Tage |
|
|
| normale Büro-IT | 7 bis 14 Tage |
|
|
| größere Umgebung mit Wochenmustern | 14 bis 30 Tage |
|
|
| Umgebung mit Monatsjobs | mindestens 30 Tage |
|
|
|
|
Für produktive Sicherheitsbewertung sind 7 Tage oft das Minimum, weil damit jeder Wochentag einmal gesehen wurde.
|
|
|
|
Besser sind 14 bis 30 Tage.
|
|
|
|
---
|
|
|
|
# 7. Lernmechanismus 2: UEBA-Baseline
|
|
|
|
## 7.1 Zweck
|
|
|
|
UEBA steht für User and Entity Behavior Analytics.
|
|
|
|
SIEM-lite lernt Benutzerkontexte, also welche Benutzer sich normalerweise wie und wo anmelden.
|
|
|
|
Ein Kontext besteht aus:
|
|
|
|
```text
|
|
Benutzer
|
|
Host
|
|
Quell-IP
|
|
Workstation
|
|
```
|
|
|
|
Beispiel:
|
|
|
|
```text
|
|
max.mustermann
|
|
CLIENT042
|
|
10.2.40.15
|
|
CLIENT042
|
|
```
|
|
|
|
---
|
|
|
|
## 7.2 Welche Events nutzt UEBA?
|
|
|
|
UEBA nutzt erfolgreiche Logons:
|
|
|
|
```text
|
|
Security EventID 4624
|
|
```
|
|
|
|
Die Software ignoriert dabei leere Benutzer, `-` und Maschinenkonten.
|
|
|
|
Empfohlen ist zusätzlich, technische Accounts wie `SYSTEM`, `LOCAL SERVICE`, `NETWORK SERVICE` und ähnliche zu ignorieren.
|
|
|
|
---
|
|
|
|
## 7.3 Welche Tabelle wird genutzt?
|
|
|
|
UEBA schreibt bekannte Kontexte in:
|
|
|
|
```text
|
|
ueba_user_baseline
|
|
```
|
|
|
|
Wichtige Felder:
|
|
|
|
| Feld | Bedeutung |
|
|
|---|---|
|
|
| `username` | Benutzer |
|
|
| `hostname` | Zielhost |
|
|
| `src_ip` | Quell-IP |
|
|
| `workstation` | Workstation |
|
|
| `first_seen` | erster bekannter Zeitpunkt |
|
|
| `last_seen` | letzter bekannter Zeitpunkt |
|
|
| `seen_count` | Häufigkeit |
|
|
|
|
---
|
|
|
|
## 7.4 Wie funktioniert UEBA-Lernen?
|
|
|
|
Die Regel:
|
|
|
|
```text
|
|
ueba_update
|
|
```
|
|
|
|
übernimmt erfolgreiche Logons in die UEBA-Baseline.
|
|
|
|
Wenn ein Kontext neu ist:
|
|
|
|
```text
|
|
first_seen = jetzt
|
|
last_seen = jetzt
|
|
seen_count = Anzahl
|
|
```
|
|
|
|
Wenn ein Kontext bekannt ist:
|
|
|
|
```text
|
|
last_seen wird aktualisiert
|
|
seen_count wird erhöht
|
|
```
|
|
|
|
---
|
|
|
|
## 7.5 Warum ist die Reihenfolge wichtig?
|
|
|
|
Im Detection-Loop sollte erst erkannt und danach gelernt werden.
|
|
|
|
Empfohlene Reihenfolge:
|
|
|
|
```text
|
|
ueba_admin_new_host
|
|
ueba_offhours_login
|
|
ueba_first_privileged_use
|
|
ueba_new_user_context
|
|
ueba_update
|
|
```
|
|
|
|
Wenn `ueba_update` zu früh läuft, würde ein neuer Kontext zuerst gelernt und danach nicht mehr als neu erkannt.
|
|
|
|
---
|
|
|
|
## 7.6 Was erkennt `ueba_new_user_context`?
|
|
|
|
Diese Regel erkennt, wenn ein Benutzer sich in einem neuen Kontext anmeldet.
|
|
|
|
Beispiel:
|
|
|
|
Benutzer `max.mustermann` arbeitet normalerweise auf `CLIENT042`, meldet sich aber plötzlich per RDP von einer unbekannten Workstation auf `SERVER17` an.
|
|
|
|
Das kann legitim sein, aber es ist erklärungsbedürftig.
|
|
|
|
---
|
|
|
|
## 7.7 Was erkennt `ueba_admin_new_host`?
|
|
|
|
Diese Regel ist besonders wichtig.
|
|
|
|
Sie erkennt, wenn ein privilegierter Benutzer sich erstmals auf einem Host anmeldet.
|
|
|
|
Privilegierte Benutzer werden erkannt über:
|
|
|
|
- Eintrag in `privileged_users`,
|
|
- Namensmuster wie `adm-*`, `*-adm`, `*.adm`.
|
|
|
|
Beispiel:
|
|
|
|
```text
|
|
adm.max meldet sich erstmals auf CLIENT099 an
|
|
```
|
|
|
|
Das ist oft relevanter als ein normaler Benutzerkontext.
|
|
|
|
---
|
|
|
|
## 7.8 Was erkennt `ueba_offhours_login`?
|
|
|
|
Diese Regel erkennt Anmeldungen außerhalb der Arbeitszeit.
|
|
|
|
Empfohlene Arbeitszeit im aktuellen Konzept:
|
|
|
|
```text
|
|
06:00 bis 20:00 Uhr
|
|
```
|
|
|
|
Problematisch sind insbesondere:
|
|
|
|
- Admin-Logins nachts,
|
|
- RDP-Logins nach Feierabend,
|
|
- neue Quell-IP plus Off-Hours,
|
|
- vorherige Fehlversuche plus erfolgreicher Login,
|
|
- Logins auf Domain Controllern oder Servern.
|
|
|
|
Wichtig: Technische Accounts wie `SYSTEM` müssen ausgeschlossen werden, sonst flutet diese Regel.
|
|
|
|
---
|
|
|
|
## 7.9 Was erkennt `ueba_first_privileged_use`?
|
|
|
|
Diese Regel erkennt, wenn ein Benutzer erstmals privilegierte Rechte nutzt.
|
|
|
|
Basis ist:
|
|
|
|
```text
|
|
Security EventID 4672
|
|
```
|
|
|
|
Event 4672 bedeutet, dass einem neuen Logon besondere Rechte zugewiesen wurden.
|
|
|
|
Diese Regel braucht eine eigene Baseline:
|
|
|
|
```text
|
|
user_privilege_baseline
|
|
```
|
|
|
|
Ohne diese Baseline würde derselbe Benutzer immer wieder als „erstmals privilegiert“ auffallen.
|
|
|
|
---
|
|
|
|
# 8. Lernmechanismus 3: Dynamic Rules
|
|
|
|
## 8.1 Lernen Dynamic Rules?
|
|
|
|
Dynamische Regeln lernen nicht im statistischen Sinne.
|
|
|
|
Sie erkennen nach festen Bedingungen:
|
|
|
|
- bestimmte EventIDs,
|
|
- bestimmte Channels,
|
|
- bestimmte Felder,
|
|
- bestimmte Schwellenwerte.
|
|
|
|
Beispiel:
|
|
|
|
```text
|
|
Wenn Security 1102 kommt, melde critical.
|
|
```
|
|
|
|
Dynamic Rules können aber durch Bewertung und Suppression indirekt beeinflusst werden.
|
|
|
|
---
|
|
|
|
## 8.2 Wie beeinflusst Bewertung Dynamic Rules?
|
|
|
|
Wenn eine Detection aus einer dynamischen Regel als `false_positive`, `legitimate`, `plausible`, `resolved` oder `suppressed` bewertet wird, beeinflusst das vor allem:
|
|
|
|
- Host Risk Score,
|
|
- SOC-Übersicht,
|
|
- Arbeitsliste der Analysten.
|
|
|
|
Die Regel selbst wird dadurch nicht geändert.
|
|
|
|
Wenn eine dynamische Regel dauerhaft zu viele Meldungen erzeugt, muss die Regel angepasst werden:
|
|
|
|
- EventID einschränken,
|
|
- Channel korrigieren,
|
|
- Match Field setzen,
|
|
- Threshold erhöhen,
|
|
- Suppress-Zeit setzen,
|
|
- Regel deaktivieren.
|
|
|
|
---
|
|
|
|
# 9. Was bedeutet manuelle Bewertung?
|
|
|
|
Manuelle Bewertung bedeutet: Ein Admin oder Analyst entscheidet, wie eine Detection fachlich einzuordnen ist.
|
|
|
|
Eine Detection ist zunächst nur ein Hinweis.
|
|
|
|
Beispiel:
|
|
|
|
```text
|
|
UEBA: Privilegierter Benutzer adm.max meldet sich erstmals auf Host CLIENT099 an
|
|
```
|
|
|
|
Mögliche Bewertungen:
|
|
|
|
- echter Vorfall,
|
|
- legitime Admin-Arbeit,
|
|
- plausibel wegen Rollout,
|
|
- Fehlalarm,
|
|
- bereits erledigt,
|
|
- künftig unterdrücken.
|
|
|
|
---
|
|
|
|
## 10. Warum ist manuelle Bewertung wichtig?
|
|
|
|
Die Bewertung beeinflusst:
|
|
|
|
1. die SOC-Arbeitsliste,
|
|
2. den Host Risk Score,
|
|
3. die Qualität der Baseline,
|
|
4. die zukünftige Alarmflut,
|
|
5. die Nachvollziehbarkeit für andere Admins,
|
|
6. die Entscheidung, ob Verhalten gelernt oder ausgeschlossen wird.
|
|
|
|
Eine falsche Bewertung kann gefährlich sein.
|
|
|
|
Beispiele:
|
|
|
|
| Falsche Bewertung | Risiko |
|
|
|---|---|
|
|
| Angriff als `legitimate` markiert | Verhalten verschwindet aus Risk Score |
|
|
| Incident nicht als `confirmed_incident` markiert | Baseline lernt möglicherweise bösartiges Verhalten |
|
|
| Wartungsfenster nicht dokumentiert | künftige Admins verstehen Detections nicht |
|
|
| Alles als `false_positive` markiert | echte Auffälligkeiten werden übersehen |
|
|
| Zu viele Suppressions | blinde Flecken entstehen |
|
|
|
|
---
|
|
|
|
# 11. Statusmodell
|
|
|
|
SIEM-lite verwendet mehrere Status. Diese sollten konsequent verwendet werden.
|
|
|
|
---
|
|
|
|
## 11.1 `open`
|
|
|
|
## Bedeutung
|
|
|
|
Die Detection ist neu und noch nicht bewertet.
|
|
|
|
## Wann verwenden?
|
|
|
|
Normalerweise automatisch beim Erzeugen einer Detection.
|
|
|
|
## Admin-Aktion
|
|
|
|
Prüfen:
|
|
|
|
- Welche Regel hat ausgelöst?
|
|
- Welcher Host ist betroffen?
|
|
- Welcher Benutzer ist betroffen?
|
|
- Welche Events liegen zugrunde?
|
|
- Gibt es zeitgleichen Kontext?
|
|
- Ist es ein Wartungsfenster?
|
|
- Gibt es mehrere ähnliche Detections?
|
|
|
|
## Wirkung
|
|
|
|
- zählt im Host Risk Score,
|
|
- erscheint in offenen Listen,
|
|
- bleibt prüfbedürftig.
|
|
|
|
---
|
|
|
|
## 11.2 `acknowledged`
|
|
|
|
## Bedeutung
|
|
|
|
Die Detection wurde gesehen, aber noch nicht abschließend bewertet.
|
|
|
|
## Wann verwenden?
|
|
|
|
Wenn ein Admin signalisiert:
|
|
|
|
```text
|
|
Ich habe es gesehen, prüfe aber später weiter.
|
|
```
|
|
|
|
## Beispiel
|
|
|
|
Ein Server meldet viele fehlgeschlagene Logons. Der Admin hat gesehen, dass es relevant sein könnte, muss aber erst Logs auf dem Quellsystem prüfen.
|
|
|
|
## Wirkung
|
|
|
|
- zählt weiterhin im Host Risk Score,
|
|
- zählt schwächer als `investigating`,
|
|
- bleibt offen genug für Nachverfolgung.
|
|
|
|
---
|
|
|
|
## 11.3 `investigating`
|
|
|
|
## Bedeutung
|
|
|
|
Die Detection wird aktiv untersucht.
|
|
|
|
## Wann verwenden?
|
|
|
|
Wenn konkrete Prüfung läuft:
|
|
|
|
- Loganalyse,
|
|
- Rückfrage beim Benutzer,
|
|
- Prüfung von Quell-IP,
|
|
- Prüfung von RDP-/VPN-/Firewall-Logs,
|
|
- Prüfung auf kompromittierten Account.
|
|
|
|
## Wirkung
|
|
|
|
- zählt stärker im Host Risk Score,
|
|
- zeigt im SOC-Dashboard erhöhte Relevanz,
|
|
- signalisiert anderen Admins: Nicht ignorieren.
|
|
|
|
---
|
|
|
|
## 11.4 `plausible`
|
|
|
|
## Bedeutung
|
|
|
|
Die Detection sieht nachvollziehbar aus, ist aber nicht zwingend dauerhaft legitim.
|
|
|
|
`plausible` bedeutet:
|
|
|
|
```text
|
|
Das passt wahrscheinlich zum Kontext, soll aber nicht als dauerhaft normaler Zustand betrachtet werden.
|
|
```
|
|
|
|
## Typische Fälle
|
|
|
|
- Patchday,
|
|
- Software-Rollout,
|
|
- einmalige Migration,
|
|
- einmalige Admin-Aktion,
|
|
- Inventarisierung,
|
|
- Testlauf,
|
|
- neue GPO-Verteilung,
|
|
- einmaliges Wartungsfenster.
|
|
|
|
## Beispiel
|
|
|
|
```text
|
|
reboot_spike auf 200 Clients während Patchfenster
|
|
```
|
|
|
|
Das ist plausibel, aber nicht automatisch dauerhaft normal.
|
|
|
|
## Wirkung
|
|
|
|
- wird aus Host Risk Score ausgeschlossen,
|
|
- bleibt historisch nachvollziehbar,
|
|
- sollte mit Notiz versehen werden,
|
|
- sollte nicht blind als dauerhafte Legitimität gelten.
|
|
|
|
## Wichtig
|
|
|
|
`plausible` ist oft die beste Bewertung für temporäre Sonderlagen.
|
|
|
|
---
|
|
|
|
## 11.5 `legitimate`
|
|
|
|
## Bedeutung
|
|
|
|
Die Detection ist fachlich korrekt, aber das Verhalten ist dauerhaft oder regelmäßig legitim.
|
|
|
|
`legitimate` bedeutet:
|
|
|
|
```text
|
|
Dieses Verhalten ist bekannt, erwartet und akzeptiert.
|
|
```
|
|
|
|
## Typische Fälle
|
|
|
|
- bekannter Admin-Jump-Host,
|
|
- legitimer Service-Account,
|
|
- regelmäßiger Backup-Job,
|
|
- bekannter Monitoring-Login,
|
|
- geplanter nächtlicher Wartungsprozess,
|
|
- Admin meldet sich regelmäßig auf einem bestimmten Server an.
|
|
|
|
## Wirkung
|
|
|
|
- wird aus Host Risk Score ausgeschlossen,
|
|
- setzt `is_legitimate = true`,
|
|
- kann zusammen mit Suppression oder Baseline-Exclusion genutzt werden.
|
|
|
|
## Vorsicht
|
|
|
|
Nicht zu schnell `legitimate` verwenden.
|
|
|
|
Eine einmalige plausible Aktion ist nicht automatisch dauerhaft legitim.
|
|
|
|
---
|
|
|
|
## 11.6 `false_positive`
|
|
|
|
## Bedeutung
|
|
|
|
Die Detection ist ein Fehlalarm.
|
|
|
|
Das heißt:
|
|
|
|
```text
|
|
Die Regel hat fachlich falsch oder irrelevant ausgelöst.
|
|
```
|
|
|
|
## Typische Fälle
|
|
|
|
- Parser erkennt falsches Feld,
|
|
- Event wird falsch interpretiert,
|
|
- Regel ist zu breit,
|
|
- Testdaten,
|
|
- bekannter technischer Account wurde nicht ausgeschlossen,
|
|
- LogonType wurde nicht gefiltert,
|
|
- Event stammt nicht aus realem Benutzerverhalten.
|
|
|
|
## Wirkung
|
|
|
|
- wird aus Host Risk Score ausgeschlossen,
|
|
- setzt `is_false_positive = true`,
|
|
- sollte Anlass sein, die Regel zu verbessern.
|
|
|
|
## Wichtig
|
|
|
|
`false_positive` sollte nicht für echte, aber harmlose Ereignisse verwendet werden.
|
|
|
|
Für echte, aber harmlose Ereignisse besser:
|
|
|
|
```text
|
|
plausible
|
|
oder
|
|
legitimate
|
|
```
|
|
|
|
---
|
|
|
|
## 11.7 `resolved`
|
|
|
|
## Bedeutung
|
|
|
|
Die Detection wurde bearbeitet und abgeschlossen.
|
|
|
|
## Wann verwenden?
|
|
|
|
Wenn:
|
|
|
|
- die Ursache gefunden wurde,
|
|
- keine weitere Aktion nötig ist,
|
|
- ein Incident abgearbeitet wurde,
|
|
- eine legitime Ursache dokumentiert wurde,
|
|
- technische Korrektur erfolgt ist.
|
|
|
|
## Wirkung
|
|
|
|
- wird aus Host Risk Score ausgeschlossen,
|
|
- bleibt historisch sichtbar,
|
|
- eignet sich für abgeschlossene Einzelfälle.
|
|
|
|
---
|
|
|
|
## 11.8 `suppressed`
|
|
|
|
## Bedeutung
|
|
|
|
Die Detection wird bewusst unterdrückt oder soll nicht mehr aktiv betrachtet werden.
|
|
|
|
## Wann verwenden?
|
|
|
|
Wenn das Verhalten bekannt ist und künftig nicht mehr alarmieren soll.
|
|
|
|
Beispiele:
|
|
|
|
- bekannter technischer Prozess,
|
|
- bewusst akzeptiertes Rauschen,
|
|
- System außerhalb Überwachungsumfang,
|
|
- Testhost,
|
|
- bestimmte Regel auf bestimmtem Host irrelevant.
|
|
|
|
## Wirkung
|
|
|
|
- wird aus Host Risk Score ausgeschlossen,
|
|
- kann zusätzlich eine Detection-Suppression erzeugen,
|
|
- reduziert künftige Meldungen.
|
|
|
|
## Vorsicht
|
|
|
|
Suppression erzeugt blinde Flecken.
|
|
|
|
Vor Suppression immer prüfen:
|
|
|
|
- Ist die Regel auf diesem Host wirklich irrelevant?
|
|
- Soll nur diese Regel unterdrückt werden?
|
|
- Soll nur ein EventID-Typ unterdrückt werden?
|
|
- Soll die Suppression zeitlich begrenzt sein?
|
|
- Könnte ein Angreifer dieses Verhalten ausnutzen?
|
|
|
|
---
|
|
|
|
## 11.9 `confirmed_incident`
|
|
|
|
## Bedeutung
|
|
|
|
Die Detection ist ein bestätigter Sicherheitsvorfall.
|
|
|
|
## Wann verwenden?
|
|
|
|
Wenn es Hinweise oder Belege gibt für:
|
|
|
|
- kompromittierten Account,
|
|
- erfolgreiche unberechtigte Anmeldung,
|
|
- Malware,
|
|
- unautorisierte Service-Installation,
|
|
- gelöschte Security Logs,
|
|
- laterale Bewegung,
|
|
- verdächtige Admin-Aktivität,
|
|
- echter Password-Spray mit Treffer.
|
|
|
|
## Wirkung
|
|
|
|
- erhöht Host Risk Score stark,
|
|
- zählt als bestätigter Incident,
|
|
- verhindert Baseline-Lernen für passende Events im Fenster,
|
|
- erzeugt automatisch Baseline-Exclusion für 7 Tage, sofern keine andere Baseline-Aktion gewählt wird.
|
|
|
|
## Wichtig
|
|
|
|
`confirmed_incident` ist der wichtigste Status, um gefährliches Verhalten nicht als normal einzulernen.
|
|
|
|
---
|
|
|
|
# 12. Welche Bewertung beeinflusst den Lerneffekt?
|
|
|
|
Nicht jeder Status beeinflusst Lernen gleich.
|
|
|
|
## 12.1 Einfluss auf Host Risk Score
|
|
|
|
Diese Status werden aus dem Host Risk Score ausgeschlossen:
|
|
|
|
```text
|
|
false_positive
|
|
suppressed
|
|
legitimate
|
|
resolved
|
|
plausible
|
|
```
|
|
|
|
Diese Status bleiben relevant:
|
|
|
|
```text
|
|
open
|
|
acknowledged
|
|
investigating
|
|
confirmed_incident
|
|
```
|
|
|
|
`confirmed_incident` erhöht den Risk Score besonders stark.
|
|
|
|
---
|
|
|
|
## 12.2 Einfluss auf Baseline-Lernen
|
|
|
|
Baseline-Lernen wird beeinflusst durch:
|
|
|
|
1. `baseline_exclusions`
|
|
2. `confirmed_incident`
|
|
3. manuelle Baseline-Aktionen im UI
|
|
|
|
Wichtig:
|
|
|
|
Eine Bewertung als `legitimate` oder `plausible` verhindert nicht automatisch immer das zukünftige Lernen aller ähnlichen Events, außer es wird zusätzlich eine Baseline-Exclusion gesetzt.
|
|
|
|
---
|
|
|
|
## 12.3 Einfluss auf UEBA-Lernen
|
|
|
|
UEBA-Lernen passiert über:
|
|
|
|
```text
|
|
ueba_update
|
|
```
|
|
|
|
Dieses lernt erfolgreiche Logon-Kontexte.
|
|
|
|
Die aktuelle Bewertung einer Detection ändert nicht automatisch rückwirkend die UEBA-Baseline.
|
|
|
|
Das bedeutet:
|
|
|
|
Wenn ein verdächtiger Login bereits in `ueba_user_baseline` eingelernt wurde, muss man ihn gegebenenfalls manuell aus der Baseline entfernen oder die Logik erweitern.
|
|
|
|
---
|
|
|
|
## 12.4 Einfluss auf Dynamic Rules
|
|
|
|
Manuelle Bewertung ändert eine Dynamic Rule nicht automatisch.
|
|
|
|
Wenn eine Dynamic Rule zu breit ist, muss sie angepasst werden.
|
|
|
|
---
|
|
|
|
# 13. Baseline-Aktionen im UI
|
|
|
|
In der Detection-Bewertung gibt es eine Baseline-Auswahl:
|
|
|
|
```text
|
|
keine Änderung
|
|
nicht lernen: 24h
|
|
nicht lernen: 7 Tage
|
|
nicht lernen: 30 Tage
|
|
nicht lernen: dauerhaft
|
|
```
|
|
|
|
Diese Aktionen erzeugen Einträge in:
|
|
|
|
```text
|
|
baseline_exclusions
|
|
```
|
|
|
|
---
|
|
|
|
## 13.1 `keine Änderung`
|
|
|
|
## Bedeutung
|
|
|
|
Die Bewertung beeinflusst die Baseline nicht direkt.
|
|
|
|
## Wann verwenden?
|
|
|
|
Wenn:
|
|
|
|
- die Detection nicht aus der Baseline-Regel stammt,
|
|
- die Baseline weiter normal lernen soll,
|
|
- das Verhalten künftig durchaus als normal gelten darf,
|
|
- keine Gefahr besteht, dass ein Incident eingelernt wird.
|
|
|
|
---
|
|
|
|
## 13.2 `nicht lernen: 24h`
|
|
|
|
## Bedeutung
|
|
|
|
Für passende Host/Channel/EventID-Kombination wird 24 Stunden nicht gelernt.
|
|
|
|
## Wann verwenden?
|
|
|
|
- kurzer Test,
|
|
- kleines Wartungsfenster,
|
|
- einmaliger Rollout,
|
|
- temporärer Zustand,
|
|
- kurze Störung.
|
|
|
|
## Beispiel
|
|
|
|
```text
|
|
Ein Client erzeugt wegen Testkonfiguration ungewöhnlich viele Events.
|
|
```
|
|
|
|
---
|
|
|
|
## 13.3 `nicht lernen: 7 Tage`
|
|
|
|
## Bedeutung
|
|
|
|
Die Baseline lernt eine Woche lang nicht für diese Kombination.
|
|
|
|
## Wann verwenden?
|
|
|
|
- Patchwoche,
|
|
- Migrationsphase,
|
|
- bekannter Vorfall,
|
|
- größere Umstellung,
|
|
- temporäre Fehlkonfiguration.
|
|
|
|
## Beispiel
|
|
|
|
```text
|
|
Ein neues Login-Script erzeugt eine Woche lang erhöhte Event-Mengen, bis es korrigiert wird.
|
|
```
|
|
|
|
---
|
|
|
|
## 13.4 `nicht lernen: 30 Tage`
|
|
|
|
## Bedeutung
|
|
|
|
Ein Monat lang wird nicht gelernt.
|
|
|
|
## Wann verwenden?
|
|
|
|
- längerer Parallelbetrieb,
|
|
- größere Migration,
|
|
- unsicherer Zustand,
|
|
- neue Infrastrukturphase, deren Normalität noch nicht bewertet ist.
|
|
|
|
## Vorsicht
|
|
|
|
30 Tage sind lang. Nicht leichtfertig verwenden.
|
|
|
|
---
|
|
|
|
## 13.5 `nicht lernen: dauerhaft`
|
|
|
|
## Bedeutung
|
|
|
|
Die Kombination wird dauerhaft nicht in die Baseline übernommen.
|
|
|
|
## Wann verwenden?
|
|
|
|
Nur wenn klar ist:
|
|
|
|
- diese Eventklasse ist für Baseline-Lernen ungeeignet,
|
|
- der Host erzeugt absichtlich untypisches Verhalten,
|
|
- das Ereignis soll nie als Normalzustand betrachtet werden,
|
|
- es handelt sich um dauerhaftes Rauschen.
|
|
|
|
## Vorsicht
|
|
|
|
Dauerhafte Ausschlüsse können Erkennungsqualität reduzieren.
|
|
|
|
---
|
|
|
|
# 14. Detection-Suppression im UI
|
|
|
|
Neben Baseline-Aktionen gibt es:
|
|
|
|
```text
|
|
künftig unterdrücken
|
|
24h
|
|
7 Tage
|
|
30 Tage
|
|
dauerhaft
|
|
```
|
|
|
|
Das betrifft nicht die Baseline, sondern künftige Detections.
|
|
|
|
---
|
|
|
|
## 14.1 Unterschied zwischen Suppression und Baseline-Exclusion
|
|
|
|
| Mechanismus | Wirkung |
|
|
|---|---|
|
|
| Suppression | verhindert künftige Detections |
|
|
| Baseline-Exclusion | verhindert Lernen in der Baseline |
|
|
| Status `plausible` | bewertet aktuelle Detection |
|
|
| Status `legitimate` | bewertet aktuelle Detection als legitim |
|
|
| Status `false_positive` | bewertet aktuelle Detection als Fehlalarm |
|
|
|
|
Diese Dinge sind nicht identisch.
|
|
|
|
---
|
|
|
|
## 14.2 Beispiel
|
|
|
|
Ein Patchday erzeugt viele `reboot_spike`-Meldungen.
|
|
|
|
Mögliche Bewertung:
|
|
|
|
```text
|
|
Status: plausible
|
|
Notiz: Patchday April 2026
|
|
Baseline: nicht lernen: 24h
|
|
Suppression: optional 24h
|
|
```
|
|
|
|
Damit wird:
|
|
|
|
- die aktuelle Detection aus dem Risiko genommen,
|
|
- dokumentiert, warum sie auftrat,
|
|
- verhindert, dass das Patchday-Verhalten als Normalzustand gelernt wird,
|
|
- optional weitere identische Meldungen für 24h reduziert.
|
|
|
|
---
|
|
|
|
# 15. Empfohlener Ablauf während der Anlernphase
|
|
|
|
## 15.1 Phase 0: Vorbereitung
|
|
|
|
Vor dem produktiven Start prüfen:
|
|
|
|
- Agents liefern Events?
|
|
- Zeiten stimmen?
|
|
- Zeitzone ist korrekt?
|
|
- Domain Controller, Server und Clients melden?
|
|
- Security Channel wird korrekt übertragen?
|
|
- Event XML wird korrekt normalisiert?
|
|
- `target_user`, `subject_user`, `src_ip`, `logon_type` werden gefüllt?
|
|
- technische Accounts werden ausgeschlossen?
|
|
- Privileged Users sind gepflegt?
|
|
- bekannte Service Accounts sind bekannt?
|
|
- Patchfenster sind dokumentiert?
|
|
|
|
---
|
|
|
|
## 15.2 Phase 1: Erste 24 Stunden
|
|
|
|
Ziel:
|
|
|
|
```text
|
|
Datenqualität prüfen, nicht sofort hart alarmieren.
|
|
```
|
|
|
|
Aufgaben:
|
|
|
|
- `/ui/events` prüfen.
|
|
- Sind EventIDs plausibel?
|
|
- Sind Hostnamen korrekt?
|
|
- Werden Domain Controller anders sichtbar als Clients?
|
|
- Gibt es Encoding-Probleme?
|
|
- Werden `SYSTEM`-Logons ausgeschlossen?
|
|
- Werden Maschinenkonten ignoriert?
|
|
- Sind `4624`, `4625`, `4672` sinnvoll befüllt?
|
|
- Erste Dynamic Rules vorsichtig aktivieren.
|
|
|
|
Bewertung:
|
|
|
|
- technische Fehlalarme als `false_positive`,
|
|
- normale Start-/Patch-/Rollout-Effekte als `plausible`,
|
|
- echte Auffälligkeiten als `investigating`,
|
|
- bestätigte Vorfälle als `confirmed_incident`.
|
|
|
|
---
|
|
|
|
## 15.3 Phase 2: Tag 2 bis Tag 7
|
|
|
|
Ziel:
|
|
|
|
```text
|
|
Normale Tagesmuster verstehen.
|
|
```
|
|
|
|
Aufgaben:
|
|
|
|
- täglich offene Detections prüfen,
|
|
- wiederkehrende False Positives identifizieren,
|
|
- Dynamic Rules nachschärfen,
|
|
- technische Accounts ergänzen,
|
|
- bekannte Wartungsjobs dokumentieren,
|
|
- Privileged Users vervollständigen,
|
|
- Host Risk Scores beobachten.
|
|
|
|
Bewertung:
|
|
|
|
- nicht alles unterdrücken,
|
|
- lieber Notizen setzen,
|
|
- bei Wartung `plausible`,
|
|
- bei dauerhaft bekannten Mustern `legitimate`,
|
|
- bei Regelproblemen `false_positive`.
|
|
|
|
---
|
|
|
|
## 15.4 Phase 3: Woche 2 bis Woche 4
|
|
|
|
Ziel:
|
|
|
|
```text
|
|
Wochenmuster stabilisieren.
|
|
```
|
|
|
|
Aufgaben:
|
|
|
|
- Baseline-Anomalien ernsthaft bewerten,
|
|
- wiederkehrende Muster prüfen,
|
|
- dauerhafte Ausnahmen bewusst setzen,
|
|
- Suppressions aufräumen,
|
|
- echte Admin-Jump-Hosts dokumentieren,
|
|
- Service Accounts von echten Benutzern trennen,
|
|
- kritische Dynamic Rules finalisieren.
|
|
|
|
Bewertung:
|
|
|
|
- wiederkehrende legitime Jobs: `legitimate`,
|
|
- einmalige Wartung: `plausible`,
|
|
- bestätigte Incidents: `confirmed_incident`,
|
|
- schlechte Regel: `false_positive` und Regel korrigieren.
|
|
|
|
---
|
|
|
|
## 15.5 Phase 4: Regelbetrieb
|
|
|
|
Ziel:
|
|
|
|
```text
|
|
Tägliche Sicherheitsüberwachung.
|
|
```
|
|
|
|
Aufgaben:
|
|
|
|
- offene High/Critical Detections prüfen,
|
|
- Host Risk Score prüfen,
|
|
- confirmed incidents nachverfolgen,
|
|
- neue Dynamic Rules bei Bedarf erstellen,
|
|
- Baseline-Exclusions regelmäßig prüfen,
|
|
- Suppressions regelmäßig prüfen.
|
|
|
|
---
|
|
|
|
# 16. Praktische Bewertungsentscheidung
|
|
|
|
## 16.1 Entscheidungsbaum
|
|
|
|
Bei jeder Detection fragen:
|
|
|
|
```text
|
|
1. Ist das Ereignis technisch korrekt erkannt?
|
|
```
|
|
|
|
Wenn nein:
|
|
|
|
```text
|
|
false_positive
|
|
Regel/Parser korrigieren
|
|
```
|
|
|
|
Wenn ja:
|
|
|
|
```text
|
|
2. Ist das Verhalten erwartet?
|
|
```
|
|
|
|
Wenn nein oder unklar:
|
|
|
|
```text
|
|
investigating
|
|
```
|
|
|
|
Wenn ja:
|
|
|
|
```text
|
|
3. Ist es einmalig/temporär oder dauerhaft normal?
|
|
```
|
|
|
|
Temporär:
|
|
|
|
```text
|
|
plausible
|
|
Notiz setzen
|
|
ggf. Baseline nicht lernen 24h/7d
|
|
```
|
|
|
|
Dauerhaft normal:
|
|
|
|
```text
|
|
legitimate
|
|
ggf. Suppression oder Regelanpassung
|
|
```
|
|
|
|
Wenn bestätigt bösartig:
|
|
|
|
```text
|
|
confirmed_incident
|
|
Baseline nicht lernen
|
|
Incident-Prozess starten
|
|
```
|
|
|
|
---
|
|
|
|
## 16.2 Kurzmatrix
|
|
|
|
| Situation | Status | Baseline-Aktion | Suppression |
|
|
|---|---|---|---|
|
|
| echter Angriff | `confirmed_incident` | nicht lernen 7d/30d | nein |
|
|
| unklar, wird geprüft | `investigating` | keine oder nicht lernen 24h | nein |
|
|
| Patchday | `plausible` | nicht lernen 24h | optional 24h |
|
|
| geplanter Rollout | `plausible` | nicht lernen 24h/7d | optional |
|
|
| dauerhafter Backup-Job | `legitimate` | ggf. dauerhaft nicht lernen | ggf. dauerhaft |
|
|
| Parserfehler | `false_positive` | keine | nein, Regel fixen |
|
|
| Regel zu breit | `false_positive` | keine | nein, Regel anpassen |
|
|
| Testsystem rauscht | `suppressed` | optional | ja |
|
|
| Vorfall abgeschlossen | `resolved` | abhängig vom Fall | abhängig vom Fall |
|
|
|
|
---
|
|
|
|
# 17. Beispiele aus dem Alltag
|
|
|
|
---
|
|
|
|
## 17.1 Beispiel: Patchday erzeugt Reboot-Spikes
|
|
|
|
Detection:
|
|
|
|
```text
|
|
reboot_spike auf vielen Clients
|
|
```
|
|
|
|
Analyse:
|
|
|
|
- Zeitpunkt passt zum Patchfenster.
|
|
- Viele Clients betroffen.
|
|
- Keine weiteren verdächtigen Events.
|
|
- Reboots sind erwartet.
|
|
|
|
Bewertung:
|
|
|
|
```text
|
|
Status: plausible
|
|
Notiz: Patchday April 2026, WSUS-Rollout
|
|
Baseline: nicht lernen: 24h
|
|
Suppression: optional 24h
|
|
```
|
|
|
|
Nicht verwenden:
|
|
|
|
```text
|
|
false_positive
|
|
```
|
|
|
|
Warum?
|
|
|
|
Die Detection war fachlich korrekt. Es war kein Fehlalarm, sondern erwartetes Verhalten.
|
|
|
|
---
|
|
|
|
## 17.2 Beispiel: SYSTEM flutet Off-Hours-Login
|
|
|
|
Detection:
|
|
|
|
```text
|
|
ueba_offhours_login: Benutzer SYSTEM auf SERVER01
|
|
```
|
|
|
|
Analyse:
|
|
|
|
- SYSTEM ist technischer Account.
|
|
- Solche Logons sind normal.
|
|
- Die Regel ist zu breit.
|
|
|
|
Bewertung:
|
|
|
|
```text
|
|
Status: false_positive
|
|
Notiz: Technischer Account SYSTEM, Regel um Noise-Account-Filter erweitern
|
|
Baseline: keine Änderung
|
|
Suppression: nur kurzfristig, besser Regel fixen
|
|
```
|
|
|
|
Zusätzliche Maßnahme:
|
|
|
|
- `SYSTEM` in `isNoiseAccount()` ausschließen.
|
|
- LogonType auf `2,7,10,11` begrenzen.
|
|
|
|
---
|
|
|
|
## 17.3 Beispiel: Admin meldet sich erstmals auf Client an
|
|
|
|
Detection:
|
|
|
|
```text
|
|
ueba_admin_new_host: adm.max auf CLIENT099
|
|
```
|
|
|
|
Analysefragen:
|
|
|
|
- Hat der Admin dort gearbeitet?
|
|
- Gab es ein Ticket?
|
|
- War es Remotehilfe?
|
|
- Ist CLIENT099 ein normaler Client?
|
|
- Gab es vorher Fehlversuche?
|
|
- War es außerhalb Arbeitszeit?
|
|
- Von welcher Quell-IP kam der Login?
|
|
|
|
Mögliche Bewertungen:
|
|
|
|
### Legitime Remotehilfe
|
|
|
|
```text
|
|
Status: plausible
|
|
Notiz: Remotehilfe Ticket #12345 durch adm.max
|
|
Baseline: keine Änderung oder nicht lernen 24h
|
|
```
|
|
|
|
### Admin nutzt Client regelmäßig als Admin-Station
|
|
|
|
```text
|
|
Status: legitimate
|
|
Notiz: CLIENT099 ist Admin-Workstation von adm.max
|
|
Baseline: lernen erlauben
|
|
```
|
|
|
|
### Nicht erklärbar
|
|
|
|
```text
|
|
Status: investigating
|
|
Notiz: Admin-Login auf ungewohntem Client, Rückfrage offen
|
|
```
|
|
|
|
### Kompromittierung bestätigt
|
|
|
|
```text
|
|
Status: confirmed_incident
|
|
Notiz: adm.max kompromittiert, unautorisierter Login
|
|
Baseline: nicht lernen 7d/30d
|
|
```
|
|
|
|
---
|
|
|
|
## 17.4 Beispiel: Password-Spray
|
|
|
|
Detection:
|
|
|
|
```text
|
|
password_spray von 10.2.50.77 gegen 18 Benutzer
|
|
```
|
|
|
|
Analyse:
|
|
|
|
- Quell-IP identifizieren.
|
|
- Gehört sie zu VPN, Proxy, Server, Scanner?
|
|
- Gab es erfolgreiche Logons danach?
|
|
- Sind privilegierte Benutzer betroffen?
|
|
- Gibt es Account Lockouts?
|
|
|
|
Bewertung bei echtem Angriff:
|
|
|
|
```text
|
|
Status: confirmed_incident
|
|
Notiz: Password-Spray von 10.2.50.77, mehrere Benutzer betroffen
|
|
Baseline: nicht lernen 7d
|
|
Suppression: nein
|
|
```
|
|
|
|
Bewertung bei bekanntem Scanner mit falschen Credentials:
|
|
|
|
```text
|
|
Status: legitimate oder plausible
|
|
Notiz: Scanner X mit falschem Credential, Ticket zur Korrektur erstellt
|
|
Baseline: nicht lernen 24h oder 7d
|
|
Suppression: optional kurzzeitig
|
|
```
|
|
|
|
---
|
|
|
|
## 17.5 Beispiel: Baseline-Anomalie auf Domain Controller
|
|
|
|
Detection:
|
|
|
|
```text
|
|
baseline_event_rate_anomaly
|
|
DC01 Security 4625 kam 200-mal in 5 Minuten
|
|
```
|
|
|
|
Analyse:
|
|
|
|
- Gibt es zeitgleich `password_spray`?
|
|
- Gibt es Account Lockouts?
|
|
- Welche Quell-IP?
|
|
- Welche Benutzer?
|
|
- Patch-/Wartungsfenster?
|
|
- Neue Anwendung?
|
|
- VPN/RADIUS/LDAP-Fehler?
|
|
|
|
Bewertung:
|
|
|
|
Bei unbekannter Ursache:
|
|
|
|
```text
|
|
Status: investigating
|
|
Baseline: nicht lernen 24h
|
|
```
|
|
|
|
Bei bestätigtem Angriff:
|
|
|
|
```text
|
|
Status: confirmed_incident
|
|
Baseline: nicht lernen 7d/30d
|
|
```
|
|
|
|
Bei bekannter Fehlkonfiguration:
|
|
|
|
```text
|
|
Status: plausible
|
|
Notiz: Dienst XY nutzt altes Passwort, Korrektur geplant
|
|
Baseline: nicht lernen 7d
|
|
```
|
|
|
|
---
|
|
|
|
# 18. Was darf während der Anlernphase nicht passieren?
|
|
|
|
## 18.1 Nicht alles als legitim markieren
|
|
|
|
Falsch:
|
|
|
|
```text
|
|
Alle Detections der ersten Woche sind bestimmt normal.
|
|
```
|
|
|
|
Warum gefährlich?
|
|
|
|
- Angriffe können eingelernt werden.
|
|
- Host Risk Score wird künstlich reduziert.
|
|
- Auffällige Admin-Logins verschwinden aus der Priorisierung.
|
|
|
|
---
|
|
|
|
## 18.2 Nicht alles dauerhaft unterdrücken
|
|
|
|
Falsch:
|
|
|
|
```text
|
|
Diese Regel nervt, also Suppression dauerhaft.
|
|
```
|
|
|
|
Warum gefährlich?
|
|
|
|
- Künftige echte Vorfälle werden nicht mehr gemeldet.
|
|
- Angreifer können Verhalten nutzen, das blindgeschaltet wurde.
|
|
- SOC-Übersicht wird scheinbar ruhig, aber weniger sicher.
|
|
|
|
---
|
|
|
|
## 18.3 Confirmed Incidents nicht als plausible markieren
|
|
|
|
Falsch:
|
|
|
|
```text
|
|
Der Angriff ist ja vorbei, also plausible.
|
|
```
|
|
|
|
Richtig:
|
|
|
|
```text
|
|
confirmed_incident
|
|
```
|
|
|
|
Warum?
|
|
|
|
Nur so wird klar:
|
|
|
|
- es war ein echter Vorfall,
|
|
- der Host Risk Score wird korrekt erhöht,
|
|
- Baseline-Lernen wird verhindert,
|
|
- spätere Auswertungen bleiben korrekt.
|
|
|
|
---
|
|
|
|
## 18.4 Parserfehler nicht als legitimate markieren
|
|
|
|
Falsch:
|
|
|
|
```text
|
|
SYSTEM-Noise ist normal, also legitimate.
|
|
```
|
|
|
|
Besser:
|
|
|
|
```text
|
|
false_positive
|
|
Regel korrigieren
|
|
```
|
|
|
|
Warum?
|
|
|
|
Wenn die Regel falsch filtert, ist das kein legitimer Sicherheitsfall, sondern ein Regelproblem.
|
|
|
|
---
|
|
|
|
# 19. Wie Notizen geschrieben werden sollten
|
|
|
|
Jede manuelle Bewertung sollte eine brauchbare Notiz enthalten.
|
|
|
|
Gute Notizen beantworten:
|
|
|
|
- Was war die Ursache?
|
|
- Wer hat es geprüft?
|
|
- Gibt es ein Ticket?
|
|
- Ist es einmalig oder dauerhaft?
|
|
- Welche Maßnahme wurde getroffen?
|
|
- Soll das Verhalten künftig gelernt werden?
|
|
|
|
---
|
|
|
|
## 19.1 Gute Beispiele
|
|
|
|
```text
|
|
Patchday April 2026, WSUS-Rollout auf Clients, Reboots erwartet.
|
|
```
|
|
|
|
```text
|
|
Remotehilfe Ticket #4711, adm.max hat sich auf CLIENT099 angemeldet.
|
|
```
|
|
|
|
```text
|
|
Dienstkonto svc-backup nach Passwortwechsel mit altem Credential, Ticket #4812 zur Korrektur.
|
|
```
|
|
|
|
```text
|
|
Bestätigter Password-Spray von 10.2.50.77, Firewall-Block gesetzt, betroffene Benutzer geprüft.
|
|
```
|
|
|
|
---
|
|
|
|
## 19.2 Schlechte Beispiele
|
|
|
|
```text
|
|
ok
|
|
```
|
|
|
|
```text
|
|
normal
|
|
```
|
|
|
|
```text
|
|
passt
|
|
```
|
|
|
|
```text
|
|
weg
|
|
```
|
|
|
|
```text
|
|
keine Ahnung
|
|
```
|
|
|
|
Solche Notizen helfen später niemandem.
|
|
|
|
---
|
|
|
|
# 20. Auswirkungen auf den Host Risk Score
|
|
|
|
Der Host Risk Score aggregiert relevante Detections pro Host.
|
|
|
|
## 20.1 Diese Status zählen weiter
|
|
|
|
```text
|
|
open
|
|
acknowledged
|
|
investigating
|
|
confirmed_incident
|
|
```
|
|
|
|
## 20.2 Diese Status zählen nicht weiter
|
|
|
|
```text
|
|
false_positive
|
|
suppressed
|
|
legitimate
|
|
resolved
|
|
plausible
|
|
```
|
|
|
|
## 20.3 Warum ist das wichtig?
|
|
|
|
Wenn zu viel als `plausible`, `legitimate` oder `false_positive` markiert wird, fällt der Host Risk Score künstlich ab.
|
|
|
|
Wenn echte Vorfälle als `confirmed_incident` markiert werden, steigt der Host Risk Score deutlich.
|
|
|
|
---
|
|
|
|
## 20.4 Beispiel
|
|
|
|
Host `CLIENT099` hat:
|
|
|
|
- 1x `ueba_admin_new_host` high open,
|
|
- 1x `success_after_failures` high investigating,
|
|
- 1x `password_spray` medium open.
|
|
|
|
Der Host Risk Score ist erhöht.
|
|
|
|
Wenn alle drei Detections als `plausible` markiert werden, fällt der Host aus der Priorisierung.
|
|
|
|
Das ist nur korrekt, wenn wirklich alle drei plausibel sind.
|
|
|
|
---
|
|
|
|
# 21. Auswirkungen auf Baseline-Qualität
|
|
|
|
## 21.1 Gute Baseline
|
|
|
|
Eine gute Baseline entsteht, wenn normale Ereignisse gelernt werden und unnormale Ereignisse nicht gelernt werden.
|
|
|
|
Normales Verhalten:
|
|
|
|
- tägliche Anmeldemuster,
|
|
- übliche Eventmengen,
|
|
- regelmäßige Systemjobs,
|
|
- bekannte Wartungsfenster, wenn sie regelmäßig sind.
|
|
|
|
Nicht lernen:
|
|
|
|
- Angriffe,
|
|
- Fehlkonfigurationen,
|
|
- Testfluten,
|
|
- einmalige Rollouts,
|
|
- Massenfehler,
|
|
- außergewöhnliche Störungen.
|
|
|
|
---
|
|
|
|
## 21.2 Schlechte Baseline
|
|
|
|
Eine schlechte Baseline entsteht, wenn außergewöhnliches Verhalten als normal gelernt wird.
|
|
|
|
Beispiele:
|
|
|
|
- ein kompromittierter Account während Anlernphase,
|
|
- ein falsch konfigurierter Dienst mit tausenden Fehlversuchen,
|
|
- Patchday als tägliches Normalverhalten,
|
|
- einmalige Migration als Normalzustand,
|
|
- SYSTEM-Noise in Benutzerregeln.
|
|
|
|
---
|
|
|
|
## 21.3 Symptome einer schlechten Baseline
|
|
|
|
- echte Auffälligkeiten erzeugen keine Alerts,
|
|
- viele irrelevante Alerts,
|
|
- Baseline-Werte sind extrem hoch,
|
|
- Z-Scores bleiben niedrig trotz auffälligem Verhalten,
|
|
- bestimmte Hosts erscheinen nie auffällig,
|
|
- andere Hosts sind ständig auffällig.
|
|
|
|
---
|
|
|
|
## 21.4 Was tun bei schlechter Baseline?
|
|
|
|
Möglichkeiten:
|
|
|
|
1. Baseline-Einträge gezielt löschen.
|
|
2. Baseline für bestimmte Kombinationen neu aufbauen.
|
|
3. Baseline-Exclusions setzen.
|
|
4. Regeln schärfen.
|
|
5. technische Accounts ausschließen.
|
|
6. Retention/Reset-Konzept einführen.
|
|
|
|
---
|
|
|
|
# 22. Auswirkungen auf UEBA-Qualität
|
|
|
|
## 22.1 Gute UEBA-Baseline
|
|
|
|
Eine gute UEBA-Baseline enthält echte, normale Benutzerkontexte.
|
|
|
|
Beispiele:
|
|
|
|
- Benutzer A arbeitet auf Client A.
|
|
- Admin B arbeitet auf Jump Host B.
|
|
- Service Account C nutzt Server C.
|
|
- VPN-Benutzer haben bekannte Quellbereiche.
|
|
|
|
---
|
|
|
|
## 22.2 Schlechte UEBA-Baseline
|
|
|
|
Eine schlechte UEBA-Baseline enthält verdächtige oder falsche Kontexte.
|
|
|
|
Beispiele:
|
|
|
|
- kompromittierter Admin auf fremdem Client,
|
|
- SYSTEM als Benutzerkontext,
|
|
- Maschinenkonten als normale Benutzer,
|
|
- RDP-Lateral-Movement als normaler Kontext,
|
|
- einmalige Notfallaktion als dauerhaft normal.
|
|
|
|
---
|
|
|
|
## 22.3 Wann UEBA-Kontexte bereinigt werden sollten
|
|
|
|
Manuell bereinigen oder später Funktion ergänzen, wenn:
|
|
|
|
- ein Account kompromittiert war,
|
|
- ein Admin versehentlich auf vielen Clients angemeldet war,
|
|
- ein Dienst falsch lief,
|
|
- Testdaten importiert wurden,
|
|
- technische Accounts eingelernt wurden,
|
|
- VPN-/NAT-Fehler falsche Quell-IPs erzeugt haben.
|
|
|
|
---
|
|
|
|
# 23. Empfohlene Bedienregeln für unwissende Admins
|
|
|
|
## 23.1 Goldene Regel 1
|
|
|
|
```text
|
|
Nicht wegklicken. Erst verstehen.
|
|
```
|
|
|
|
Jede Detection sollte mindestens kurz fachlich eingeordnet werden.
|
|
|
|
---
|
|
|
|
## 23.2 Goldene Regel 2
|
|
|
|
```text
|
|
Plausibel ist nicht dasselbe wie legitim.
|
|
```
|
|
|
|
`plausible` ist für temporär erklärbare Ereignisse.
|
|
|
|
`legitimate` ist für dauerhaft akzeptiertes Verhalten.
|
|
|
|
---
|
|
|
|
## 23.3 Goldene Regel 3
|
|
|
|
```text
|
|
False Positive heißt: Die Regel war falsch, nicht das Ereignis war harmlos.
|
|
```
|
|
|
|
Ein echter Patchday-Reboot ist kein False Positive.
|
|
|
|
---
|
|
|
|
## 23.4 Goldene Regel 4
|
|
|
|
```text
|
|
Confirmed Incident immer als confirmed_incident markieren.
|
|
```
|
|
|
|
Nicht als `resolved`, nicht als `plausible`, nicht als `legitimate`.
|
|
|
|
Erst später kann der Vorfall zusätzlich abgeschlossen werden, aber die historische Detection sollte als Incident erkennbar bleiben.
|
|
|
|
---
|
|
|
|
## 23.5 Goldene Regel 5
|
|
|
|
```text
|
|
Baseline nicht mit Störungen trainieren.
|
|
```
|
|
|
|
Bei Wartung, Angriffen, Fehlkonfigurationen und Testfluten:
|
|
|
|
```text
|
|
nicht lernen
|
|
```
|
|
|
|
verwenden.
|
|
|
|
---
|
|
|
|
## 23.6 Goldene Regel 6
|
|
|
|
```text
|
|
Suppression nur bewusst und möglichst zeitlich begrenzt.
|
|
```
|
|
|
|
Dauerhafte Suppression nur nach Prüfung.
|
|
|
|
---
|
|
|
|
## 23.7 Goldene Regel 7
|
|
|
|
```text
|
|
Notizen müssen später verständlich sein.
|
|
```
|
|
|
|
Immer mit Ursache, Kontext und ggf. Ticketnummer dokumentieren.
|
|
|
|
---
|
|
|
|
# 24. Empfohlene Rechte- und Rollenverteilung
|
|
|
|
## 24.1 Viewer
|
|
|
|
Darf:
|
|
|
|
- Detections ansehen,
|
|
- Events ansehen,
|
|
- SOC-Dashboard ansehen.
|
|
|
|
Darf nicht:
|
|
|
|
- Detections bewerten,
|
|
- Suppressions setzen,
|
|
- Baselines ausschließen,
|
|
- Regeln ändern.
|
|
|
|
## 24.2 Analyst
|
|
|
|
Darf:
|
|
|
|
- Detections bewerten,
|
|
- Notizen setzen,
|
|
- Status ändern,
|
|
- temporäre Baseline-Exclusions setzen.
|
|
|
|
Darf vorsichtig:
|
|
|
|
- temporäre Suppressions setzen.
|
|
|
|
Darf nicht ohne Freigabe:
|
|
|
|
- dauerhafte Suppression,
|
|
- Dynamic Rules ändern,
|
|
- Baseline komplett löschen.
|
|
|
|
## 24.3 Admin
|
|
|
|
Darf:
|
|
|
|
- Regeln pflegen,
|
|
- Privileged Users pflegen,
|
|
- Suppressions verwalten,
|
|
- Baseline-Exclusions verwalten,
|
|
- Dynamic Rules anpassen,
|
|
- Indizes/DB warten.
|
|
|
|
## 24.4 Security Lead
|
|
|
|
Darf entscheiden:
|
|
|
|
- was als confirmed_incident gilt,
|
|
- welche Suppressions dauerhaft sind,
|
|
- welche Baselines zurückgesetzt werden,
|
|
- welche Regeln kritisch sind,
|
|
- welche Betriebsprozesse gelten.
|
|
|
|
---
|
|
|
|
# 25. Tagesroutine für Admins
|
|
|
|
## 25.1 Morgens
|
|
|
|
1. SOC Dashboard öffnen.
|
|
2. Top Host Risk Scores prüfen.
|
|
3. Critical/High Detections prüfen.
|
|
4. Neue `confirmed_incident` prüfen.
|
|
5. Offene `investigating` weiterverfolgen.
|
|
6. Patch-/Wartungsereignisse bewerten.
|
|
|
|
## 25.2 Während des Tages
|
|
|
|
- Neue High/Critical Detections zeitnah prüfen.
|
|
- Bei ungewöhnlichen Admin-Logins Rückfrage halten.
|
|
- Bei Password-Spray Quell-IP prüfen.
|
|
- Bei Success-after-Failure Benutzer und Quelle prüfen.
|
|
- Notizen setzen.
|
|
|
|
## 25.3 Nachmittags / Tagesabschluss
|
|
|
|
- Offene Detections nicht unnötig offen lassen.
|
|
- Geklärte Fälle bewerten.
|
|
- False Positives in Regelverbesserung überführen.
|
|
- Suppressions dokumentieren.
|
|
- Incidents sauber markieren.
|
|
|
|
---
|
|
|
|
# 26. Wochenroutine
|
|
|
|
Einmal pro Woche:
|
|
|
|
- häufigste Detections prüfen,
|
|
- häufigste False Positives prüfen,
|
|
- Suppressions prüfen,
|
|
- Baseline-Exclusions prüfen,
|
|
- Privileged Users prüfen,
|
|
- Dynamic Rules nachschärfen,
|
|
- technische Noise-Accounts ergänzen,
|
|
- Host Risk Score Trends prüfen.
|
|
|
|
---
|
|
|
|
# 27. Monatsroutine
|
|
|
|
Einmal pro Monat:
|
|
|
|
- Baseline-Qualität prüfen,
|
|
- UEBA-Kontexte stichprobenartig prüfen,
|
|
- alte Suppressions entfernen,
|
|
- dauerhafte Suppressions rechtfertigen,
|
|
- Admin-Konten prüfen,
|
|
- Service Accounts prüfen,
|
|
- Regelwerk dokumentieren,
|
|
- Lessons Learned aus Incidents übernehmen.
|
|
|
|
---
|
|
|
|
# 28. Umgang mit Wartungsfenstern
|
|
|
|
## 28.1 Vor Wartung
|
|
|
|
Vor größeren Wartungen dokumentieren:
|
|
|
|
- Zeitraum,
|
|
- betroffene Systeme,
|
|
- erwartete Events,
|
|
- verantwortlicher Admin,
|
|
- Ticketnummer,
|
|
- erwartete Reboots,
|
|
- erwartete Service-Installationen.
|
|
|
|
## 28.2 Während Wartung
|
|
|
|
Detections nicht blind löschen.
|
|
|
|
Bewerten mit:
|
|
|
|
```text
|
|
plausible
|
|
```
|
|
|
|
Notiz:
|
|
|
|
```text
|
|
Wartungsfenster Ticket #12345, Update Exchange Server SE, Reboots erwartet.
|
|
```
|
|
|
|
Baseline:
|
|
|
|
```text
|
|
nicht lernen: 24h oder 7 Tage
|
|
```
|
|
|
|
Suppression:
|
|
|
|
```text
|
|
optional zeitlich begrenzt
|
|
```
|
|
|
|
## 28.3 Nach Wartung
|
|
|
|
Prüfen:
|
|
|
|
- treten Detections weiter auf?
|
|
- gibt es unerwartete Hosts?
|
|
- gab es erfolgreiche Logons nach Fehlversuchen?
|
|
- gab es neue Admin-Kontexte?
|
|
- sind Services installiert worden?
|
|
- sind Security Logs gelöscht worden?
|
|
|
|
---
|
|
|
|
# 29. Umgang mit Patchdays
|
|
|
|
Patchdays erzeugen oft:
|
|
|
|
- `reboot_spike`,
|
|
- `agent_offline`,
|
|
- `baseline_event_rate_anomaly`,
|
|
- `new_event_id`,
|
|
- Service-Events,
|
|
- neue Fehler durch defekte Updates.
|
|
|
|
Empfohlene Bewertung:
|
|
|
|
| Fall | Bewertung |
|
|
|---|---|
|
|
| erwartete Reboots | `plausible` |
|
|
| Agent kurz offline | `plausible` |
|
|
| viele neue EventIDs nach Update | `plausible`, prüfen |
|
|
| Security Log gelöscht | nicht automatisch plausibel |
|
|
| Admin-Login auf ungewöhnlichem Host | prüfen |
|
|
| Password-Spray | nicht mit Patchday erklären |
|
|
|
|
---
|
|
|
|
# 30. Umgang mit Service Accounts
|
|
|
|
Service Accounts können viele Events erzeugen.
|
|
|
|
Empfehlungen:
|
|
|
|
- Service Accounts dokumentieren.
|
|
- Namensschema verwenden, z. B. `svc-*`.
|
|
- Nicht als normale Benutzer bewerten.
|
|
- Bei Fehlversuchen Passwort/Secret prüfen.
|
|
- Bei Off-Hours-Regeln gesondert behandeln.
|
|
- Nicht pauschal alles suppressen.
|
|
|
|
Bewertung:
|
|
|
|
| Situation | Status |
|
|
|---|---|
|
|
| bekannter Backup-Service | `legitimate` |
|
|
| Service mit altem Passwort | `plausible` oder `investigating` |
|
|
| unbekannter Service Account | `investigating` |
|
|
| Service Account meldet sich interaktiv an | verdächtig |
|
|
|
|
---
|
|
|
|
# 31. Umgang mit Admin-Konten
|
|
|
|
Admin-Konten sind besonders kritisch.
|
|
|
|
Empfehlungen:
|
|
|
|
- alle bekannten Admin-Konten in `privileged_users` pflegen,
|
|
- Admin-Konten nicht für normale Arbeit nutzen,
|
|
- Admin-Logins auf Clients prüfen,
|
|
- RDP-Logins mit Admin-Konto priorisieren,
|
|
- Off-Hours-Admin-Logins prüfen,
|
|
- neue Host-Kontexte für Admins immer bewerten.
|
|
|
|
Bewertung:
|
|
|
|
| Situation | Status |
|
|
|---|---|
|
|
| Admin auf bekanntem Jump Host | `legitimate` |
|
|
| Admin auf neuem Server mit Ticket | `plausible` |
|
|
| Admin auf normalem Client ohne Erklärung | `investigating` |
|
|
| Admin nachts auf fremdem Host | mindestens `investigating` |
|
|
| kompromittierter Admin | `confirmed_incident` |
|
|
|
|
---
|
|
|
|
# 32. Umgang mit False Positives
|
|
|
|
False Positives sind nützlich, wenn sie zur Regelverbesserung führen.
|
|
|
|
## 32.1 Vorgehen
|
|
|
|
1. Detection als `false_positive` markieren.
|
|
2. Notiz setzen.
|
|
3. Ursache beschreiben.
|
|
4. Regel anpassen.
|
|
5. Prüfen, ob neue Detections sauberer werden.
|
|
|
|
## 32.2 Beispiele
|
|
|
|
```text
|
|
SYSTEM wurde nicht ausgeschlossen.
|
|
```
|
|
|
|
```text
|
|
LogonType 3 erzeugt zu viel Rauschen.
|
|
```
|
|
|
|
```text
|
|
Service Account wird als Benutzer behandelt.
|
|
```
|
|
|
|
```text
|
|
EventID in falschem Channel ausgewertet.
|
|
```
|
|
|
|
```text
|
|
Parser liest TargetUserName falsch.
|
|
```
|
|
|
|
---
|
|
|
|
# 33. Umgang mit Confirmed Incidents
|
|
|
|
## 33.1 Vorgehen
|
|
|
|
Wenn eine Detection ein echter Vorfall ist:
|
|
|
|
1. Status auf `confirmed_incident`.
|
|
2. Notiz mit Fakten schreiben.
|
|
3. Baseline nicht lernen lassen.
|
|
4. Kein Suppression setzen, solange Angriff aktiv sein könnte.
|
|
5. Betroffene Systeme prüfen.
|
|
6. Benutzer/Account prüfen.
|
|
7. Quell-IP prüfen.
|
|
8. Weitere Detections im gleichen Zeitraum prüfen.
|
|
9. Nach Abschluss Maßnahmen dokumentieren.
|
|
|
|
## 33.2 Notizbeispiel
|
|
|
|
```text
|
|
Confirmed Incident: adm.max kompromittiert. Unautorisierter RDP-Login auf CLIENT099 um 02:14 Uhr. Account deaktiviert, Passwort zurückgesetzt, Host isoliert. Ticket IR-2026-0042.
|
|
```
|
|
|
|
## 33.3 Warum nicht `resolved`?
|
|
|
|
`resolved` bedeutet abgeschlossen, aber nicht zwingend bösartig.
|
|
|
|
Ein echter Vorfall sollte historisch als `confirmed_incident` erkennbar bleiben.
|
|
|
|
Optional kann später zusätzlich ein eigener Incident-Prozess außerhalb der Detection laufen.
|
|
|
|
---
|
|
|
|
# 34. Typische Anfängerfehler
|
|
|
|
## 34.1 Alles auf `resolved` setzen
|
|
|
|
Problem:
|
|
|
|
- Host Risk Score sinkt,
|
|
- Ursache bleibt unklar,
|
|
- spätere Auswertung wertlos.
|
|
|
|
Besser:
|
|
|
|
- erst fachlich bewerten,
|
|
- dann passenden Status setzen.
|
|
|
|
## 34.2 `false_positive` für Wartung nutzen
|
|
|
|
Problem:
|
|
|
|
- Wartung war echt, nicht falsch erkannt.
|
|
|
|
Besser:
|
|
|
|
```text
|
|
plausible
|
|
```
|
|
|
|
## 34.3 Dauerhaft suppressen, weil es nervt
|
|
|
|
Problem:
|
|
|
|
- blinde Flecken.
|
|
|
|
Besser:
|
|
|
|
- Regel verbessern,
|
|
- technische Accounts ausschließen,
|
|
- Suppression zeitlich begrenzen.
|
|
|
|
## 34.4 Keine Notizen schreiben
|
|
|
|
Problem:
|
|
|
|
- niemand weiß später, warum etwas bewertet wurde.
|
|
|
|
Besser:
|
|
|
|
- kurze, klare Ursache plus Ticket.
|
|
|
|
## 34.5 Baseline während Incident lernen lassen
|
|
|
|
Problem:
|
|
|
|
- bösartiges Verhalten wird normalisiert.
|
|
|
|
Besser:
|
|
|
|
```text
|
|
confirmed_incident
|
|
Baseline: nicht lernen
|
|
```
|
|
|
|
---
|
|
|
|
# 35. Beispiel: vollständiger Bewertungsablauf
|
|
|
|
Detection:
|
|
|
|
```text
|
|
success_after_failures
|
|
Host: CLIENT099
|
|
User: max.mustermann
|
|
Source IP: 10.2.50.77
|
|
Severity: high
|
|
```
|
|
|
|
## Schritt 1: Eventkontext prüfen
|
|
|
|
- Gab es vorher 4625?
|
|
- Wie viele Fehlversuche?
|
|
- Welche Quell-IP?
|
|
- War der erfolgreiche Login von derselben Quelle?
|
|
- Gab es weitere Benutzer?
|
|
- Ist die Quelle bekannt?
|
|
|
|
## Schritt 2: Benutzer prüfen
|
|
|
|
- Hat der Benutzer zu diesem Zeitpunkt gearbeitet?
|
|
- Ist der Benutzer im Urlaub?
|
|
- Gab es Passwortänderung?
|
|
- Ist MFA/VPN beteiligt?
|
|
- Ist es ein Admin?
|
|
|
|
## Schritt 3: Host prüfen
|
|
|
|
- Ist CLIENT099 der normale Client?
|
|
- Ist der Host ungewöhnlich?
|
|
- Gibt es weitere Detections auf dem Host?
|
|
- Host Risk Score erhöht?
|
|
|
|
## Schritt 4: Bewertung
|
|
|
|
### Benutzer bestätigt eigene Vertipper
|
|
|
|
```text
|
|
Status: plausible
|
|
Notiz: Benutzer bestätigt mehrere Fehlversuche nach Passwortwechsel, danach erfolgreicher Login.
|
|
Baseline: keine Änderung
|
|
```
|
|
|
|
### Quelle unbekannt, Benutzer bestätigt es nicht
|
|
|
|
```text
|
|
Status: investigating
|
|
Notiz: Benutzer bestätigt Login nicht, Quell-IP 10.2.50.77 wird geprüft.
|
|
Baseline: nicht lernen 24h
|
|
```
|
|
|
|
### Kompromittierung bestätigt
|
|
|
|
```text
|
|
Status: confirmed_incident
|
|
Notiz: Benutzer bestätigt Login nicht, Quell-IP unbekannt, Account gesperrt, Host isoliert, Ticket IR-...
|
|
Baseline: nicht lernen 7d
|
|
```
|
|
|
|
---
|
|
|
|
# 36. Sicherheitsprinzip: Lernen ist Vertrauen
|
|
|
|
Ein wichtiger Merksatz:
|
|
|
|
```text
|
|
Was gelernt wird, dem vertraut die Software später eher.
|
|
```
|
|
|
|
Deshalb:
|
|
|
|
- nur normales Verhalten lernen lassen,
|
|
- verdächtiges Verhalten untersuchen,
|
|
- bösartiges Verhalten ausschließen,
|
|
- temporäre Sonderfälle nicht dauerhaft normalisieren.
|
|
|
|
---
|
|
|
|
# 37. Empfohlene UI-Texte für Admin-Schulung
|
|
|
|
## 37.1 Plausible
|
|
|
|
```text
|
|
Verwenden, wenn das Ereignis durch einen bekannten temporären Kontext erklärbar ist, z. B. Wartung, Patchday oder Rollout. Nicht für dauerhaft normales Verhalten.
|
|
```
|
|
|
|
## 37.2 Legitimate
|
|
|
|
```text
|
|
Verwenden, wenn das Verhalten dauerhaft bekannt, erwartet und akzeptiert ist. Vorsichtig verwenden, da es aus der Risikobewertung fällt.
|
|
```
|
|
|
|
## 37.3 False Positive
|
|
|
|
```text
|
|
Verwenden, wenn die Regel falsch oder technisch irreführend ausgelöst hat. Danach sollte die Regel verbessert werden.
|
|
```
|
|
|
|
## 37.4 Confirmed Incident
|
|
|
|
```text
|
|
Verwenden, wenn ein echter Sicherheitsvorfall bestätigt wurde. Verhindert, dass entsprechendes Verhalten als normal eingelernt wird.
|
|
```
|
|
|
|
## 37.5 Suppressed
|
|
|
|
```text
|
|
Verwenden, wenn diese Detection künftig bewusst nicht mehr gemeldet werden soll. Möglichst zeitlich begrenzen.
|
|
```
|
|
|
|
---
|
|
|
|
# 38. Empfohlene Startkonfiguration für sichere Anlernphase
|
|
|
|
## 38.1 Baseline
|
|
|
|
```text
|
|
BASELINE_ENABLED=true
|
|
BASELINE_WINDOW=5m
|
|
BASELINE_MIN_SAMPLES=24
|
|
BASELINE_MIN_COUNT=10
|
|
BASELINE_MEDIUM_Z=2.5
|
|
BASELINE_HIGH_Z=4.0
|
|
BASELINE_SUPPRESS_FOR=1h
|
|
```
|
|
|
|
## 38.2 UEBA
|
|
|
|
```text
|
|
UEBA_ENABLED=true
|
|
UEBA_LOOKBACK=720h
|
|
UEBA_NEW_CONTEXT_WINDOW=10m
|
|
```
|
|
|
|
## 38.3 Detection
|
|
|
|
```text
|
|
DETECTION_INTERVAL=1m
|
|
```
|
|
|
|
## 38.4 Empfehlung
|
|
|
|
In den ersten 7 Tagen lieber:
|
|
|
|
- mehr prüfen,
|
|
- weniger dauerhaft suppressen,
|
|
- gute Notizen schreiben,
|
|
- Baseline-Exclusions bei Sonderlagen setzen.
|
|
|
|
---
|
|
|
|
# 39. Wann sollte man Baseline zurücksetzen?
|
|
|
|
Ein kompletter oder teilweiser Reset kann sinnvoll sein nach:
|
|
|
|
- großem Rollout,
|
|
- massiver Fehlkonfiguration,
|
|
- längerer Testphase mit falschen Daten,
|
|
- Umstellung der Audit Policies,
|
|
- Änderung der Agent-Filter,
|
|
- Korrektur von Parserfehlern,
|
|
- Kompromittierung während Anlernphase.
|
|
|
|
## 39.1 Teilweiser Reset
|
|
|
|
Besser als Komplettreset ist oft ein gezieltes Löschen:
|
|
|
|
```text
|
|
für Host + Channel + EventID
|
|
```
|
|
|
|
Beispiel:
|
|
|
|
```text
|
|
DC01 + Security + 4625
|
|
```
|
|
|
|
## 39.2 Komplettreset
|
|
|
|
Nur wenn die gesamte Baseline unbrauchbar ist.
|
|
|
|
Vorher klären:
|
|
|
|
- Warum ist sie unbrauchbar?
|
|
- Wurde die Ursache behoben?
|
|
- Wird danach sauber neu gelernt?
|
|
- Sind Admins informiert?
|
|
|
|
---
|
|
|
|
# 40. Wann sollte man UEBA zurücksetzen?
|
|
|
|
UEBA-Kontexte sollten bereinigt werden, wenn falsche oder gefährliche Kontexte gelernt wurden.
|
|
|
|
Beispiele:
|
|
|
|
- kompromittierter Account,
|
|
- Testdaten,
|
|
- SYSTEM/Service Accounts fälschlich gelernt,
|
|
- Admin hat versehentlich viele Clients besucht,
|
|
- Jump-Host-Konzept wurde geändert,
|
|
- VPN/NAT lieferte falsche Quell-IPs.
|
|
|
|
Empfehlung:
|
|
|
|
- gezielt pro Benutzer löschen,
|
|
- gezielt pro Host löschen,
|
|
- gezielt technische Accounts entfernen,
|
|
- nicht pauschal alles löschen, wenn nur einzelne Kontexte falsch sind.
|
|
|
|
---
|
|
|
|
# 41. Wichtige technische Qualitätsprüfungen
|
|
|
|
Admins sollten regelmäßig prüfen:
|
|
|
|
## 41.1 Zeit
|
|
|
|
- Sind Client-Zeiten korrekt?
|
|
- Ist Server-Zeit korrekt?
|
|
- Ist `TZ=Europe/Berlin` gesetzt?
|
|
- Sind UTC-Zeiten in DB konsistent?
|
|
|
|
## 41.2 Eventfelder
|
|
|
|
- Wird `target_user` korrekt gefüllt?
|
|
- Wird `subject_user` korrekt gefüllt?
|
|
- Wird `src_ip` korrekt gefüllt?
|
|
- Wird `logon_type` korrekt gefüllt?
|
|
- Werden Maschinenkonten erkannt?
|
|
- Werden Domain-Präfixe normalisiert?
|
|
|
|
## 41.3 Noise
|
|
|
|
- Taucht `SYSTEM` als Benutzer-Detection auf?
|
|
- Tauchen `DWM-*` oder `UMFD-*` auf?
|
|
- Tauchen viele Service-Logons auf?
|
|
- Werden LogonType 3 und 5 unnötig alarmiert?
|
|
|
|
## 41.4 Datenmenge
|
|
|
|
- Kommen alle Agents?
|
|
- Gibt es Hosts ohne Events?
|
|
- Gibt es extreme Eventfluten?
|
|
- Sind Indizes vorhanden?
|
|
- Laufen Queries schnell genug?
|
|
|
|
---
|
|
|
|
# 42. Beispielhafte Schulungsübung
|
|
|
|
Ein neuer Admin soll 10 Detections bewerten.
|
|
|
|
## Aufgabe
|
|
|
|
Für jede Detection beantworten:
|
|
|
|
1. Welche Regel hat ausgelöst?
|
|
2. Welche Daten liegen zugrunde?
|
|
3. Ist das Ereignis technisch korrekt?
|
|
4. Ist es erwartbar?
|
|
5. Ist es einmalig oder dauerhaft?
|
|
6. Soll die Baseline lernen?
|
|
7. Ist Suppression sinnvoll?
|
|
8. Welche Notiz wird geschrieben?
|
|
9. Welcher Status ist korrekt?
|
|
|
|
## Ziel
|
|
|
|
Der Admin soll nicht nur klicken, sondern begründen.
|
|
|
|
---
|
|
|
|
# 43. Kurze Checkliste pro Detection
|
|
|
|
Vor Bewertung prüfen:
|
|
|
|
```text
|
|
[ ] Regel verstanden
|
|
[ ] Host geprüft
|
|
[ ] Benutzer geprüft
|
|
[ ] Quell-IP geprüft
|
|
[ ] Zeit geprüft
|
|
[ ] Eventdetails geprüft
|
|
[ ] ähnliche Detections geprüft
|
|
[ ] Wartungsfenster geprüft
|
|
[ ] Ticket/Change geprüft
|
|
[ ] Status bewusst gewählt
|
|
[ ] Notiz geschrieben
|
|
[ ] Baseline-Aktion geprüft
|
|
[ ] Suppression bewusst entschieden
|
|
```
|
|
|
|
---
|
|
|
|
# 44. Empfohlene Status-Definition für Betriebsdokumentation
|
|
|
|
Diese Definitionen sollten intern verbindlich sein:
|
|
|
|
```text
|
|
open:
|
|
Neu und ungeprüft.
|
|
|
|
acknowledged:
|
|
Gesehen, aber noch nicht abschließend geprüft.
|
|
|
|
investigating:
|
|
Aktive Untersuchung läuft.
|
|
|
|
plausible:
|
|
Temporär erklärbar, aber nicht dauerhaft als normal bestätigt.
|
|
|
|
legitimate:
|
|
Dauerhaft erwartetes und akzeptiertes Verhalten.
|
|
|
|
false_positive:
|
|
Regel oder Erkennung war fachlich/technisch falsch.
|
|
|
|
resolved:
|
|
Bearbeitet und abgeschlossen, kein weiterer Handlungsbedarf.
|
|
|
|
suppressed:
|
|
Bewusst unterdrückt, künftig nicht mehr oder vorübergehend nicht relevant.
|
|
|
|
confirmed_incident:
|
|
Bestätigter Sicherheitsvorfall.
|
|
```
|
|
|
|
---
|
|
|
|
# 45. Zusammenfassung
|
|
|
|
Die Software lernt aus beobachtetem Verhalten. Dadurch wird sie mit der Zeit besser, aber nur, wenn die Daten sauber sind und die Admins korrekt bewerten.
|
|
|
|
Wichtigste Punkte:
|
|
|
|
1. Die Anlernphase ist kritisch.
|
|
2. Nicht alles am Anfang ist automatisch normal.
|
|
3. Baseline lernt Eventmengen nach Host, Channel, EventID, Wochentag und Stunde.
|
|
4. UEBA lernt Benutzerkontexte.
|
|
5. Dynamic Rules lernen nicht selbst, sondern müssen gepflegt werden.
|
|
6. `plausible` ist für temporär erklärbare Ereignisse.
|
|
7. `legitimate` ist für dauerhaft akzeptiertes Verhalten.
|
|
8. `false_positive` ist für falsche Regeln/Erkennungen.
|
|
9. `confirmed_incident` ist für echte Vorfälle.
|
|
10. Baseline darf Incidents nicht lernen.
|
|
11. Suppression erzeugt blinde Flecken und muss bewusst eingesetzt werden.
|
|
12. Gute Notizen sind Pflicht.
|
|
13. Host Risk Score hängt stark von korrekter Bewertung ab.
|
|
14. Technische Accounts und LogonTypes müssen sauber gefiltert werden.
|
|
15. Regelmäßige Pflege verbessert die Erkennungsqualität.
|
|
|
|
Der wichtigste Satz für Admins:
|
|
|
|
```text
|
|
Bewertung ist Teil der Sicherheit. Falsch bewertete Detections können die Erkennung verschlechtern.
|
|
```
|
|
|
|
|
|
# SIEM-lite Regel-Dokumentation
|
|
|
|
Stand: 2026-04-27
|
|
Projekt: `siem-backend` / `SIEM-lite Security Operations`
|
|
|
|
Diese Dokumentation beschreibt die im Backend implementierten Detection-Regeln, ihre Datenbasis, Schwellenwerte, Statuslogik, Suppression-Mechanismen und empfohlene Bewertung im SOC.
|
|
|
|
---
|
|
|
|
## 1. Überblick
|
|
|
|
Das Backend nimmt Windows Eventlog-Daten von Agents über `/ingest` entgegen, normalisiert wichtige Felder aus dem Event-XML und speichert sie in MySQL. In regelmäßigen Intervallen läuft ein Detection-Loop, der verschiedene statische, dynamische, Baseline- und UEBA-Regeln auswertet.
|
|
|
|
Der zentrale Detection-Loop befindet sich in:
|
|
|
|
```go
|
|
func (s *server) runDetectionsOnce()
|
|
```
|
|
|
|
Aktuell vorgesehene Regeln:
|
|
|
|
```go
|
|
agent_offline
|
|
failed_logon_spike
|
|
reboot_spike
|
|
new_event_id
|
|
password_spray
|
|
success_after_failures
|
|
new_source_ip_for_user
|
|
dynamic_rules
|
|
baseline_anomaly
|
|
baseline_update
|
|
ueba_admin_new_host
|
|
ueba_offhours_login
|
|
ueba_first_privileged_use
|
|
ueba_new_user_context
|
|
ueba_update
|
|
host_risk_score
|
|
```
|
|
|
|
---
|
|
|
|
## 2. Datenbasis
|
|
|
|
### 2.1 Tabelle `event_logs`
|
|
|
|
Die meisten Regeln basieren auf normalisierten Windows-Events in `event_logs`.
|
|
|
|
Wichtige Felder:
|
|
|
|
| Feld | Bedeutung |
|
|
|---|---|
|
|
| `hostname` | Hostname des meldenden Systems oder aus dem Event-XML |
|
|
| `channel_name` | Windows Eventlog-Channel, z. B. `Security`, `System`, `Application` |
|
|
| `event_id` | Windows Event ID |
|
|
| `target_user` | Zielbenutzer, meist aus `TargetUserName` |
|
|
| `subject_user` | ausführender Benutzer, meist aus `SubjectUserName` |
|
|
| `src_ip` | Quell-IP aus `IpAddress` |
|
|
| `workstation` | Workstation aus `WorkstationName` |
|
|
| `logon_type` | Windows LogonType |
|
|
| `process_name` | Prozessname, sofern vorhanden |
|
|
| `ts` | Event-Zeitpunkt |
|
|
| `received_at` | Empfangszeitpunkt |
|
|
| `msg` | Rohes Event-XML |
|
|
| `msg_sha256` | Hash des Event-XML |
|
|
|
|
### 2.2 Tabelle `detections`
|
|
|
|
Alle Regeln schreiben Findings in die Tabelle `detections`.
|
|
|
|
Wichtige Felder:
|
|
|
|
| Feld | Bedeutung |
|
|
|---|---|
|
|
| `rule_name` | Name der Regel |
|
|
| `severity` | `info`, `low`, `medium`, `high`, `critical` |
|
|
| `hostname` | betroffener Host |
|
|
| `channel_name` | Eventlog-Channel |
|
|
| `event_id` | relevante Event ID |
|
|
| `score` | numerischer Risiko-/Anomalie-Score |
|
|
| `window_start` | Beginn des betrachteten Zeitfensters |
|
|
| `window_end` | Ende des betrachteten Zeitfensters |
|
|
| `summary` | menschenlesbare Zusammenfassung |
|
|
| `details_json` | technische Details als JSON |
|
|
| `status` | SOC-Bewertung |
|
|
| `analyst_note` | Analystenkommentar |
|
|
| `reviewed_by` | Bearbeiter |
|
|
| `reviewed_at` | Bewertungszeitpunkt |
|
|
| `is_false_positive` | Flag für False Positive |
|
|
| `is_legitimate` | Flag für legitimes/plausibles Verhalten |
|
|
|
|
---
|
|
|
|
## 3. Globale Konfiguration
|
|
|
|
Die wichtigsten Regelparameter werden per Environment-Variablen gesetzt.
|
|
|
|
| Variable | Default | Bedeutung |
|
|
|---|---:|---|
|
|
| `DETECTION_INTERVAL` | `1m` | Intervall des Detection-Loops |
|
|
| `OFFLINE_AFTER` | `10m` | Agent gilt nach dieser Zeit als offline |
|
|
| `OFFLINE_ALERT_MAX` | `120m` | Maximales Offline-Alter für Offline-Alerts |
|
|
| `FAILED_LOGON_WINDOW` | `5m` | Zeitfenster für fehlgeschlagene Logons |
|
|
| `FAILED_LOGON_THRESHOLD` | `25` | Mindestanzahl fehlgeschlagener Logons pro Host |
|
|
| `REBOOT_WINDOW` | `15m` | Zeitfenster für Reboot-Spikes |
|
|
| `REBOOT_THRESHOLD` | `3` | Mindestanzahl Reboot-/Shutdown-Events |
|
|
| `PASSWORD_SPRAY_WINDOW` | `5m` | Zeitfenster für Password-Spray |
|
|
| `PASSWORD_SPRAY_MIN_USERS` | `5` | Mindestanzahl unterschiedlicher Zielbenutzer |
|
|
| `PASSWORD_SPRAY_MIN_ATTEMPTS` | `15` | Mindestanzahl Fehlversuche |
|
|
| `SUCCESS_AFTER_FAILURE_WINDOW` | `10m` | Zeitfenster für Erfolg nach Fehlversuchen |
|
|
| `NEW_SOURCE_IP_LOOKBACK` | `720h` / 30 Tage | Rückblick für bekannte Quell-IPs |
|
|
| `NEW_SOURCE_IP_WINDOW` | `10m` | aktuelles Fenster für neue Quell-IP |
|
|
| `BASELINE_ENABLED` | `true` | aktiviert Baseline-Regeln |
|
|
| `BASELINE_WINDOW` | `5m` | Baseline-Bucket-Zeitfenster |
|
|
| `BASELINE_MIN_SAMPLES` | `24` | Mindestanzahl Baseline-Samples |
|
|
| `BASELINE_MIN_COUNT` | `10` | Mindestanzahl Events für Baseline-Alert |
|
|
| `BASELINE_MEDIUM_Z` | `2.5` | Z-Score ab Medium |
|
|
| `BASELINE_HIGH_Z` | `4.0` | Z-Score ab High |
|
|
| `BASELINE_SUPPRESS_FOR` | `1h` | automatische Unterdrückung gleicher Baseline-Findings |
|
|
| `UEBA_ENABLED` | `true` | aktiviert UEBA-Regeln |
|
|
| `UEBA_LOOKBACK` | `720h` / 30 Tage | UEBA-Rückblick |
|
|
| `UEBA_NEW_CONTEXT_WINDOW` | `10m` | Fenster für neue Kontexte |
|
|
| `RISK_SCORE_WINDOW` | `24h` | Zeitraum für Host Risk Score |
|
|
| `TZ` | `Europe/Berlin` | Anzeige-/Bewertungszeitzone |
|
|
|
|
---
|
|
|
|
## 4. Severity-Logik
|
|
|
|
### 4.1 `severityFromScore`
|
|
|
|
Mehrere Regeln nutzen diese Score-zu-Severity-Logik:
|
|
|
|
```go
|
|
func severityFromScore(score, low, medium, high, critical float64) string
|
|
```
|
|
|
|
Beispielaufruf:
|
|
|
|
```go
|
|
severityFromScore(score, 1.0, 2.0, 4.0, 8.0)
|
|
```
|
|
|
|
Bedeutung:
|
|
|
|
| Score | Severity |
|
|
|---:|---|
|
|
| `>= 8.0` | `critical` |
|
|
| `>= 4.0` | `high` |
|
|
| `>= 2.0` | `medium` |
|
|
| `>= 1.0` | `low` |
|
|
| `< 1.0` | `info` |
|
|
|
|
### 4.2 Host Risk Severity
|
|
|
|
Der Host Risk Score nutzt eine separate Einteilung:
|
|
|
|
| Risk Score | Severity |
|
|
|---:|---|
|
|
| `>= 120` | `critical` |
|
|
| `>= 60` | `high` |
|
|
| `>= 20` | `medium` |
|
|
| `>= 5` | `low` |
|
|
| `< 5` | `info` |
|
|
|
|
---
|
|
|
|
# 5. Regel: `agent_offline`
|
|
|
|
## Zweck
|
|
|
|
Erkennt Agents, die länger als `OFFLINE_AFTER` nicht mehr gesehen wurden, aber noch nicht älter als `OFFLINE_ALERT_MAX` offline sind.
|
|
|
|
## Datenbasis
|
|
|
|
Tabelle: `agents`
|
|
|
|
Relevante Felder:
|
|
|
|
- `hostname`
|
|
- `last_seen`
|
|
- `is_enabled`
|
|
|
|
## Logik
|
|
|
|
Ein Agent wird gemeldet, wenn:
|
|
|
|
```sql
|
|
is_enabled = 1
|
|
AND last_seen < now - OFFLINE_AFTER
|
|
AND last_seen >= now - OFFLINE_ALERT_MAX
|
|
```
|
|
|
|
## Default-Werte
|
|
|
|
| Parameter | Default |
|
|
|---|---:|
|
|
| `OFFLINE_AFTER` | `10m` |
|
|
| `OFFLINE_ALERT_MAX` | `120m` |
|
|
|
|
## Detection
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Rule | `agent_offline` |
|
|
| Severity | `low` |
|
|
| Score | abhängig von Offline-Dauer |
|
|
| Channel | leer |
|
|
| EventID | `0` |
|
|
|
|
## Beispiel-Summary
|
|
|
|
```text
|
|
Agent CLIENT01 ist seit 17 Minuten offline
|
|
```
|
|
|
|
## SOC-Bewertung
|
|
|
|
Empfohlene Bewertung:
|
|
|
|
- `legitimate`, wenn Gerät heruntergefahren, neu installiert oder absichtlich deaktiviert wurde.
|
|
- `investigating`, wenn Server oder kritischer Client unerwartet offline ist.
|
|
- `suppressed`, wenn bestimmte Systeme dauerhaft nicht überwacht werden sollen.
|
|
|
|
---
|
|
|
|
# 6. Regel: `failed_logon_spike`
|
|
|
|
## Zweck
|
|
|
|
Erkennt Hosts mit ungewöhnlich vielen fehlgeschlagenen Logons innerhalb kurzer Zeit.
|
|
|
|
## Datenbasis
|
|
|
|
Tabelle: `event_logs`
|
|
|
|
Windows Event:
|
|
|
|
| Channel | EventID |
|
|
|---|---:|
|
|
| `Security` | `4625` |
|
|
|
|
## Logik
|
|
|
|
Gruppierung nach Host:
|
|
|
|
```sql
|
|
channel_name = 'Security'
|
|
AND event_id = 4625
|
|
AND ts >= window_start
|
|
AND ts < window_end
|
|
GROUP BY hostname
|
|
HAVING COUNT(*) >= FAILED_LOGON_THRESHOLD
|
|
```
|
|
|
|
## Default-Werte
|
|
|
|
| Parameter | Default |
|
|
|---|---:|
|
|
| `FAILED_LOGON_WINDOW` | `5m` |
|
|
| `FAILED_LOGON_THRESHOLD` | `25` |
|
|
|
|
## Score
|
|
|
|
```text
|
|
score = count / FAILED_LOGON_THRESHOLD
|
|
```
|
|
|
|
Severity wird über `severityFromScore(score, 1.0, 2.0, 4.0, 8.0)` berechnet.
|
|
|
|
## Detection
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Rule | `failed_logon_spike` |
|
|
| EventID | `4625` |
|
|
| Channel | `Security` |
|
|
| Severity | score-basiert |
|
|
|
|
## Beispiel-Summary
|
|
|
|
```text
|
|
Host DC01 hatte 48 fehlgeschlagene Logons in 5 Minuten
|
|
```
|
|
|
|
## Typische Ursachen
|
|
|
|
- Brute-Force-Versuch
|
|
- falsch gespeichertes Passwort in Diensten
|
|
- altes Passwort in RDP-/VPN-/Outlook-Sessions
|
|
- Scanner oder Monitoring mit falschen Credentials
|
|
- Lockout-Situation nach Passwortwechsel
|
|
|
|
## SOC-Bewertung
|
|
|
|
- `investigating`, wenn unbekannte Quelle, viele Accounts oder externe IP beteiligt.
|
|
- `legitimate`, wenn bekannter Dienst nach Passwortwechsel betroffen ist.
|
|
- `false_positive`, wenn Event-Parsing oder Testdaten Ursache sind.
|
|
|
|
---
|
|
|
|
# 7. Regel: `reboot_spike`
|
|
|
|
## Zweck
|
|
|
|
Erkennt Hosts mit mehreren Reboot-/Shutdown-Events in kurzer Zeit.
|
|
|
|
## Datenbasis
|
|
|
|
Tabelle: `event_logs`
|
|
|
|
Windows Events:
|
|
|
|
| Channel | EventID | Bedeutung |
|
|
|---|---:|---|
|
|
| `System` | `1074` | geplanter Neustart/Shutdown |
|
|
| `System` | `6005` | Eventlog-Service gestartet |
|
|
| `System` | `6006` | Eventlog-Service beendet |
|
|
|
|
## Logik
|
|
|
|
```sql
|
|
channel_name = 'System'
|
|
AND event_id IN (1074, 6005, 6006)
|
|
AND ts >= window_start
|
|
AND ts < window_end
|
|
GROUP BY hostname
|
|
HAVING COUNT(*) >= REBOOT_THRESHOLD
|
|
```
|
|
|
|
## Default-Werte
|
|
|
|
| Parameter | Default |
|
|
|---|---:|
|
|
| `REBOOT_WINDOW` | `15m` |
|
|
| `REBOOT_THRESHOLD` | `3` |
|
|
|
|
## Score
|
|
|
|
```text
|
|
score = count / REBOOT_THRESHOLD
|
|
```
|
|
|
|
## Detection
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Rule | `reboot_spike` |
|
|
| Channel | `System` |
|
|
| Severity | score-basiert |
|
|
|
|
## Beispiel-Summary
|
|
|
|
```text
|
|
Host CLIENT01 hatte 4 Reboot-/Shutdown-Events in 15 Minuten
|
|
```
|
|
|
|
## Typische Ursachen
|
|
|
|
- Patchinstallation
|
|
- Treiberproblem
|
|
- instabiler Client
|
|
- Stromproblem
|
|
- absichtlicher Neustart durch Admin
|
|
- Malware/Manipulation eher selten, aber möglich
|
|
|
|
---
|
|
|
|
# 8. Regel: `new_event_id`
|
|
|
|
## Zweck
|
|
|
|
Erkennt, wenn ein Host erstmals eine bestimmte EventID in einem bestimmten Channel sendet.
|
|
|
|
## Datenbasis
|
|
|
|
Tabelle: `event_logs`
|
|
|
|
## Logik
|
|
|
|
Die Regel betrachtet nur das aktuelle Detection-Intervall und prüft, ob es davor für denselben Host, Channel und EventID bereits Events gab.
|
|
|
|
Vereinfacht:
|
|
|
|
```sql
|
|
WHERE e.ts >= window_start
|
|
AND e.ts < window_end
|
|
AND NOT EXISTS (
|
|
SELECT 1
|
|
FROM event_logs old
|
|
WHERE old.hostname = e.hostname
|
|
AND old.channel_name = e.channel_name
|
|
AND old.event_id = e.event_id
|
|
AND old.ts < window_start
|
|
)
|
|
GROUP BY e.hostname, e.channel_name, e.event_id
|
|
```
|
|
|
|
## Default-Werte
|
|
|
|
| Parameter | Default |
|
|
|---|---:|
|
|
| `DETECTION_INTERVAL` | `1m` |
|
|
|
|
## Score
|
|
|
|
```text
|
|
score = 1.0 + log10(count + 1)
|
|
```
|
|
|
|
## Severity
|
|
|
|
| Bedingung | Severity |
|
|
|---|---|
|
|
| `count >= 10` | `high` |
|
|
| sonst | `medium` |
|
|
|
|
## Detection
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Rule | `new_event_id` |
|
|
| Channel | aus Event |
|
|
| EventID | aus Event |
|
|
|
|
## Beispiel-Summary
|
|
|
|
```text
|
|
Host CLIENT01 sendet erstmals Event-ID 7045 im Channel System
|
|
```
|
|
|
|
## Typische Ursachen
|
|
|
|
- neue Software
|
|
- neue Windows-Funktion
|
|
- neues Audit-Policy-Setting
|
|
- Treiberinstallation
|
|
- Service-Installation
|
|
- sicherheitsrelevante Aktivität, wenn EventID auffällig ist
|
|
|
|
## SOC-Bewertung
|
|
|
|
Besonders prüfen bei:
|
|
|
|
- `System 7045` Service Installation
|
|
- `Security 1102` Auditlog gelöscht
|
|
- `Security 4720` User erstellt
|
|
- `Security 4697` Service installiert
|
|
- `Security 4698` Scheduled Task erstellt
|
|
|
|
---
|
|
|
|
# 9. Regel: `password_spray`
|
|
|
|
## Zweck
|
|
|
|
Erkennt mögliche Password-Spray-Angriffe anhand vieler fehlgeschlagener Logons gegen mehrere verschiedene Benutzer von derselben Quell-IP.
|
|
|
|
## Datenbasis
|
|
|
|
Tabelle: `event_logs`
|
|
|
|
Windows Event:
|
|
|
|
| Channel | EventID |
|
|
|---|---:|
|
|
| `Security` | `4625` |
|
|
|
|
## Logik
|
|
|
|
Gruppierung nach Host und Quell-IP:
|
|
|
|
```sql
|
|
channel_name = 'Security'
|
|
AND event_id = 4625
|
|
AND src_ip <> ''
|
|
AND src_ip <> '-'
|
|
AND src_ip <> '::1'
|
|
AND src_ip <> '127.0.0.1'
|
|
AND target_user <> ''
|
|
AND target_user <> '-'
|
|
GROUP BY hostname, src_ip
|
|
HAVING COUNT(*) >= PASSWORD_SPRAY_MIN_ATTEMPTS
|
|
AND COUNT(DISTINCT target_user) >= PASSWORD_SPRAY_MIN_USERS
|
|
```
|
|
|
|
## Default-Werte
|
|
|
|
| Parameter | Default |
|
|
|---|---:|
|
|
| `PASSWORD_SPRAY_WINDOW` | `5m` |
|
|
| `PASSWORD_SPRAY_MIN_USERS` | `5` |
|
|
| `PASSWORD_SPRAY_MIN_ATTEMPTS` | `15` |
|
|
|
|
## Score
|
|
|
|
```text
|
|
score = max(
|
|
attempts / PASSWORD_SPRAY_MIN_ATTEMPTS,
|
|
users / PASSWORD_SPRAY_MIN_USERS
|
|
)
|
|
```
|
|
|
|
Severity wird über `severityFromScore(score, 1.0, 2.0, 4.0, 8.0)` berechnet.
|
|
|
|
## Detection
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Rule | `password_spray` |
|
|
| Channel | `Security` |
|
|
| EventID | `4625` |
|
|
|
|
## Beispiel-Summary
|
|
|
|
```text
|
|
Möglicher Password-Spray auf DC01 von 10.10.10.50: 30 Fehlversuche gegen 12 Benutzer
|
|
```
|
|
|
|
## Typische Ursachen
|
|
|
|
- echter Password-Spray
|
|
- Scanner mit falschem Passwort
|
|
- altes Passwort in zentralem Dienst
|
|
- falsch konfigurierte Applikation
|
|
- VPN-/RADIUS-/LDAP-Fehlversuche
|
|
|
|
## Empfohlene Prüfung
|
|
|
|
- Quell-IP identifizieren.
|
|
- Prüfen, ob Quell-IP intern, VPN, Server oder extern ist.
|
|
- Betroffene Benutzer auf Lockout oder spätere erfolgreiche Logons prüfen.
|
|
- In Kombination mit `success_after_failures` hoch priorisieren.
|
|
|
|
---
|
|
|
|
# 10. Regel: `success_after_failures`
|
|
|
|
## Zweck
|
|
|
|
Erkennt erfolgreiche Logons, denen kurz zuvor fehlgeschlagene Logons für denselben Benutzer vorausgingen.
|
|
|
|
## Datenbasis
|
|
|
|
Tabelle: `event_logs`
|
|
|
|
Windows Events:
|
|
|
|
| EventID | Bedeutung |
|
|
|---:|---|
|
|
| `4625` | fehlgeschlagener Logon |
|
|
| `4624` | erfolgreicher Logon |
|
|
|
|
## Logik
|
|
|
|
Ein erfolgreicher Logon wird verdächtig, wenn vorher im konfigurierten Fenster ein passender fehlgeschlagener Logon existiert.
|
|
|
|
Vereinfacht:
|
|
|
|
```sql
|
|
s.event_id = 4624
|
|
AND EXISTS (
|
|
SELECT 1
|
|
FROM event_logs f
|
|
WHERE f.hostname = s.hostname
|
|
AND f.event_id = 4625
|
|
AND f.target_user = s.target_user
|
|
AND f.ts >= DATE_SUB(s.ts, INTERVAL ? SECOND)
|
|
AND f.ts < s.ts
|
|
)
|
|
```
|
|
|
|
Die Quell-IP wird berücksichtigt, wenn sie vorhanden ist.
|
|
|
|
## Default-Wert
|
|
|
|
| Parameter | Default |
|
|
|---|---:|
|
|
| `SUCCESS_AFTER_FAILURE_WINDOW` | `10m` |
|
|
|
|
## Score
|
|
|
|
```text
|
|
score = 2.0 + log10(success_count + 1)
|
|
```
|
|
|
|
## Severity
|
|
|
|
Aktuell fest:
|
|
|
|
```text
|
|
high
|
|
```
|
|
|
|
## Detection
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Rule | `success_after_failures` |
|
|
| Channel | `Security` |
|
|
| EventID | `4624` |
|
|
| Severity | `high` |
|
|
|
|
## Beispiel-Summary
|
|
|
|
```text
|
|
Erfolgreicher Logon nach Fehlversuchen auf CLIENT01 für Benutzer max.mustermann
|
|
```
|
|
|
|
## Typische Ursachen
|
|
|
|
- Benutzer hat sich vertippt und danach korrekt angemeldet
|
|
- Angreifer hat Passwort erraten
|
|
- Passwort-Spray mit anschließendem Treffer
|
|
- Passwortänderung und gespeicherte Sessions
|
|
|
|
## Empfohlene Bewertung
|
|
|
|
Diese Regel sollte priorisiert werden, wenn zusätzlich eines davon zutrifft:
|
|
|
|
- neue Quell-IP
|
|
- ungewöhnlicher Host
|
|
- privilegierter Benutzer
|
|
- außerhalb Arbeitszeit
|
|
- mehrere Zielbenutzer betroffen
|
|
- externer oder unbekannter Ursprung
|
|
|
|
---
|
|
|
|
# 11. Regel: `new_source_ip_for_user`
|
|
|
|
## Zweck
|
|
|
|
Erkennt erfolgreiche Logons eines Benutzers von einer bisher unbekannten Quell-IP.
|
|
|
|
## Datenbasis
|
|
|
|
Tabelle: `event_logs`
|
|
|
|
Windows Event:
|
|
|
|
| Channel | EventID |
|
|
|---|---:|
|
|
| `Security` | `4624` |
|
|
|
|
## Logik
|
|
|
|
Die Regel betrachtet erfolgreiche Logons im aktuellen Fenster und prüft, ob dieselbe Quell-IP für denselben Benutzer auf demselben Host im Lookback-Zeitraum bereits bekannt war.
|
|
|
|
```sql
|
|
event_id = 4624
|
|
AND src_ip NOT IN ('', '-', '::1', '127.0.0.1')
|
|
AND NOT EXISTS (
|
|
SELECT 1
|
|
FROM event_logs old
|
|
WHERE old.hostname = e.hostname
|
|
AND old.event_id = 4624
|
|
AND old.target_user = e.target_user
|
|
AND old.src_ip = e.src_ip
|
|
AND old.ts >= lookback_start
|
|
AND old.ts < window_start
|
|
)
|
|
```
|
|
|
|
## Default-Werte
|
|
|
|
| Parameter | Default |
|
|
|---|---:|
|
|
| `NEW_SOURCE_IP_WINDOW` | `10m` |
|
|
| `NEW_SOURCE_IP_LOOKBACK` | `30d` |
|
|
|
|
## Score
|
|
|
|
```text
|
|
score = 1.5 + log10(count + 1)
|
|
```
|
|
|
|
## Severity
|
|
|
|
| Bedingung | Severity |
|
|
|---|---|
|
|
| `count >= 5` | `high` |
|
|
| sonst | `medium` |
|
|
|
|
## Detection
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Rule | `new_source_ip_for_user` |
|
|
| Channel | `Security` |
|
|
| EventID | `4624` |
|
|
|
|
## Beispiel-Summary
|
|
|
|
```text
|
|
Benutzer max.mustermann meldet sich auf CLIENT01 von neuer Quell-IP 10.10.50.20 an
|
|
```
|
|
|
|
## Typische Ursachen
|
|
|
|
- neuer Client
|
|
- VPN-Wechsel
|
|
- DHCP-Wechsel
|
|
- RDP von ungewohntem System
|
|
- kompromittierter Account
|
|
|
|
---
|
|
|
|
# 12. Regel: `dynamic_rules`
|
|
|
|
## Zweck
|
|
|
|
Ermöglicht frei konfigurierbare Regeln über die Weboberfläche und Tabelle `detection_rules`.
|
|
|
|
## Datenbasis
|
|
|
|
Tabelle:
|
|
|
|
```text
|
|
detection_rules
|
|
```
|
|
|
|
Ausgewertet gegen:
|
|
|
|
```text
|
|
event_logs
|
|
```
|
|
|
|
## Regeltypen
|
|
|
|
Es gibt zwei Betriebsarten:
|
|
|
|
1. Einzelereignis-Regel
|
|
2. Threshold-Regel
|
|
|
|
### 12.1 Einzelereignis-Regel
|
|
|
|
Wird verwendet, wenn:
|
|
|
|
```text
|
|
threshold_count <= 1
|
|
ODER
|
|
threshold_window_seconds <= 0
|
|
```
|
|
|
|
Sie prüft Events im aktuellen `DETECTION_INTERVAL`.
|
|
|
|
### 12.2 Threshold-Regel
|
|
|
|
Wird verwendet, wenn:
|
|
|
|
```text
|
|
threshold_count > 1
|
|
UND
|
|
threshold_window_seconds > 0
|
|
```
|
|
|
|
Sie zählt passende Events im angegebenen Zeitfenster pro Host.
|
|
|
|
## Konfigurierbare Felder
|
|
|
|
| Feld | Bedeutung |
|
|
|---|---|
|
|
| `name` | Regelname |
|
|
| `description` | Beschreibung |
|
|
| `severity` | Severity |
|
|
| `channel` | ein oder mehrere Channels, kommasepariert |
|
|
| `event_ids` | ein oder mehrere EventIDs, kommasepariert |
|
|
| `match_field` | optionales Feld für Filter |
|
|
| `match_operator` | `eq`, `contains`, `in` |
|
|
| `match_value` | Vergleichswert |
|
|
| `threshold_count` | Mindestanzahl Events |
|
|
| `threshold_window_seconds` | Zeitfenster |
|
|
| `suppress_for_seconds` | Suppression-Zeit |
|
|
| `enabled` | aktiv/inaktiv |
|
|
|
|
## Unterstützte Match-Felder
|
|
|
|
| `match_field` | DB-Spalte |
|
|
|---|---|
|
|
| `hostname` | `hostname` |
|
|
| `channel` | `channel_name` |
|
|
| `event_id` | `event_id` |
|
|
| `target_user` | `target_user` |
|
|
| `subject_user` | `subject_user` |
|
|
| `src_ip` | `src_ip` |
|
|
| `workstation` | `workstation` |
|
|
| `process_name` | `process_name` |
|
|
| `msg` | `msg` |
|
|
|
|
## Unterstützte Operatoren
|
|
|
|
| Operator | Bedeutung |
|
|
|---|---|
|
|
| `eq` | exakter Vergleich |
|
|
| `contains` | Teilstring-Suche |
|
|
| `in` | Wert ist in kommaseparierter Liste enthalten |
|
|
|
|
## Detection-Name
|
|
|
|
Dynamische Regeln werden mit Prefix gespeichert:
|
|
|
|
```text
|
|
dynamic_<Regelname>
|
|
```
|
|
|
|
Beispiel:
|
|
|
|
```text
|
|
dynamic_security_log_cleared
|
|
```
|
|
|
|
## Beispiel-Regeln
|
|
|
|
### Auditlog gelöscht
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `security_log_cleared` |
|
|
| Severity | `critical` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `1102` |
|
|
| Threshold Count | `1` |
|
|
| Suppress Seconds | `3600` |
|
|
|
|
### Neuer lokaler Benutzer
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `local_user_created` |
|
|
| Severity | `high` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `4720` |
|
|
| Threshold Count | `1` |
|
|
|
|
### Service installiert
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `service_installed` |
|
|
| Severity | `high` |
|
|
| Channel | `System,Security` |
|
|
| Event IDs | `7045,4697` |
|
|
|
|
---
|
|
|
|
# 13. Regel: `baseline_event_rate_anomaly`
|
|
|
|
## Zweck
|
|
|
|
Erkennt statistische Abweichungen bei Event-Häufigkeiten je Host, Channel, EventID, Wochentag und Stunde.
|
|
|
|
## Komponenten
|
|
|
|
Die Baseline besteht aus zwei Teilen:
|
|
|
|
1. `baseline_update`
|
|
2. `baseline_anomaly`
|
|
|
|
## 13.1 `baseline_update`
|
|
|
|
Aktualisiert die Statistik in `baseline_event_stats`.
|
|
|
|
Gruppierung:
|
|
|
|
```text
|
|
hostname
|
|
channel_name
|
|
event_id
|
|
hour_of_day
|
|
day_of_week
|
|
```
|
|
|
|
Es wird ein Online-Mittelwert mit M2/Stddev gepflegt.
|
|
|
|
## 13.2 `baseline_anomaly`
|
|
|
|
Vergleicht aktuelle Counts gegen die gespeicherte Baseline.
|
|
|
|
## Datenbasis
|
|
|
|
Tabellen:
|
|
|
|
- `event_logs`
|
|
- `baseline_event_stats`
|
|
- `baseline_exclusions`
|
|
- `detections`
|
|
|
|
## Default-Werte
|
|
|
|
| Parameter | Default |
|
|
|---|---:|
|
|
| `BASELINE_WINDOW` | `5m` |
|
|
| `BASELINE_MIN_SAMPLES` | `24` |
|
|
| `BASELINE_MIN_COUNT` | `10` |
|
|
| `BASELINE_MEDIUM_Z` | `2.5` |
|
|
| `BASELINE_HIGH_Z` | `4.0` |
|
|
| `BASELINE_SUPPRESS_FOR` | `1h` |
|
|
|
|
## Berechnung
|
|
|
|
```text
|
|
z = (current_count - avg_count) / stddev_count
|
|
```
|
|
|
|
## Voraussetzungen für Alert
|
|
|
|
Ein Alert entsteht nur, wenn:
|
|
|
|
```text
|
|
sample_count >= BASELINE_MIN_SAMPLES
|
|
count >= BASELINE_MIN_COUNT
|
|
stddev_count > 0
|
|
z >= BASELINE_MEDIUM_Z
|
|
```
|
|
|
|
## Severity
|
|
|
|
| Bedingung | Severity |
|
|
|---|---|
|
|
| `z >= BASELINE_HIGH_Z` | `high` |
|
|
| `z >= BASELINE_MEDIUM_Z` | `medium` |
|
|
|
|
## Detection
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Rule | `baseline_event_rate_anomaly` |
|
|
| Score | Z-Score |
|
|
| Severity | z-score-basiert |
|
|
|
|
## Beispiel-Summary
|
|
|
|
```text
|
|
Baseline-Anomalie auf DC01: Security EventID 4625 kam 80-mal in 5 Minuten, normal 12.40 ± 5.10, z=13.25
|
|
```
|
|
|
|
## Ausschlüsse
|
|
|
|
Baseline-Lernen wird übersprungen, wenn:
|
|
|
|
- passender Eintrag in `baseline_exclusions` aktiv ist
|
|
- ein `confirmed_incident` im aktuellen Fenster existiert
|
|
|
|
## UI-Bewertung
|
|
|
|
In der Detection-UI kann über `Baseline` gesteuert werden:
|
|
|
|
| Aktion | Effekt |
|
|
|---|---|
|
|
| `nicht lernen: 24h` | temporärer Baseline-Ausschluss |
|
|
| `nicht lernen: 7 Tage` | temporärer Baseline-Ausschluss |
|
|
| `nicht lernen: 30 Tage` | temporärer Baseline-Ausschluss |
|
|
| `nicht lernen: dauerhaft` | permanenter Baseline-Ausschluss |
|
|
|
|
Bei `confirmed_incident` wird automatisch ein 7-Tage-Ausschluss erzeugt, sofern keine andere Baseline-Aktion gewählt wurde.
|
|
|
|
---
|
|
|
|
# 14. Regel: `ueba_admin_new_host`
|
|
|
|
## Zweck
|
|
|
|
Erkennt, wenn sich ein privilegierter Benutzer erstmals auf einem Host anmeldet.
|
|
|
|
## Datenbasis
|
|
|
|
Tabellen:
|
|
|
|
- `event_logs`
|
|
- `ueba_user_baseline`
|
|
- `privileged_users`
|
|
|
|
Windows Event:
|
|
|
|
| Channel | EventID |
|
|
|---|---:|
|
|
| `Security` | `4624` |
|
|
|
|
## Privilegierte Benutzer
|
|
|
|
Ein Benutzer gilt als privilegiert, wenn:
|
|
|
|
1. er in `privileged_users` aktiviert ist, oder
|
|
2. sein Name einem Admin-Muster entspricht:
|
|
|
|
```text
|
|
adm-*
|
|
*-adm
|
|
*.adm
|
|
```
|
|
|
|
Maschinenkonten werden ignoriert.
|
|
|
|
## Logik
|
|
|
|
Es werden erfolgreiche Logons im aktuellen UEBA-Fenster betrachtet. Für Benutzer/Host-Kombinationen wird geprüft, ob es im Lookback bereits einen passenden Baseline-Kontext gab.
|
|
|
|
## Default-Werte
|
|
|
|
| Parameter | Default |
|
|
|---|---:|
|
|
| `UEBA_NEW_CONTEXT_WINDOW` | `10m` |
|
|
| `UEBA_LOOKBACK` | `30d` |
|
|
|
|
## Score und Severity
|
|
|
|
| Bedingung | Score | Severity |
|
|
|---|---:|---|
|
|
| `count < 3` | `6.0` | `high` |
|
|
| `count >= 3` | `9.0` | `critical` |
|
|
|
|
## Detection
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Rule | `ueba_admin_new_host` |
|
|
| Channel | `Security` |
|
|
| EventID | `4624` |
|
|
|
|
## Beispiel-Summary
|
|
|
|
```text
|
|
UEBA: Privilegierter Benutzer adm.max meldet sich erstmals auf Host SERVER01 an
|
|
```
|
|
|
|
## Prometheus-Metriken
|
|
|
|
Bei neuer Detection wird erhöht:
|
|
|
|
```text
|
|
siem_privileged_new_host_total{user,host}
|
|
```
|
|
|
|
## SOC-Bewertung
|
|
|
|
Diese Regel ist besonders relevant, wenn:
|
|
|
|
- der Host ein Client statt Admin-Jump-Host ist
|
|
- der Login außerhalb Arbeitszeit erfolgt
|
|
- vorher Fehlversuche auftraten
|
|
- die Quell-IP neu ist
|
|
- der Benutzer Domain Admin oder Server Admin ist
|
|
|
|
---
|
|
|
|
# 15. Regel: `ueba_new_user_context`
|
|
|
|
## Zweck
|
|
|
|
Erkennt neue Login-Kontexte für normale Benutzer.
|
|
|
|
Ein Kontext besteht aus:
|
|
|
|
```text
|
|
username + hostname + src_ip + workstation
|
|
```
|
|
|
|
## Datenbasis
|
|
|
|
Tabellen:
|
|
|
|
- `event_logs`
|
|
- `ueba_user_baseline`
|
|
|
|
Windows Event:
|
|
|
|
| Channel | EventID |
|
|
|---|---:|
|
|
| `Security` | `4624` |
|
|
|
|
## Logik
|
|
|
|
Ein Alert entsteht, wenn für einen erfolgreichen Logon im aktuellen Fenster kein bekannter Baseline-Kontext im Lookback existiert.
|
|
|
|
## Default-Werte
|
|
|
|
| Parameter | Default |
|
|
|---|---:|
|
|
| `UEBA_NEW_CONTEXT_WINDOW` | `10m` |
|
|
| `UEBA_LOOKBACK` | `30d` |
|
|
|
|
## Score und Severity
|
|
|
|
| Bedingung | Score | Severity |
|
|
|---|---:|---|
|
|
| `count < 5` | `2.0` | `medium` |
|
|
| `count >= 5` | `4.0` | `high` |
|
|
|
|
## Detection
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Rule | `ueba_new_user_context` |
|
|
| Channel | `Security` |
|
|
| EventID | `4624` |
|
|
|
|
## Beispiel-Summary
|
|
|
|
```text
|
|
UEBA: Benutzer max.mustermann meldet sich in neuem Kontext an: Host=CLIENT01 IP=10.10.20.30 Workstation=CLIENT99
|
|
```
|
|
|
|
## Typische Ursachen
|
|
|
|
- neuer Arbeitsplatz
|
|
- VPN
|
|
- DHCP-Wechsel
|
|
- Remotezugriff
|
|
- Helpdesk-Anmeldung
|
|
- kompromittierter Account
|
|
|
|
---
|
|
|
|
# 16. Regel: `ueba_update`
|
|
|
|
## Zweck
|
|
|
|
Aktualisiert die UEBA-Baseline für Benutzerkontexte.
|
|
|
|
## Datenbasis
|
|
|
|
Tabelle:
|
|
|
|
```text
|
|
ueba_user_baseline
|
|
```
|
|
|
|
Quelle:
|
|
|
|
```text
|
|
event_logs
|
|
```
|
|
|
|
## Logik
|
|
|
|
Erfolgreiche Logons im aktuellen UEBA-Fenster werden in die Baseline übernommen.
|
|
|
|
Kontext:
|
|
|
|
```text
|
|
username
|
|
hostname
|
|
src_ip
|
|
workstation
|
|
```
|
|
|
|
Bei neuem Kontext:
|
|
|
|
```sql
|
|
INSERT INTO ueba_user_baseline (...)
|
|
```
|
|
|
|
Bei bekanntem Kontext:
|
|
|
|
```sql
|
|
last_seen = UTC_TIMESTAMP(6)
|
|
seen_count = seen_count + VALUES(seen_count)
|
|
```
|
|
|
|
## Wichtig
|
|
|
|
Die Reihenfolge im Detection-Loop ist relevant.
|
|
|
|
Empfohlen:
|
|
|
|
```text
|
|
ueba_admin_new_host
|
|
ueba_offhours_login
|
|
ueba_first_privileged_use
|
|
ueba_new_user_context
|
|
ueba_update
|
|
```
|
|
|
|
So werden neue Kontexte zuerst erkannt und danach gelernt.
|
|
|
|
---
|
|
|
|
# 17. Regel: `ueba_offhours_login`
|
|
|
|
## Zweck
|
|
|
|
Erkennt erfolgreiche Benutzeranmeldungen außerhalb der definierten Arbeitszeit.
|
|
|
|
## Aktuelle Arbeitszeit
|
|
|
|
```text
|
|
06:00 bis 20:00 Uhr
|
|
```
|
|
|
|
Außerhalb dieser Zeit wird geprüft.
|
|
|
|
## Datenbasis
|
|
|
|
Tabelle:
|
|
|
|
```text
|
|
event_logs
|
|
```
|
|
|
|
Windows Event:
|
|
|
|
| Channel | EventID |
|
|
|---|---:|
|
|
| `Security` | `4624` |
|
|
|
|
## Empfohlene Filter
|
|
|
|
Um Rauschen durch technische Accounts zu vermeiden, sollten technische Accounts ausgeschlossen werden.
|
|
|
|
### Empfohlene Go-Hilfsfunktion
|
|
|
|
```go
|
|
func isNoiseAccount(username string) bool {
|
|
u := normalizeUsername(username)
|
|
|
|
if u == "" || isMachineAccount(u) {
|
|
return true
|
|
}
|
|
|
|
switch u {
|
|
case "system",
|
|
"localsystem",
|
|
"local service",
|
|
"network service",
|
|
"anonymous logon",
|
|
"dwm-1",
|
|
"dwm-2",
|
|
"dwm-3",
|
|
"umfd-0",
|
|
"umfd-1",
|
|
"umfd-2",
|
|
"umfd-3":
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
```
|
|
|
|
`NT AUTHORITY\SYSTEM` wird durch `normalizeUsername()` zu `system` und damit sauber ignoriert.
|
|
|
|
## Empfohlener SQL-Filter
|
|
|
|
```sql
|
|
AND target_user <> ''
|
|
AND target_user <> '-'
|
|
AND target_user NOT LIKE '%$'
|
|
AND logon_type IN ('2', '7', '10', '11')
|
|
AND LOWER(target_user) NOT IN (
|
|
'system',
|
|
'localsystem',
|
|
'local service',
|
|
'network service',
|
|
'anonymous logon'
|
|
)
|
|
```
|
|
|
|
## Relevante LogonTypes
|
|
|
|
| LogonType | Bedeutung | Bewertung |
|
|
|---:|---|---|
|
|
| `2` | Interactive | relevant |
|
|
| `7` | Unlock | meist relevant |
|
|
| `10` | RemoteInteractive/RDP | relevant |
|
|
| `11` | CachedInteractive | relevant |
|
|
| `3` | Network | oft Rauschen |
|
|
| `5` | Service | meist Rauschen |
|
|
|
|
## Score und Severity
|
|
|
|
Empfohlene Logik:
|
|
|
|
| Bedingung | Score | Severity |
|
|
|---|---:|---|
|
|
| `count < 5` | `2.0` | `medium` |
|
|
| `count >= 5` | `4.0` | `high` |
|
|
|
|
## Detection
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Rule | `ueba_offhours_login` |
|
|
| Channel | `Security` |
|
|
| EventID | `4624` |
|
|
|
|
## Beispiel-Summary
|
|
|
|
```text
|
|
UEBA: Login außerhalb der Arbeitszeit: Benutzer max.mustermann auf Host CLIENT01
|
|
```
|
|
|
|
## Typische legitime Ursachen
|
|
|
|
- Bereitschaftsdienst
|
|
- geplante Wartung
|
|
- Remote-Arbeit
|
|
- automatisierte Admin-Tätigkeit
|
|
- Zeitzonen-/Serverzeitproblem
|
|
|
|
## Typische verdächtige Ursachen
|
|
|
|
- kompromittierte Zugangsdaten
|
|
- RDP-Zugriff nach Feierabend
|
|
- laterale Bewegung
|
|
- Admin-Account außerhalb normaler Betriebszeit
|
|
|
|
---
|
|
|
|
# 18. Regel: `ueba_first_privileged_use`
|
|
|
|
## Zweck
|
|
|
|
Erkennt, wenn ein Benutzer erstmals privilegierte Rechte verwendet.
|
|
|
|
## Datenbasis
|
|
|
|
Tabellen:
|
|
|
|
- `event_logs`
|
|
- `user_privilege_baseline`
|
|
|
|
Windows Event:
|
|
|
|
| Channel | EventID |
|
|
|---|---:|
|
|
| `Security` | `4672` |
|
|
|
|
Event `4672` steht für „Special privileges assigned to new logon“.
|
|
|
|
## Logik
|
|
|
|
Für jedes `4672`-Event im Fenster wird geprüft, ob der Benutzer bereits in `user_privilege_baseline` existiert.
|
|
|
|
Wenn nicht:
|
|
|
|
1. Detection erzeugen
|
|
2. Benutzer in Baseline übernehmen
|
|
|
|
## Empfohlene Tabelle
|
|
|
|
```sql
|
|
CREATE TABLE IF NOT EXISTS user_privilege_baseline (
|
|
username VARCHAR(255) NOT NULL PRIMARY KEY,
|
|
first_seen DATETIME(6) NOT NULL DEFAULT UTC_TIMESTAMP(6),
|
|
last_seen DATETIME(6) NOT NULL DEFAULT UTC_TIMESTAMP(6),
|
|
seen_count BIGINT NOT NULL DEFAULT 1
|
|
);
|
|
```
|
|
|
|
## Detection
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Rule | `ueba_first_privileged_use` |
|
|
| Channel | `Security` |
|
|
| EventID | `4672` |
|
|
| Severity | `high` |
|
|
| Score | `6.0` |
|
|
|
|
## Beispiel-Summary
|
|
|
|
```text
|
|
UEBA: Benutzer adm.max nutzt erstmals privilegierte Rechte auf Host SERVER01
|
|
```
|
|
|
|
## Wichtiger Hinweis
|
|
|
|
Diese Regel ist nur sinnvoll, wenn die Baseline gepflegt wird. Sonst wird derselbe Benutzer immer wieder als „erstmals privilegiert“ erkannt.
|
|
|
|
---
|
|
|
|
# 19. Regel: `host_risk_score`
|
|
|
|
## Zweck
|
|
|
|
Aggregiert offene Detections pro Host zu einem Host-Risiko-Score.
|
|
|
|
## Datenbasis
|
|
|
|
Tabelle:
|
|
|
|
```text
|
|
detections
|
|
```
|
|
|
|
Ausgabe:
|
|
|
|
```text
|
|
host_risk_scores
|
|
```
|
|
|
|
## Zeitfenster
|
|
|
|
| Parameter | Default |
|
|
|---|---:|
|
|
| `RISK_SCORE_WINDOW` | `24h` |
|
|
|
|
## Ignorierte Detection-Status
|
|
|
|
Diese Status werden nicht in den Risk Score einbezogen:
|
|
|
|
```text
|
|
false_positive
|
|
suppressed
|
|
legitimate
|
|
resolved
|
|
plausible
|
|
```
|
|
|
|
## Severity-Gewichte
|
|
|
|
| Severity | Gewicht |
|
|
|---|---:|
|
|
| `critical` | `25` |
|
|
| `high` | `10` |
|
|
| `medium` | `2` |
|
|
| `low` | `0.3` |
|
|
| `info` | `0.05` |
|
|
| sonst | `0.2` |
|
|
|
|
## Status-Modifikatoren
|
|
|
|
| Status | Wirkung |
|
|
|---|---|
|
|
| `confirmed_incident` | `+75` zusätzlich pro Gruppe |
|
|
| `investigating` | Gewicht `* 2` |
|
|
| `acknowledged` | Gewicht `* 0.5` |
|
|
| `open` | Gewicht `* 0.35` |
|
|
|
|
## Dämpfung
|
|
|
|
Gleiche Events zählen nicht linear, sondern gedämpft:
|
|
|
|
```text
|
|
score += weight * sqrt(count)
|
|
```
|
|
|
|
Dadurch erzeugen 100 gleiche offene Events nicht 100-faches Risiko.
|
|
|
|
## Severity aus Risk Score
|
|
|
|
| Risk Score | Severity |
|
|
|---:|---|
|
|
| `>= 120` | `critical` |
|
|
| `>= 60` | `high` |
|
|
| `>= 20` | `medium` |
|
|
| `>= 5` | `low` |
|
|
| `< 5` | `info` |
|
|
|
|
## Ausgabe-Felder
|
|
|
|
| Feld | Bedeutung |
|
|
|---|---|
|
|
| `hostname` | Host |
|
|
| `risk_score` | berechneter Score |
|
|
| `severity` | abgeleitete Severity |
|
|
| `open_detections` | offene relevante Detections |
|
|
| `high_detections` | Anzahl High |
|
|
| `critical_detections` | Anzahl Critical |
|
|
| `confirmed_incidents` | bestätigte Incidents |
|
|
| `last_detection_at` | letzter relevanter Detection-Zeitpunkt |
|
|
|
|
---
|
|
|
|
# 20. Suppression-Mechanismen
|
|
|
|
## 20.1 Detection-Suppression
|
|
|
|
Tabelle:
|
|
|
|
```text
|
|
detection_suppressions
|
|
```
|
|
|
|
Die Funktion:
|
|
|
|
```go
|
|
isDetectionSuppressed(ctx, det)
|
|
```
|
|
|
|
prüft vor dem Insert, ob eine passende aktive Suppression existiert.
|
|
|
|
Match-Kriterien:
|
|
|
|
```text
|
|
rule_name
|
|
hostname oder leer
|
|
channel_name oder leer
|
|
event_id oder 0
|
|
expires_at IS NULL oder expires_at > now
|
|
enabled = 1
|
|
```
|
|
|
|
Wenn Suppression aktiv ist, wird keine Detection erzeugt.
|
|
|
|
## 20.2 Dynamic Rule Suppression
|
|
|
|
Dynamische Regeln prüfen zusätzlich `suppress_for_seconds`.
|
|
|
|
Dadurch wird verhindert, dass dieselbe dynamische Regel pro Host zu oft auslöst.
|
|
|
|
## 20.3 Baseline-Suppression
|
|
|
|
Baseline-Anomalien werden über `BASELINE_SUPPRESS_FOR` zeitlich gedämpft.
|
|
|
|
## 20.4 Baseline-Exclusion
|
|
|
|
Tabelle:
|
|
|
|
```text
|
|
baseline_exclusions
|
|
```
|
|
|
|
Diese Tabelle verhindert, dass bestimmte Events in die Baseline eingelernt werden.
|
|
|
|
Nützlich bei:
|
|
|
|
- bestätigten Incidents
|
|
- Wartungsfenstern
|
|
- bekannten Ausnahmesituationen
|
|
- Testläufen
|
|
- Rollouts
|
|
|
|
---
|
|
|
|
# 21. Detection-Status
|
|
|
|
Unterstützte Status:
|
|
|
|
| Status | Bedeutung |
|
|
|---|---|
|
|
| `open` | neu/offen |
|
|
| `acknowledged` | gesehen, noch nicht untersucht |
|
|
| `investigating` | in Untersuchung |
|
|
| `plausible` | plausibel, aber nicht unbedingt dauerhaft legitim |
|
|
| `legitimate` | legitim/erwartet |
|
|
| `false_positive` | Fehlalarm |
|
|
| `resolved` | erledigt |
|
|
| `suppressed` | bewusst unterdrückt |
|
|
| `confirmed_incident` | bestätigter Sicherheitsvorfall |
|
|
|
|
## Auswirkungen
|
|
|
|
| Status | Wirkung |
|
|
|---|---|
|
|
| `false_positive` | `is_false_positive = true`, aus Risk Score ausgeschlossen |
|
|
| `legitimate` | `is_legitimate = true`, aus Risk Score ausgeschlossen |
|
|
| `plausible` | aus Risk Score ausgeschlossen |
|
|
| `resolved` | aus Risk Score ausgeschlossen |
|
|
| `suppressed` | aus Risk Score ausgeschlossen |
|
|
| `confirmed_incident` | stark erhöhter Risk Score, Baseline-Lernen wird temporär verhindert |
|
|
|
|
---
|
|
|
|
# 22. Privileged Users
|
|
|
|
## Zweck
|
|
|
|
Die Tabelle `privileged_users` erweitert die automatische Erkennung privilegierter Benutzer.
|
|
|
|
## UI
|
|
|
|
Pfad:
|
|
|
|
```text
|
|
/ui/privileged-users
|
|
```
|
|
|
|
Funktionen:
|
|
|
|
- Benutzer hinzufügen
|
|
- Grund dokumentieren
|
|
- aktivieren/deaktivieren
|
|
|
|
## Automatische Erkennung
|
|
|
|
Auch ohne Tabelle gelten Benutzer als privilegiert, wenn sie folgendem Namensschema entsprechen:
|
|
|
|
```text
|
|
adm-*
|
|
*-adm
|
|
*.adm
|
|
```
|
|
|
|
## Maschinenkonten
|
|
|
|
Maschinenkonten werden ignoriert:
|
|
|
|
```text
|
|
*$
|
|
```
|
|
|
|
---
|
|
|
|
# 23. Empfohlene Dynamic Rules für Windows Security Monitoring
|
|
|
|
Diese Regeln lassen sich über `/ui/rules` pflegen.
|
|
|
|
## 23.1 Security Audit Log gelöscht
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `security_log_cleared` |
|
|
| Severity | `critical` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `1102` |
|
|
| Threshold | `1` |
|
|
| Suppress | `3600` |
|
|
|
|
## 23.2 Benutzer erstellt
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `user_created` |
|
|
| Severity | `high` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `4720` |
|
|
|
|
## 23.3 Benutzer aktiviert
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `user_enabled` |
|
|
| Severity | `medium` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `4722` |
|
|
|
|
## 23.4 Benutzer deaktiviert
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `user_disabled` |
|
|
| Severity | `medium` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `4725` |
|
|
|
|
## 23.5 Benutzer gelöscht
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `user_deleted` |
|
|
| Severity | `high` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `4726` |
|
|
|
|
## 23.6 Sicherheitsgruppe erstellt
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `security_group_created` |
|
|
| Severity | `medium` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `4727,4731` |
|
|
|
|
## 23.7 Mitglied zu Sicherheitsgruppe hinzugefügt
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `security_group_member_added` |
|
|
| Severity | `high` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `4728,4732,4756` |
|
|
|
|
## 23.8 Mitglied aus Sicherheitsgruppe entfernt
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `security_group_member_removed` |
|
|
| Severity | `medium` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `4729,4733,4757` |
|
|
|
|
## 23.9 Konto gesperrt
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `account_locked` |
|
|
| Severity | `medium` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `4740` |
|
|
|
|
## 23.10 Kerberos Pre-Auth fehlgeschlagen
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `kerberos_preauth_failed` |
|
|
| Severity | `low` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `4771` |
|
|
| Threshold Count | `10` |
|
|
| Threshold Window Seconds | `300` |
|
|
|
|
## 23.11 Service installiert
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `service_installed` |
|
|
| Severity | `high` |
|
|
| Channel | `System,Security` |
|
|
| Event IDs | `7045,4697` |
|
|
|
|
## 23.12 Scheduled Task erstellt
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `scheduled_task_created` |
|
|
| Severity | `medium` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `4698` |
|
|
|
|
## 23.13 Audit Policy geändert
|
|
|
|
| Feld | Wert |
|
|
|---|---|
|
|
| Name | `audit_policy_changed` |
|
|
| Severity | `high` |
|
|
| Channel | `Security` |
|
|
| Event IDs | `4719` |
|
|
|
|
---
|
|
|
|
# 24. Empfohlene Indizes
|
|
|
|
Für Performance sollten mindestens diese Indizes vorhanden sein.
|
|
|
|
```sql
|
|
CREATE INDEX idx_event_logs_ts ON event_logs (ts);
|
|
CREATE INDEX idx_event_logs_host_ts ON event_logs (hostname, ts);
|
|
CREATE INDEX idx_event_logs_channel_event_ts ON event_logs (channel_name, event_id, ts);
|
|
CREATE INDEX idx_event_logs_security_logon ON event_logs (channel_name, event_id, target_user, src_ip, ts);
|
|
CREATE INDEX idx_event_logs_host_channel_event_ts ON event_logs (hostname, channel_name, event_id, ts);
|
|
|
|
CREATE INDEX idx_detections_created ON detections (created_at);
|
|
CREATE INDEX idx_detections_rule_host_created ON detections (rule_name, hostname, created_at);
|
|
CREATE INDEX idx_detections_status_created ON detections (status, created_at);
|
|
CREATE INDEX idx_detections_host_status_created ON detections (hostname, status, created_at);
|
|
|
|
CREATE INDEX idx_agents_enabled_lastseen ON agents (is_enabled, last_seen);
|
|
|
|
CREATE INDEX idx_ueba_user_baseline_lookup
|
|
ON ueba_user_baseline (username, hostname, src_ip, workstation, first_seen, last_seen);
|
|
|
|
CREATE INDEX idx_baseline_event_stats_lookup
|
|
ON baseline_event_stats (hostname, channel_name, event_id, hour_of_day, day_of_week);
|
|
|
|
CREATE INDEX idx_detection_suppressions_lookup
|
|
ON detection_suppressions (enabled, rule_name, hostname, channel_name, event_id, expires_at);
|
|
|
|
CREATE INDEX idx_baseline_exclusions_lookup
|
|
ON baseline_exclusions (enabled, hostname, channel_name, event_id, expires_at);
|
|
```
|
|
|
|
---
|
|
|
|
# 25. Empfohlene SOC-Priorisierung
|
|
|
|
## Sofort prüfen
|
|
|
|
- `confirmed_incident`
|
|
- `critical`
|
|
- `success_after_failures`
|
|
- `password_spray`
|
|
- `security_log_cleared`
|
|
- `ueba_admin_new_host`
|
|
- `ueba_first_privileged_use`
|
|
|
|
## Hoch priorisieren
|
|
|
|
- `new_source_ip_for_user` bei privilegierten Benutzern
|
|
- `ueba_offhours_login` bei Admin-Konten
|
|
- `baseline_event_rate_anomaly` mit hohem Z-Score
|
|
- `service_installed` auf Clients oder Domain Controllern
|
|
- `scheduled_task_created` außerhalb Wartungsfenster
|
|
|
|
## Eher Rauschen / Kontextabhängig
|
|
|
|
- `agent_offline` bei normalen Clients
|
|
- `reboot_spike` während Patchfenster
|
|
- `new_event_id` direkt nach Audit-Policy-Änderungen
|
|
- `ueba_new_user_context` bei VPN-/DHCP-Änderungen
|
|
- `ueba_offhours_login` ohne LogonType-Filter
|
|
|
|
---
|
|
|
|
# 26. Bekannte Rauschquellen
|
|
|
|
## SYSTEM / technische Accounts
|
|
|
|
Besonders bei `4624` können technische Accounts sehr viele Events erzeugen.
|
|
|
|
Empfohlene Ausschlüsse:
|
|
|
|
```text
|
|
SYSTEM
|
|
NT AUTHORITY\SYSTEM
|
|
LOCAL SERVICE
|
|
NETWORK SERVICE
|
|
ANONYMOUS LOGON
|
|
DWM-*
|
|
UMFD-*
|
|
Maschinenkonten mit $
|
|
```
|
|
|
|
## LogonType
|
|
|
|
Für echte Benutzeranmeldungen sind meist relevant:
|
|
|
|
```text
|
|
2, 7, 10, 11
|
|
```
|
|
|
|
Oft rauschanfällig:
|
|
|
|
```text
|
|
3, 5
|
|
```
|
|
|
|
## Patchfenster
|
|
|
|
Während Patchfenstern können diese Regeln anschlagen:
|
|
|
|
- `reboot_spike`
|
|
- `new_event_id`
|
|
- `baseline_event_rate_anomaly`
|
|
- `agent_offline`
|
|
|
|
Empfehlung:
|
|
|
|
- Batch-Bewertung auf `plausible`
|
|
- temporäre Baseline-Exclusion
|
|
- temporäre Suppression für bekannte Regeln
|
|
|
|
---
|
|
|
|
# 27. Empfohlene Weiterentwicklung
|
|
|
|
## 27.1 Regelkonfiguration für Off-Hours
|
|
|
|
Aktuell ist die Arbeitszeit hart im Code:
|
|
|
|
```text
|
|
06:00 bis 20:00
|
|
```
|
|
|
|
Empfohlen wäre eine Konfiguration über ENV:
|
|
|
|
```text
|
|
OFFHOURS_ENABLED=true
|
|
WORK_HOUR_START=6
|
|
WORK_HOUR_END=20
|
|
OFFHOURS_LOGON_TYPES=2,7,10,11
|
|
```
|
|
|
|
## 27.2 Noise-Accounts in Tabelle auslagern
|
|
|
|
Statt hartem Code könnte eine Tabelle genutzt werden:
|
|
|
|
```sql
|
|
CREATE TABLE ignored_accounts (
|
|
username VARCHAR(255) NOT NULL PRIMARY KEY,
|
|
reason VARCHAR(255) NULL,
|
|
enabled BOOLEAN NOT NULL DEFAULT TRUE,
|
|
created_at DATETIME(6) NOT NULL DEFAULT UTC_TIMESTAMP(6),
|
|
updated_at DATETIME(6) NOT NULL DEFAULT UTC_TIMESTAMP(6) ON UPDATE UTC_TIMESTAMP(6)
|
|
);
|
|
```
|
|
|
|
## 27.3 Dynamic Rules um Negativfilter erweitern
|
|
|
|
Nützlich wären:
|
|
|
|
- `exclude_field`
|
|
- `exclude_operator`
|
|
- `exclude_value`
|
|
|
|
Beispiel:
|
|
|
|
```text
|
|
target_user NOT IN system,local service,network service
|
|
```
|
|
|
|
## 27.4 MITRE ATT&CK Mapping
|
|
|
|
Jede Detection könnte um MITRE-Technik erweitert werden:
|
|
|
|
| Regel | Mögliche Technik |
|
|
|---|---|
|
|
| `password_spray` | T1110.003 Password Spraying |
|
|
| `success_after_failures` | T1110 Brute Force |
|
|
| `service_installed` | T1543.003 Windows Service |
|
|
| `scheduled_task_created` | T1053.005 Scheduled Task |
|
|
| `security_log_cleared` | T1070.001 Clear Windows Event Logs |
|
|
| `ueba_admin_new_host` | T1078 Valid Accounts |
|
|
|
|
---
|
|
|
|
# 28. Kurze Betriebscheckliste
|
|
|
|
## Täglich
|
|
|
|
- SOC Dashboard prüfen
|
|
- Top Host Risk Scores prüfen
|
|
- offene `critical` und `high` Detections bewerten
|
|
- False Positives markieren
|
|
- legitime Wartungsereignisse als `plausible` oder `legitimate` markieren
|
|
|
|
## Wöchentlich
|
|
|
|
- häufige False Positives auswerten
|
|
- Suppressions prüfen
|
|
- Baseline-Exclusions prüfen
|
|
- Dynamic Rules nachschärfen
|
|
- neue EventIDs bewerten
|
|
|
|
## Monatlich
|
|
|
|
- Privileged Users prüfen
|
|
- UEBA-Baseline-Qualität prüfen
|
|
- Indizes und Query-Laufzeiten prüfen
|
|
- Prometheus/Grafana-Dashboards kontrollieren
|
|
- Retention-Konzept prüfen
|
|
|
|
---
|
|
|
|
# 29. Glossar
|
|
|
|
| Begriff | Bedeutung |
|
|
|---|---|
|
|
| Detection | Ein ausgelöster Regel-Treffer |
|
|
| Suppression | Unterdrückung bekannter oder akzeptierter Detections |
|
|
| Baseline | gelernter Normalzustand |
|
|
| UEBA | User and Entity Behavior Analytics |
|
|
| Z-Score | statistischer Abstand zum Mittelwert |
|
|
| Host Risk Score | aggregierter Risikowert pro Host |
|
|
| LogonType | Windows-Klassifikation der Anmeldung |
|
|
| `4624` | erfolgreicher Logon |
|
|
| `4625` | fehlgeschlagener Logon |
|
|
| `4672` | Special Privileges Assigned |
|
|
| `1102` | Security Audit Log gelöscht |
|
|
| `7045` | Service installiert |
|
|
|
|
---
|
|
|
|
# 30. Kurzfazit
|
|
|
|
Das Regelwerk kombiniert klassische EventID-Regeln, dynamische Regeln, Baseline-Anomalien und UEBA-Kontextregeln.
|
|
|
|
Die wichtigsten Qualitätshebel sind:
|
|
|
|
1. technische Accounts konsequent ausschließen,
|
|
2. LogonTypes sauber filtern,
|
|
3. Baselines nicht mit Incidents trainieren,
|
|
4. Status sauber pflegen,
|
|
5. legitime Wartungsfenster als `plausible` oder `legitimate` markieren,
|
|
6. echte Incidents als `confirmed_incident` markieren,
|
|
7. Dynamic Rules regelmäßig nachschärfen.
|
|
|
|
Besonders wichtig für die aktuelle `runOffHoursLoginRule`:
|
|
|
|
```text
|
|
SYSTEM, LOCAL SERVICE, NETWORK SERVICE, ANONYMOUS LOGON und Maschinenkonten sollten ignoriert werden.
|
|
Zusätzlich sollte die Regel auf LogonType 2, 7, 10 und 11 begrenzt werden.
|
|
```
|