Přeskočit obsah

Detekce anomálií aktivity uživatelů pomocí vektorových baseline Event Code na Windows hostech

Monitoring aktivity uživatelů na Windows endpointech se často zaměřuje na high-risk události, změny privilegií nebo konkrétní útočné techniky. Jedním z nejsilnějších early-warning signálů je ale něco mnohem jednoduššího: rozložení příchozích Windows Event Codes.

Místo sledování jednotlivých událostí izolovaně se pro každý host naučí behaviorální baseline analýzou, jak často se různé Event Codes objevují v jednohodinovém okně. Metoda seskupí události do vysokodimenzionálního vektoru (např. velikost 20 000), kde každá dimenze odpovídá konkrétnímu event code. Každá hodina vytvoří jeden takový vektor — „tvar“ normální aktivity pro host.

Klíčové pojmy

Než půjdeme do detailů, definujme základní termíny této detekční metody:

Event Code

Číselný identifikátor přiřazený každému typu Windows události. Například:

  • 4624 = Úspěšné přihlášení účtu
  • 4625 = Neúspěšné přihlášení účtu
  • 4688 = Byl vytvořen nový proces
  • 4720 = Byl vytvořen uživatelský účet

Každá Windows security událost má Event Code kategorizující typ aktivity.

Baseline

Naučený statistický profil „normálního“ chování. V tomto kontextu baseline zachycuje, jak se konkrétní host typicky chová v daném časovém období (např. pondělí v 10:00 ve všední den). Ukládá průměrné chování (mean) a typickou variaci (směrodatná odchylka) pro porovnání s aktuální aktivitou.

Learned baseline

Vektor

Matematická struktura s více hodnotami v uspořádaném seznamu. V této metodě:

  • Každá pozice (dimenze) vektoru reprezentuje konkrétní Event Code
  • Hodnota na každé pozici je počet výskytů daného Event Code v jednohodinovém okně
  • Příklad: Pokud pozice 4624 má hodnotu 150, Event Code 4624 nastal v té hodině 150×

Jde o otisk popisující hodinovou aktivitu napříč všemi možnými Event Codes.

Norma vektoru

Jedno číslo shrnující celkovou „velikost“ nebo „magnitudu“ vektoru. Matematicky je to euklidovská vzdálenost od počátku k bodu reprezentovanému vektorem. Pro naše účely:

  • Vysoká norma = v té hodině bylo hodně událostí
  • Nízká norma = málo událostí
  • Konkrétní vzor toho, které Event Codes přispěly k normě, dělá každou hodinu jedinečnou

Sigma (σ) / směrodatná odchylka

Statistická míra, jak moc se hodnoty typicky liší od průměru. V našem kontextu:

  • Nízká sigma = hodnoty jsou obvykle blízko průměru (konzistentní chování)
  • Vysoká sigma = hodnoty se silně liší od průměru (nekonzistentní chování)

„5 sigma“ znamená, že aktuální hodnota je 5 směrodatných odchylek od průměru — extrémně vzácné, pokud je chování normální.

Z-Score

Standardizovaná míra, jak neobvyklá je hodnota oproti baseline. Výpočet:

Z-Score = |Current Value - Average Value| / Standard Deviation
  • Z-Score 0 = naprosto normální (přesně na průměru)
  • Z-Score 1–2 = mírně neobvyklé, ale běžné
  • Z-Score 3 = vzácné (~0,3 % času u normálního rozdělení)
  • Z-Score 5 = extrémně vzácné (~0,00006 % času)

V této metodě se Z-Score a Sigma používají zaměnitelně — obojí popisuje, kolik směrodatných odchylek je aktuální chování od normálu.

Temporální třídy

Kategorie seskupující podobná časová období kvůli podobným vzorům chování:

  • Workdays: pondělí až pátek při běžné provozní aktivitě
  • Weekends: sobota a neděle s typicky nižší aktivitou
  • Holidays: zvláštní dny s unikátními vzory (minimální aktivita nebo maintenance okna)

Učením oddělených baseline pro každou třídu systém chápe, že nízká aktivita v neděli je normální, ale stejně nízká aktivita ve středu by byla podezřelá.

Agregace

Proces seskupení a shrnutí jednotlivých událostí. V této metodě:

  • Události se seskupí podle host.id (z kterého počítače přišly)
  • Uvnitř hosta se počítají podle event.code (typ události)
  • Počty se bucketují do jednohodinových oken

Agregace promění tisíce raw událostí v jeden vektor za hodinu na host.

Jednoduchý příklad

Konkrétními čísly:

Scénář: Host WORKSTATION-01 v pondělí v 10:00

Raw události (zjednodušeno):

Event Code 4624 occurred 120 times (successful logons)
Event Code 4688 occurred 45 times (process creations)
Event Code 5156 occurred 2,340 times (network connections)

Reprezentace vektorem:

[0, 0, 0, ..., 120, ..., 45, ..., 2340, ..., 0, 0]
 ^              ^         ^        ^
 Position 0    Pos 4624  Pos 4688 Pos 5156

Norma vektoru (zjednodušený výpočet): √(120² + 45² + 2340²) ≈ 2,343

Baseline (naučeno z předchozích pondělků v 10:00): - Průměrná norma vektoru: 2 200 - Směrodatná odchylka: 100

Výpočet aktuálního Z-Score:

Z-Score = |2,343 - 2,200| / 100 = 1.43

Výsledek: Z-Score 1,43 je normální (pod prahem 5), alert se nespustí. Mírná odchylka je v očekávaném chování pro tento host v tento čas.

Kdyby stejný host náhle ukázal 8 500 síťových spojení místo obvyklých 2 340, dramatický nárůst by posunul Z-Score nad 5 a spustil alert anomálie.

Učení normálního „tvaru vektoru“

Baseliner sbírá data několik dní napříč typickými behaviorálními třídami — workdays, weekends a holidays. Po zachycení dostatek vzorků (v našem případě čtyři platné vzorky na třídu) se systém naučí, jak vypadá normální hodinový vektor. Výstupem učící fáze je jediná skalární hodnota: norma vektoru. Ta funguje jako signatura hosta pro daný temporální kontext.

Převod odchylek na sigmu

Při příchodu nové aktivity systém znovu spočítá normu vektoru pro aktuální hodinu a porovná ji s historickým průměrem a směrodatnou odchylkou pro stejnou hodinu a třídu. Odchylka se vyjádří jako Z-score:

Z = |CURRENT_VALUE – MEAN_VALUE| / STDEV

Často se tomu říká sigma skóre. Vysoké sigma hodnoty znamenají, že aktuální vzor Event Codes je fundamentálně jiný, než host obvykle produkuje.

Například nárůst logon událostí, neobvyklá sekvence service-related kódů nebo náhlý pokles očekávaného provozního šumu mohou posunout normu vektoru natolik, že vznikne vysoké Z-score. Když sigma překročí nastavený práh — typicky 5 a více — systém to bere jako smysluplnou anomálii.

Od baseline k detekci

Tento přístup není sám o sobě určen jako vysoce přesný alerting mechanismus. Slouží jako behaviorální signál pro širší korelační pravidla. Pokud host ukáže prudkou odchylku ve vektoru event codes, událost „behavior-anomaly“ může napájet další detekční logiku a zvýraznit kompromitované stroje nebo abnormální akce uživatele.

Vektorové baseline místo pevných prahů nebo filtrů na jednotlivé události se přirozeně přizpůsobí hlučným enterprise prostředím. Zachytí jemné behaviorální posuny, které by jinak zůstaly neviditelné — a zůstane dostatečně lehký pro provoz ve velkém měřítku.

Příklad konfigurace

Úplný příklad konfigurace Event-Code Vector Baseline s vysvětlením jednotlivých sekcí.

---
define:
  name: Event Codes Per Host  #(1)
  description: Creates baseline for host and triggers an alert if number of events within a 1-hour window shows an anomaly from the learned baseline based on event codes  #(2)
  type: baseliner  #(3)
  risk_score: 30.0  #(4)

baseline:
  region: Czech Republic  #(5)
  period: day  #(6)
  learning: 4  #(7)
  classes: [workdays, weekends, holidays]  #(8)
  aggregation: vector  #(9)
  vector_size: 20000  #(10)
  weights:  #(11)
    "4624": 0.5  # Reduce weight of successful logons
    "4634": 0.5  # Reduce weight of logoffs
    "5156": 0.3  # Reduce weight of Windows Filtering Platform connections
    "4688": 2.0  # Increase weight of process creation events

# Event Codes baseline is meant for analysis and as input for correlations,
# not an entry to alert management
signal:
  default: false  #(12)

logsource:
  vendor:
    - microsoft  #(13)
  product:
    - windows  #(14)

predicate:
  !AND
  - !IN  #(15)
    what: event.code
    where: !EVENT
  - !IN  #(16)
    what: host.id
    where: !EVENT

evaluate:
  key: host.id  #(17)
  aggregate_by: event.code  #(18)
  timestamp: "@timestamp"  #(19)

analyze:
  test:
    !GT  #(20)
    - !ARG SIGMA  #(21)
    - 5  #(22)

trigger:
  - event:  #(23)
      host.id: !ITEM EVENT dimension

      # Event description
      event.action: "behavior-anomaly"  #(24)
      event.reason: "Activity from a host that deviates from the learned vector baseline."  #(25)
      event.kind: "alert"  #(26)
      event.type: "indicator"  #(27)
  1. Název: Popisný název baseline pravidla zobrazený v rozhraní LogMan.io.

  2. Popis: Vysvětluje, co baseline dělá — vytváří naučenou baseline na host a spouští alerty, když se vzor událostí výrazně odchýlí od normálního chování.

  3. Typ: baseliner označuje baseline detekční pravidlo místo korelace nebo jiného typu.

  4. Risk Score: Přiřadí risk score 30,0 anomáliím z tohoto pravidla. Skóre slouží k prioritizaci a korelaci s jinými detekcemi.

  5. Region: Časové pásmo / region pro temporální klasifikaci (např. „Czech Republic“ určuje místní čas pro workdays/weekends).

  6. Period: Temporální granularita výpočtu baseline. day znamená sledování hodinových vzorů napříč dny v týdnu.

  7. Learning: Počet platných vzorků na třídu, než je baseline „naučena“. S learning: 4 systém potřebuje 4 vzorky pro každou hodinu každé třídy (workday/weekend/holiday).

  8. Classes: Behaviorální kategorie s odlišnými normálními vzory. workdays, weekends a holidays umožní různé baseline pro různé typy dnů.

  9. Aggregation: vector pro vektorovou analýzu. Vytvoří vysokodimenzionální vektor, kde každá dimenze je frekvence event code.

  10. Vector Size: Maximální dimenzionalita vektoru (20 000). Musí být dost velká pro všechny očekávané Event Code hodnoty.

  11. Weights (volitelné): Slovník vlastních vah pro konkrétní Event Codes ve vektoru:

    • Snížení váhy velmi častých, nízkohodnotných událostí (např. 4624 logony, 5156 síťová spojení), které přidávají šum
    • Zvýšení váhy high-value událostí (např. 4688 process creation, 4672 special privileges), které silně indikují anomálie
    • Každý záznam mapuje Event Code (řetězec) na násobitel (float). Hodnoty pod 1,0 snižují důležitost, nad 1,0 zvyšují.
    • Neuvedené Event Codes mají výchozí váhu 1,0.
  12. Default Signal: false, protože baseline je pro analýzu a vstup do korelací, ne přímý alert. Zabrání automatickému signálu, ale anomálie lze použít v jiných pravidlech.

  13. Vendor: Filtruje události jen od vendor microsoft — analyzujeme Windows události.

  14. Product: Dále filtruje na produkt windows — Windows Event Logs.

  15. Predikát Event Code: !IN ověří existenci pole event.code v události.

  16. Predikát Host ID: Druhé !IN ověří existenci host.id — stavíme per-host baseline.

  17. Key: host.id jako klíč baseline. Oddělená baseline pro každý unikátní host.

  18. Aggregate By: Agregace podle event.code — dimenze vektoru.

  19. Timestamp: Pole pro temporální bucketing. @timestamp určuje jednohodinové okno.

  20. Greater Than Test: !GT porovná vypočtenou SIGMA s prahem.

  21. SIGMA Argument: !ARG SIGMA je Z-score (|ACTUAL_value - MEAN_value|) / STDEV.

  22. Threshold: Hodnota 5 — anomálie při SIGMA nad 5 směrodatnými odchylkami.

  23. Trigger Event: Při anomálii systém generuje novou událost s uvedenými poli.

  24. Event Action: Tag behavior-anomaly pro filtrování a korelaci.

  25. Event Reason: Lidsky čitelné vysvětlení pro analytiky.

  26. Event Kind: alert v ECS schématu.

  27. Event Type: indicator jako indikátor potenciální kompromitace nebo neobvyklé aktivity (ECS).

Jak to funguje v praxi

Když je baseline pravidlo aktivní:

  1. Učící fáze: Sběr dat pro každý host napříč temporálními třídami (workdays, weekends, holidays).

  2. Hodinové vektory: Pro každou hodinu a host vektor s dimenzemi = frekvence Event Code.

  3. Aplikace vah: Pokud jsou weights, každý počet Event Code se vynásobí váhou před výpočtem normy.

  4. Výpočet baseline: Po dostatek vzorků (4 na třídu) mean a směrodatná odchylka normy vektoru pro každou kombinaci hodina + třída.

  5. Průběžný monitoring: Nové události průběžně přepočítávají normu aktuální hodiny (s váhami) a porovnávají s baseline.

  6. Detekce anomálií: Při Z-score (SIGMA) nad 5 systém rozpozná anomálii a může spustit downstream akce.

  7. Vstup do korelací: Generované behavior-anomaly události konzumují jiná korelační pravidla pro behaviorální kontext.

Use cases

Vektorová baseline detekce je obzvlášť účinná pro:

  • Kompromitované účty: Neobvyklé vzory autentizace, změn privilegií nebo spouštění procesů. Váhami zdůrazněte vzácné privilege události (4672, 4648) a snižte šum z rutinních logonů.
  • Laterální pohyb: Náhlé změny síťových Event Codes na dříve tichém hostu. Zvyšte váhu process creation (4688) a explicit credential use (4648).
  • Malware aktivita: Abnormální vytváření služeb, změny registru nebo přístup k souborům. Zvyšte váhy u service událostí a scheduled task creation pro persistence.
  • Privilegované uživatele: Neobvyklé aktivity administrátorů mimo jejich vzory. Váhami zaměřte admin akce a filtrujte rutinu.
  • Detekce posunu baseline: Když host fundamentálně změní roli nebo konfiguraci. Vektorový přístup detekuje posun „behavior profilu“, i když jednotlivé události vypadají normálně.

Best practices

  1. Učící období: Nechte sběr dat alespoň 4 dny, aby všechny temporální třídy měly dost vzorků.

  2. Ladění prahu: Začněte se SIGMA prahem 5 a upravujte podle false positives. Vyšší prahy (6–7) snižují šum, ale mohou minout jemné anomálie.

  3. Ladění vah: Parametr weights pro citlivost:

  4. Snížit (0,1–0,5) u častých, nízkohodnotných událostí:
    • 4624: úspěšné logony
    • 4634: odhlášení
    • 5156: WFP allowed connections
    • 4663: přístup k objektům (často velmi hlučné)
  5. Zvýšit (1,5–3,0) u vzácných security událostí:
    • 4688: process creation
    • 4672: special privileges při novém logonu
    • 4720: vytvoření uživatelského účtu
    • 4732: člen přidán do security-enabled lokální skupiny
    • 4648: logon s explicitními credentials
  6. Začněte bez vah, analyzujte dominující Event Codes, pak upravte.

  7. Seskupení hostů: Oddělené baseline pro typy hostů (servery, workstations, DC) pomocí rolí nebo tagů v poli key.

  8. Vyloučení: Predikáty pro hlučné Event Codes nebo maintenance okna, která zkreslí baseline.

  9. Korelace: Kombinujte s jinými pravidly (failed logins, privilege escalation) pro vysokou jistotu.

Výhody oproti tradičním přístupům

  • Adaptivní: Automaticky se přizpůsobí normálu každého hosta bez ručního ladění prahů
  • Temporální awareness: Chápe, že normál v pondělí ráno ≠ sobota v noci
  • Multidimenzionální: Vzory napříč tisíci Event Codes současně
  • Laditelná citlivost: Volitelné weights pro konkrétní Event Codes bez ztráty automatického učení
  • Škálovatelné: Lehký výpočet pro velké flotily endpointů
  • Kontextové: Behaviorální kontext pro jiná pravidla místo binárního alertu

Další zdroje