Dela via


Migrera Splunk-identifieringsregler till Microsoft Sentinel

Splunk-identifieringsregler är siem-komponenter (säkerhetsinformation och händelsehantering) som jämförs med analysregler i Microsoft Sentinel. I den här artikeln beskrivs begreppen för att identifiera, jämföra och migrera dem till Microsoft Sentinel. Det bästa sättet är att börja med SIEM-migreringsupplevelsen, som identifierar OOTB-analysregler (out-of-the-box) som automatiskt översätts till.

Om du vill migrera din Splunk Observability-distribution kan du läsa mer om hur du migrerar från Splunk till Azure Monitor-loggar.

Granskningsregler

Microsoft Sentinel använder maskininlärningsanalys för att skapa incidenter med hög återgivning och åtgärder. Vissa av dina befintliga Splunk-identifieringar kan vara redundanta i Microsoft Sentinel, så migrera dem inte blint. Granska dessa överväganden när du identifierar dina befintliga identifieringsregler.

  • Se till att välja användningsfall som motiverar regelmigrering med hänsyn till affärsprioritet och effektivitet.
  • Kontrollera att du förstår Microsoft Sentinel-regeltyper.
  • Kontrollera att du förstår regelterminologin.
  • Granska inaktuella regler som inte har aviseringar under de senaste 6–12 månaderna och ta reda på om de fortfarande är relevanta.
  • Eliminera hot på låg nivå eller aviseringar som du rutinmässigt ignorerar.
  • Bekräfta anslutna datakällor och granska dina dataanslutningsmetoder. Microsoft Sentinel Analytics kräver att datatypen finns på Log Analytics-arbetsytan innan en regel aktiveras. Gå tillbaka till datainsamlingskonversationer för att säkerställa datadjup och bredd i de användningsfall som du planerar att identifiera. Använd sedan SIEM-migreringsmiljön för att säkerställa att datakällorna mappas korrekt.

Migrera regler

När du har identifierat de Splunk-identifieringar som ska migreras läser du dessa överväganden för migreringsprocessen:

  • Jämför de befintliga funktionerna i Microsoft Sentinels OOTB-analysregler med dina aktuella användningsfall. Använd SIEM-migreringsmiljön för att se vilka Splunk-identifieringar som automatiskt konverteras till OOTB-mallar.
  • Översätt identifieringar som inte överensstämmer med OOTB-analysregler. Det bästa sättet att översätta Splunk-identifieringar automatiskt är med SIEM-migreringen.
  • Upptäck fler algoritmer för dina användningsfall genom att utforska communityresurser som SOC Prime Threat Detection Marketplace.
  • Översätt identifieringar manuellt om inbyggda regler inte är tillgängliga eller inte översätts automatiskt. Skapa de nya KQL-frågorna och granska regelmappningen.

Mer information finns i metodtips för migrering av identifieringsregler.

Regelmigreringssteg

  1. Kontrollera att du har ett testsystem för varje regel som du vill migrera.

    1. Förbered en valideringsprocess för dina migrerade regler, inklusive fullständiga testscenarier och skript.

    2. Se till att ditt team har användbara resurser för att testa dina migrerade regler.

    3. Bekräfta att du har de datakällor som krävs anslutna och granska dina dataanslutningsmetoder.

  2. Kontrollera om dina identifieringar är tillgängliga som OOTB-mallar i Microsoft Sentinel:

    • Använd SIEM-migreringsmiljön för att automatisera översättning och installation av OOTB-mallarna.

      Mer information finns i Använda SIEM-migreringsmiljön.

    • Om du har användningsfall som inte återspeglas i identifieringarna skapar du regler för din egen arbetsyta med OOTB-regelmallar.

      I Microsoft Sentinel går du till innehållshubben.

      Filtrera innehållstyp för analysregelmallar .

      Hitta och installera/uppdatera varje motsvarande innehållshubblösning eller fristående analysregelmall.

      Mer information finns i Identifiera hot direkt.

    • Om du har identifieringar som inte omfattas av Microsoft Sentinels OOTB-regler kan du först prova SIEM-migreringsupplevelsen för automatisk översättning.

    • Om varken OOTB-reglerna eller SIEM-migreringen helt översätter identifieringen skapar du regeln manuellt. I sådana fall använder du följande steg för att skapa din regel:

      1. Identifiera de datakällor som du vill använda i regeln. Identifiera de Microsoft Sentinel-tabeller som du vill köra frågor mot genom att skapa en mappningstabell mellan datakällor och datatabeller.

      2. Identifiera attribut, fält eller entiteter i dina data som du vill använda i dina regler.

      3. Identifiera dina regelkriterier och logik. I det här skedet bör du överväga att hitta regelmallar som exempel för hur du skapar KQL-frågor.

        Överväg filter, korrelationsregler, aktiva listor, referensuppsättningar, bevakningslistor, identifieringsavvikelser, aggregeringar och så vidare. Du kan använda referenser från din äldre SIEM för att förstå hur du bäst mappar din frågesyntax.

      4. Identifiera utlösarvillkoret och regelåtgärden och konstruera och granska sedan din KQL-fråga. När du granskar din fråga bör du överväga KQL-optimeringsvägledningsresurser.

  3. Testa regeln med var och en av dina relevanta användningsfall. Om den inte ger förväntade resultat granskar och redigerar du KQL och testar den igen.

  4. När du är nöjd kan du överväga att migrera regeln. Skapa en spelbok för din regelåtgärd efter behov. Mer information finns i Automatisera hotsvar med spelböcker i Microsoft Sentinel.

Läs mer om analysregler:

Jämför regelterminologi

Den här tabellen hjälper dig att förtydliga begreppet regel baserat på Kusto-frågespråk (KQL) i Microsoft Sentinel jämfört med en Splunk-identifiering baserat på SPL (Search Processing Language).

Splunk Microsoft Sentinel
Regeltyp •Schemalagd
•Realtid
• Schemalagd fråga
•Fusion
• Microsoft Security
• Beteendeanalys för Maskininlärning (ML)
Villkor Definiera i SPL Definiera i KQL
Utlösarvillkor • Antal resultat
• Antal värdar
• Antal källor
•Sed
Tröskelvärde: Antal frågeresultat
Åtgärd • Lägg till i utlösta aviseringar
• Logghändelse
• Utdataresultat som ska slås upp
• Och mer
• Skapa avisering eller incident
• Integrerar med Logic Apps

Mappa och jämföra regelexempel

Använd dessa exempel för att jämföra och mappa regler från Splunk till Microsoft Sentinel i olika scenarier.

Vanliga sökkommandon

SPL-kommando beskrivning KQL-operator KQL-exempel
chart/ timechart Returnerar resultat i tabellutdata för tidsseriediagram. rendera operator … | render timechart
dedup Tar bort efterföljande resultat som matchar ett angivet kriterium. distinkt
sammanfatta
… | summarize by Computer, EventID
eval Beräknar ett uttryck. Läs mer om vanliga eval kommandon. förlänga T | extend duration = endTime - startTime
fields Tar bort fält från sökresultat. projekt
projekt bort
T | project cost=price*quantity, price
head/tail Returnerar det första eller sista N-resultatet. topp T | top 5 by Name desc nulls last
lookup Lägger till fältvärden från en extern källa. externaldata
uppslag
KQL-exempel
rename Byter namn på ett fält. Använd jokertecken för att ange flera fält. project-rename T | project-rename new_column_name = column_name
rex Anger gruppnamn med reguljära uttryck för att extrahera fält. matchar regex … | where field matches regex "^addr.*"
search Filtrerar resultat till resultat som matchar sökuttrycket. search search "X"
sort Sorterar sökresultaten efter de angivna fälten. sortera T | sort by strlen(country) asc, price desc
stats Tillhandahåller statistik, eventuellt grupperad efter fält. Läs mer om vanliga statistikkommandon. sammanfatta KQL-exempel
mstats Liknar statistik, som används för mått i stället för händelser. sammanfatta KQL-exempel
table Anger vilka fält som ska behållas i resultatuppsättningen och behåller data i tabellformat. projekt T | project columnA, columnB
top/rare Visar de mest eller minst vanliga värdena i ett fält. topp T | top 5 by Name desc nulls last
transaction Grupperar sökresultat i transaktioner.

SPL-exempel
Exempel: row_window_session KQL-exempel
eventstats Genererar sammanfattningsstatistik från fält i dina händelser och sparar den statistiken i ett nytt fält.

SPL-exempel
Exempel:
Anslut
make_list
mv-expand
KQL-exempel
streamstats Hitta den kumulativa summan av ett fält.

SPL-exempel:
... | streamstats sum(bytes) as bytes _ total \| timechart
row_cumsum ...\| serialize cs=row_cumsum(bytes)
anomalydetection Hitta avvikelser i det angivna fältet.

SPL-exempel
series_decompose_anomalies() KQL-exempel
where Filtrerar sökresultat med hjälp av eval uttryck. Används för att jämföra två olika fält. var T | where fruit=="apple"

lookup kommando: KQL-exempel

Users 
| where UserID in ((externaldata (UserID:string) [
@"https://storageaccount.blob.core.windows.net/storagecontainer/users.txt" 
h@"?...SAS..." // Secret token to access the blob 
])) | ... 

stats kommando: KQL-exempel

Sales 
| summarize NumTransactions=count(), 
Total=sum(UnitPrice * NumUnits) by Fruit, 
StartOfMonth=startofmonth(SellDateTime) 

mstats kommando: KQL-exempel

T | summarize count() by price_range=bin(price, 10.0) 

transaction kommando: SPL-exempel

sourcetype=MyLogTable type=Event
| transaction ActivityId startswith="Start" endswith="Stop"
| Rename timestamp as StartTime
| Table City, ActivityId, StartTime, Duration

transaction kommando: KQL-exempel

let Events = MyLogTable | where type=="Event";
Events
| where Name == "Start"
| project Name, City, ActivityId, StartTime=timestamp
| join (Events
| where Name == "Stop"
| project StopTime=timestamp, ActivityId)
on ActivityId
| project City, ActivityId, StartTime, 
Duration = StopTime – StartTime

Använd row_window_session() för att beräkna sessionsstartvärden för en kolumn i en serialiserad raduppsättning.

...| extend SessionStarted = row_window_session(
Timestamp, 1h, 5m, ID != prev(ID))

eventstats kommando: SPL-exempel

… | bin span=1m _time
|stats count AS count_i by _time, category
| eventstats sum(count_i) as count_total by _time

eventstats kommando: KQL-exempel

Här är ett exempel med -instruktionen join :

let binSize = 1h;
let detail = SecurityEvent 
| summarize detail_count = count() by EventID,
tbin = bin(TimeGenerated, binSize);
let summary = SecurityEvent
| summarize sum_count = count() by 
tbin = bin(TimeGenerated, binSize);
detail 
| join kind=leftouter (summary) on tbin 
| project-away tbin1

Här är ett exempel med -instruktionen make_list :

let binSize = 1m;
SecurityEvent
| where TimeGenerated >= ago(24h)
| summarize TotalEvents = count() by EventID, 
groupBin =bin(TimeGenerated, binSize)
|summarize make_list(EventID), make_list(TotalEvents), 
sum(TotalEvents) by groupBin
| mvexpand list_EventID, list_TotalEvents

anomalydetection kommando: SPL-exempel

sourcetype=nasdaq earliest=-10y
| anomalydetection Close _ Price

anomalydetection kommando: KQL-exempel

let LookBackPeriod= 7d;
let disableAccountLogon=SignIn
| where ResultType == "50057"
| where ResultDescription has "account is disabled";
disableAccountLogon
| make-series Trend=count() default=0 on TimeGenerated 
in range(startofday(ago(LookBackPeriod)), now(), 1d)
| extend (RSquare,Slope,Variance,RVariance,Interception,
LineFit)=series_fit_line(Trend)
| extend (anomalies,score) = 
series_decompose_anomalies(Trend)

Vanliga eval kommandon

SPL-kommando beskrivning SPL-exempel KQL-kommando KQL-exempel
abs(X) Returnerar det absoluta värdet för X. abs(number) abs() abs(X)
case(X,"Y",…) Tar par med X och Y argument, där argumenten X är booleska uttryck. När argumenten utvärderas till TRUEreturneras motsvarande Y argument. SPL-exempel case KQL-exempel
ceil(X) Tak för ett tal X. ceil(1.9) ceiling() ceiling(1.9)
cidrmatch("X",Y) Identifierar IP-adresser som tillhör ett visst undernät. cidrmatch
("123.132.32.0/25",ip)
ipv4_is_match()
ipv6_is_match()
ipv4_is_match('192.168.1.1', '192.168.1.255')
== false
coalesce(X,…) Returnerar det första värdet som inte är null. coalesce(null(), "Returned val", null()) coalesce() coalesce(tolong("not a number"),
tolong("42"), 33) == 42
cos(X) Beräknar cosininen för X. n=cos(0) cos() cos(X)
exact(X) Utvärderar ett uttryck X med hjälp av flyttalsaritmetik med dubbel precision. exact(3.14*num) todecimal() todecimal(3.14*2)
exp(X) Returnerar eX. exp(3) exp() exp(3)
if(X,Y,Z) Om X utvärderas till TRUEär resultatet det andra argumentet Y. Om X utvärderas till FALSEutvärderas resultatet till det tredje argumentet Z. if(error==200,
"OK", "Error")
iif() KQL-exempel
isbool(X) Returnerar TRUE om X är booleskt. isbool(field) iif()
gettype
iif(gettype(X) =="bool","TRUE","FALSE")
isint(X) Returnerar TRUE om X är ett heltal. isint(field) iif()
gettype
KQL-exempel
isnull(X) Returnerar TRUE om X är null. isnull(field) isnull() isnull(field)
isstr(X) Returnerar TRUE om X är en sträng. isstr(field) iif()
gettype
KQL-exempel
len(X) Den här funktionen returnerar teckenlängden för en sträng X. len(field) strlen() strlen(field)
like(X,"y") Returnerar TRUE om och endast om X är som SQLite-mönstret i Y. like(field, "addr%") has
contains
startswith
matchar regex
KQL-exempel
log(X,Y) Returnerar loggen för det första argumentet X med det andra argumentet Y som bas. Standardvärdet Y för är 10. log(number,2) log
log2
log10
log(X)

log2(X)

log10(X)
lower(X) Returnerar gemener för X. lower(username) tolower tolower(username)
ltrim(X,Y) Returnerar X med tecknen i parametern Y trimmad från vänster sida. Standardutdata för Y är blanksteg och flikar. ltrim(" ZZZabcZZ ", " Z") trim_start() trim_start(“ ZZZabcZZ”,” ZZZ”)
match(X,Y) Returnerar om X matchar regexmönstret Y. match(field, "^\d{1,3}.\d$") matches regex … | where field matches regex @"^\d{1,3}.\d$")
max(X,…) Returnerar det maximala värdet i en kolumn. max(delay, mydelay) max()
arg_max()
… | summarize max(field)
md5(X) Returnerar MD5-hashen för ett strängvärde X. md5(field) hash_md5 hash_md5("X")
min(X,…) Returnerar minimivärdet i en kolumn. min(delay, mydelay) min_of()
min()
arg_min
KQL-exempel
mvcount(X) Returnerar antalet (totalt) värden X . mvcount(multifield) dcount …| summarize dcount(X) by Y
mvfilter(X) Filtrerar ett flervärdesfält baserat på det booleska X uttrycket. mvfilter(match(email, "net$")) mv-apply KQL-exempel
mvindex(X,Y,Z) Returnerar en delmängd av argumentet med flera värden X från en startposition (nollbaserad) Y till Z (valfritt). mvindex( multifield, 2) array_slice array_slice(arr, 1, 2)
mvjoin(X,Y) Givet ett flervärdesfält X och en stränggränsare Y, och sammanfogar de enskilda värdena X för att använda Y. mvjoin(address, ";") strcat_array KQL-exempel
now() Returnerar den aktuella tiden, representerad i Unix-tid. now() now() now()

now(-2d)
null() Accepterar inte argument och returnerar NULL. null() NULL null
nullif(X,Y) Innehåller två argument, X och Y, och returnerar X om argumenten är olika. Annars returnerar NULL. nullif(fieldA, fieldB) iif iif(fieldA==fieldB, null, fieldA)
random() Returnerar ett pseudo-slumpmässigt tal mellan 0 till 2147483647. random() rand() rand()
relative_ time(X,Y) Givet en epoktids X - och relativ tidsspecificerare Yreturnerar epoktidsvärdet Y för tillämpat på X. relative_time(now(),"-1d@d") unix-tid KQL-exempel
replace(X,Y,Z) Returnerar en sträng som bildas genom att ersätta strängen Z för varje förekomst av reguljär uttryckssträng Y i strängen X. Returnerar datum med månads- och dagnummer växlade.
För indata är 30/4/2009till exempel 4/30/2015 utdata :

replace(date, "^(\d{1,2})/ (\d{1,2})/", "\2/\1/")
replace() KQL-exempel
round(X,Y) Returnerar X avrundat till antalet decimaler som anges av Y. Standardvärdet är att avrunda till ett heltal. round(3.5) round round(3.5)
rtrim(X,Y) Returnerar X med tecknen Y i trimmade från höger sida. Om Y inte anges trimmas blanksteg och flikar. rtrim(" ZZZZabcZZ ", " Z") trim_end() trim_end(@"[ Z]+",A)
searchmatch(X) Returnerar TRUE om händelsen matchar söksträngen X. searchmatch("foo AND bar") iif() iif(field has "X","Yes","No")
split(X,"Y") Returnerar X som ett flervärdesfält, delat med avgränsare Y. split(address, ";") split() split(address, ";")
sqrt(X) Returnerar kvadratroten för X. sqrt(9) sqrt() sqrt(9)
strftime(X,Y) Returnerar epoktidsvärdet X som återges med formatet som anges av Y. strftime(_time, "%H:%M") format_datetime() format_datetime(time,'HH:mm')
strptime(X,Y) Givet en tid som representeras av en sträng Xreturnerar värdet parsat från formatet Y. strptime(timeStr, "%H:%M") format_datetime() KQL-exempel
substr(X,Y,Z) Returnerar ett delsträngsfält X från startpositionen (enbaserad) Y för Z (valfria) tecken. substr("string", 1, 3) substring() substring("string", 0, 3)
time() Returnerar wall-clock-tiden med mikrosekundersupplösning. time() format_datetime() KQL-exempel
tonumber(X,Y) Konverterar indatasträngen X till ett tal, där Y (valfritt, standardvärde är 10) definierar basen för talet som ska konverteras till. tonumber("0A4",16) toint() toint("123")
tostring(X,Y) Beskrivning SPL-exempel tostring() tostring(123)
typeof(X) Returnerar en strängrepresentation av fälttypen. typeof(12) gettype() gettype(12)
urldecode(X) Returnerar url-avkodad X . SPL-exempel url_decode KQL-exempel

case(X,"Y",…) SPL-exempel

case(error == 404, "Not found",
error == 500,"Internal Server Error",
error == 200, "OK")

case(X,"Y",…) KQL-exempel

T
| extend Message = case(error == 404, "Not found", 
error == 500,"Internal Server Error", "OK") 

if(X,Y,Z) KQL-exempel

iif(floor(Timestamp, 1d)==floor(now(), 1d), 
"today", "anotherday")

isint(X) KQL-exempel

iif(gettype(X) =="long","TRUE","FALSE")

isstr(X) KQL-exempel

iif(gettype(X) =="string","TRUE","FALSE")

like(X,"y") exempel

… | where field has "addr"

… | where field contains "addr"

… | where field startswith "addr"

… | where field matches regex "^addr.*"

min(X,…) KQL-exempel

min_of (expr_1, expr_2 ...)

…|summarize min(expr)

…| summarize arg_min(Price,*) by Product

mvfilter(X) KQL-exempel

T | mv-apply Metric to typeof(real) on 
(
 top 2 by Metric desc
)

mvjoin(X,Y) KQL-exempel

strcat_array(dynamic([1, 2, 3]), "->")

relative time(X,Y) KQL-exempel

let toUnixTime = (dt:datetime)
{
(dt - datetime(1970-01-01))/1s 
};

replace(X,Y,Z) KQL-exempel

replace( @'^(\d{1,2})/(\d{1,2})/', @'\2/\1/',date)

strptime(X,Y) KQL-exempel

format_datetime(datetime('2017-08-16 11:25:10'),
'HH:mm')

time() KQL-exempel

format_datetime(datetime(2015-12-14 02:03:04),
'h:m:s')

tostring(X,Y)

Returnerar ett fältvärde för X som en sträng.

  • Om värdet X för är ett tal X formateras om till ett strängvärde.
  • Om X är ett booleskt värde formateras X om till TRUE eller FALSE.
  • Om X är ett tal är det andra argumentet Y valfritt och kan antingen vara hex (konverterar X till ett hexadecimalt), commas (format med kommatecken och två decimaler) eller duration (konverterar från ett tidsformat X i sekunder till ett läsbart tidsformatX: HH:MM:SS).
tostring(X,Y) SPL-exempel

Det här exemplet returnerar:

foo=615 and foo2=00:10:15:

… | eval foo=615 | eval foo2 = tostring(
foo, "duration")

urldecode(X) SPL-exempel

urldecode("http%3A%2F%2Fwww.splunk.com%2Fdownload%3Fr%3Dheader")

KQL-exempel för vanliga stats kommandon

SPL-kommando beskrivning KQL-kommando KQL-exempel
avg(X) Returnerar medelvärdet av värdena för fältet X. avg() avg(X)
count(X) Returnerar antalet förekomster av fältet X. Om du vill ange ett specifikt fältvärde som ska matcha formateras X som eval(field="value"). count() summarize count()
dc(X) Returnerar antalet distinkta värden i fältet X. dcount() …\| summarize countries=dcount(country) by continent
earliest(X) Returnerar det kronologiskt tidigaste värdet för X. arg_min() … \| summarize arg_min(TimeGenerated, *) by X
latest(X) Returnerar det kronologiskt senast sedda värdet för X. arg_max() … \| summarize arg_max(TimeGenerated, *) by X
max(X) Returnerar det maximala värdet för fältet X. Om värdena X för är icke-numeriska hittas det maximala värdet via alfabetisk ordning. max() …\| summarize max(X)
median(X) Returnerar det mittersta värdet för fältet X. percentile() …\| summarize percentile(X, 50)
min(X) Returnerar det lägsta värdet för fältet X. Om värdena X för är icke-numeriska, hittas det minsta värdet via alfabetisk ordning. min() …\| summarize min(X)
mode(X) Returnerar det vanligaste värdet för fältet X. top-hitters() …\| top-hitters 1 of Y by X
perc(Y) Returnerar percentilvärdet X för fältet Y. Returnerar till exempel perc5(total) det femte percentilvärdet för ett fält total. percentile() …\| summarize percentile(Y, 5)
range(X) Returnerar skillnaden mellan fältets högsta och lägsta värden X. range() range(1, 3)
stdev(X) Returnerar standardavvikelsen för fältet X. stdev stdev()
stdevp(X) Returnerar populationens standardavvikelse för fältet X. stdevp() stdevp()
sum(X) Returnerar summan av värdena i fältet X. sum() sum(X)
sumsq(X) Returnerar summan av kvadraterna för värdena i fältet X.
values(X) Returnerar listan över alla distinkta värden i fältet X som en post med flera värden. Värdenas ordning är alfabetisk. make_set() …\| summarize r = make_set(X)
var(X) Returnerar exempelavvikelsen för fältet X. varians variance(X)

Nästa steg

I den här artikeln har du lärt dig hur du mappar dina migreringsregler från Splunk till Microsoft Sentinel.