Tilbake til bloggen
8 minKim Ytredal

KQL for sikkerhetsteam: Praktisk guide til trusseljakt

KQLSentinelTrusseljakt

Trusseljakt handler om å aktivt lete etter trusler som deteksjonsreglene ikke fanger. I Microsoft Sentinel er KQL (Kusto Query Language) verktøyet som gjør dette mulig. Mestrer du KQL, mestrer du Sentinel.

Hva er KQL?

KQL er spørrespråket for Azure Log Analytics og Microsoft Sentinel. Det ligner SQL, men er optimalisert for tidsseriedata og logganalyse. Syntaksen er intuitiv: du starter med en tabell, piper dataene gjennom operatorer, og filtrerer deg ned til det du leter etter.

Praktiske jaktspørringer

1. Mislykket pålogging etterfulgt av vellykket

Et klassisk mønster for brute force — mange mislykkede forsøk etterfulgt av suksess:

```kusto SigninLogs | where TimeGenerated > ago(24h) | summarize FailedCount = countif(ResultType != "0"), SuccessCount = countif(ResultType == "0"), FailedThenSuccess = iff( countif(ResultType != "0") > 5 and countif(ResultType == "0") > 0, true, false) by UserPrincipalName, IPAddress | where FailedThenSuccess == true | order by FailedCount desc ```

Denne spørringen finner brukere med mer enn 5 mislykkede pålogginger etterfulgt av minst én vellykket — fra samme IP.

2. Umulig reise

Pålogginger fra geografisk uforenlige steder innen kort tid:

```kusto SigninLogs | where ResultType == "0" | project TimeGenerated, UserPrincipalName, Location, IPAddress | sort by UserPrincipalName, TimeGenerated asc | extend PrevLocation = prev(Location), PrevTime = prev(TimeGenerated), PrevUser = prev(UserPrincipalName) | where UserPrincipalName == PrevUser | extend TimeDiffMinutes = datetime_diff('minute', TimeGenerated, PrevTime) | where TimeDiffMinutes < 60 and Location != PrevLocation and PrevLocation != "" and Location != "" ```

3. Privilegieeskalering

Brukere som plutselig får nye roller eller tillatelser:

```kusto AuditLogs | where TimeGenerated > ago(7d) | where OperationName has_any ( "Add member to role", "Add eligible member to role", "Add owner to application") | extend TargetUser = tostring(TargetResources[0].userPrincipalName) | extend AddedBy = tostring(InitiatedBy.user.userPrincipalName) | project TimeGenerated, OperationName, TargetUser, AddedBy ```

4. Lateral bevegelse via fjernskriving

Unormal bruk av fjernadministrasjonsverktøy:

```kusto SecurityEvent | where TimeGenerated > ago(24h) | where EventID == 4624 and LogonType == 3 | where AccountType == "User" | summarize TargetCount = dcount(Computer) by Account | where TargetCount > 5 | order by TargetCount desc ```

Brukere som logger på mer enn 5 forskjellige maskiner via nettverkspålogging er verdt å undersøke.

Tips for effektiv trusseljakt

  • Start med en hypotese — — "Jeg tror noen har kompromittert en servicekonto" er bedre enn å lete tilfeldig
  • Bruk tidsfiltre — — `ago(24h)`, `ago(7d)` holder spørringene raske
  • Kombiner tabeller — — `join` og `union` lar deg korrelere på tvers av loggkilder
  • Lagre jaktspørringer — — gode funn blir analytics rules i Sentinel
  • Bruk `let`-statements — — gjør komplekse spørringer lesbare

Fra jakt til deteksjon

Når en jaktspørring finner noe interessant, konverter den til en analytics rule:

  • Optimaliser spørringen for å kjøre automatisk (unngå for brede tidsvindu)
  • Definer entity mapping (bruker, IP, maskin) for hendelseskoblinger
  • Sett alvorlighetsnivå og respons-playbook
  • Deploy og overvåk false positive-raten

ForSec trener sikkerhetsteam i KQL og trusseljakt, og hjelper med å bygge jaktprogrammer som kontinuerlig styrker deteksjonskapabiliteten. Kontakt oss for et kurs tilpasset ditt team.

Trenger du hjelp med cybersikkerhet?

Vi hjelper norske virksomheter med å beskytte seg mot digitale trusler. Ta kontakt for en uforpliktende samtale.

Kontakt oss