Sdílet prostřednictvím


Migrace pravidel detekce splunku do Služby Microsoft Sentinel

Pravidla detekce splunku jsou komponenty pro správu událostí a informací o zabezpečení (SIEM), které se porovnávají s analytickými pravidly v Microsoft Sentinelu. Tento článek popisuje koncepty pro identifikaci, porovnání a migraci do Microsoft Sentinelu. Nejlepším způsobem je začít s prostředím migrace SIEM, které identifikuje předefinovaná analytická pravidla (OOTB), na která se mají automaticky překládat.

Pokud chcete migrovat nasazení Splunk Observability, přečtěte si další informace o tom, jak migrovat z Splunku do protokolů služby Azure Monitor.

Pravidla auditu

Microsoft Sentinel používá analýzy strojového učení k vytváření vysoce věrných a akčních incidentů. Některé z vašich existujících detekcí Splunku můžou být v Microsoft Sentinelu redundantní, takže je nemigrujte všechny slepě. Tyto aspekty si projděte při identifikaci existujících pravidel detekce.

  • Nezapomeňte vybrat případy použití, které odůvodňují migraci pravidel, a zvažte obchodní prioritu a efektivitu.
  • Zkontrolujte, že rozumíte typům pravidel Služby Microsoft Sentinel.
  • Zkontrolujte, že rozumíte terminologii pravidel.
  • Zkontrolujte zastaralá pravidla, která nemají upozornění za posledních 6 až 12 měsíců, a zjistěte, jestli jsou stále relevantní.
  • Odstraňte hrozby nebo výstrahy nízké úrovně, které pravidelně ignorujete.
  • Potvrďte připojené zdroje dat a zkontrolujte metody datového připojení. Microsoft Sentinel Analytics vyžaduje, aby se datový typ vyskytoval v pracovním prostoru služby Log Analytics před povolením pravidla. Znovu se můžete podívat na konverzace shromažďování dat, abyste zajistili hloubku a šířku dat napříč případy použití, které plánujete zjistit. Pak pomocí prostředí migrace SIEM ověřte, že se zdroje dat mapují odpovídajícím způsobem.

Migrovat pravidla

Po identifikaci detekcí splunku, které se mají migrovat, si projděte tyto aspekty procesu migrace:

  • Porovnejte stávající funkce analytických pravidel Microsoft Sentinelu OOTB s vašimi aktuálními případy použití. Pomocí prostředí migrace SIEM zjistíte, které detekce splunku se automaticky převedou na šablony OOTB.
  • Přeloží detekce, které nejsou v souladu s analytickými pravidly OOTB. Nejlepší způsob, jak přeložit detekce splunku automaticky, je s prostředím migrace SIEM.
  • Objevte další algoritmy pro vaše případy použití prozkoumáním komunitních prostředků, jako je SOC Prime Threat Detection Marketplace.
  • Ručně překládat detekce, pokud předdefinovaná pravidla nejsou k dispozici nebo nejsou automaticky přeložena. Vytvořte nové dotazy KQL a zkontrolujte mapování pravidel.

Další informace najdete v osvědčených postupech pro migraci pravidel detekce.

Kroky migrace pravidel

  1. Ověřte, že máte zaveden testovací systém pro každé pravidlo, které chcete migrovat.

    1. Připravte proces ověření pro migrovaná pravidla, včetně kompletních testovacích scénářů a skriptů.

    2. Ujistěte se, že váš tým má užitečné zdroje k otestování migrovaných pravidel.

    3. Ověřte, že máte připojené požadované zdroje dat, a zkontrolujte metody datového připojení.

  2. Ověřte, jestli jsou vaše detekce dostupné jako šablony OOTB v Microsoft Sentinelu:

    • Využijte prostředí migrace SIEM k automatizaci překladu a instalace šablon OOTB.

      Další informace najdete v tématu Použití prostředí migrace SIEM.

    • Pokud se případy použití neprojeví v detekcích, vytvořte pravidla pro vlastní pracovní prostor pomocí šablon pravidel OOTB.

      V Microsoft Sentinelu přejděte do centra obsahu.

      Filtrovat typ obsahu pro šablony pravidel Analytics

      Vyhledejte a nainstalujte/ aktualizujte každé odpovídající řešení centra obsahu nebo samostatnou šablonu analytického pravidla.

      Další informace najdete v tématu Detekce hrozeb, které jsou předdefinované.

    • Pokud máte detekce, na které se nevztahují pravidla OOTB microsoft Sentinelu, zkuste nejprve vyzkoušet prostředí migrace SIEM pro automatický překlad.

    • Pokud pravidla OOTB ani migrace SIEM zcela přeloží detekci, vytvořte pravidlo ručně. V takových případech vytvořte pravidlo pomocí následujícího postupu:

      1. Identifikujte zdroje dat, které chcete použít ve svém pravidle. Identifikujte tabulky Microsoft Sentinelu, které chcete dotazovat, vytvořením tabulky mapování mezi zdroji dat a tabulkami dat.

      2. Identifikujte všechny atributy, pole nebo entity ve vašich datech, které chcete použít ve svých pravidlech.

      3. Identifikujte kritéria a logiku pravidla. V této fázi zvažte vyhledání šablon pravidel jako ukázek pro vytvoření dotazů KQL.

        Zvažte filtry, pravidla korelace, aktivní seznamy, referenční sady, seznamy ke zhlédnutí, detekce anomálií, agregace atd. Můžete použít odkazy poskytované starší verzí SIEM, abyste pochopili , jak nejlépe namapovat syntaxi dotazu.

      4. Identifikujte podmínku triggeru a akci pravidla a pak vytvořte a zkontrolujte dotaz KQL. Při kontrole dotazu zvažte prostředky s pokyny k optimalizaci KQL.

  3. Otestujte pravidlo s jednotlivými relevantními případy použití. Pokud neposkytuje očekávané výsledky, zkontrolujte a upravte KQL a znovu ho otestujte.

  4. Až budete spokojeni, zvažte migraci pravidla. Podle potřeby vytvořte playbook pro akci pravidla. Další informace najdete v tématu Automatizace reakcí na hrozby pomocí playbooků v Microsoft Sentinelu.

Další informace o analytických pravidlech:

Porovnání terminologie pravidel

Tato tabulka vám pomůže objasnit koncept pravidla na základě dotazovací jazyk Kusto (KQL) v Microsoft Sentinelu ve srovnání s detekcí splunku na základě jazyka SPL (Search Processing Language).

Splunk Microsoft Sentinel
Typ pravidla •Naplánovaný
•Real-time
• Naplánovaný dotaz
•Fúze
• Zabezpečení Microsoftu
• Analýza chování strojového učení (ML)
Kritéria Definice v SPL Definice v KQL
Podmínka triggeru • Počet výsledků
• Počet hostitelů
• Počet zdrojů
•Zvyk
Prahová hodnota: Počet výsledků dotazu
Akce • Přidání do aktivovaných upozornění
• Událost protokolu
• Výsledky výstupu pro vyhledání
• A další
• Vytvoření upozornění nebo incidentu
• Integruje se s Logic Apps

Mapování a porovnání ukázek pravidel

Pomocí těchto ukázek můžete porovnat a mapovat pravidla z Splunku na Microsoft Sentinel v různých scénářích.

Běžné vyhledávací příkazy

Příkaz SPL Popis Operátor KQL Příklad KQL
chart/ timechart Vrátí výsledky v tabulkovém výstupu pro grafy časových řad. render – operátor … | render timechart
dedup Odebere následné výsledky, které odpovídají zadanému kritériu. jedinečné
shrnutí
… | summarize by Computer, EventID
eval Vypočítá výraz. Přečtěte si o běžných eval příkazech. rozšířit T | extend duration = endTime - startTime
fields Odebere pole z výsledků hledání. projekt
projektový pobyt
T | project cost=price*quantity, price
head/tail Vrátí první nebo poslední N výsledky. vrchol T | top 5 by Name desc nulls last
lookup Přidá hodnoty polí z externího zdroje. externaldata
vyhledávání
Příklad KQL
rename Přejmenuje pole. Pomocí zástupných znaků můžete zadat více polí. přejmenování projektu T | project-rename new_column_name = column_name
rex Určuje názvy skupin pomocí regulárních výrazů k extrakci polí. odpovídá regulárnímu výrazu … | where field matches regex "^addr.*"
search Filtruje výsledky na výsledky, které odpovídají hledanému výrazu. search search "X"
sort Seřadí výsledky hledání podle zadaných polí. sort T | sort by strlen(country) asc, price desc
stats Poskytuje statistiky, volitelně seskupené podle polí. Přečtěte si další informace o běžných příkazech statistik. shrnout Příklad KQL
mstats Podobně jako statistiky se používají u metrik místo událostí. shrnout Příklad KQL
table Určuje, která pole se mají uchovávat v sadě výsledků, a uchovává data v tabulkovém formátu. projekt T | project columnA, columnB
top/rare Zobrazí nejběžnější hodnoty pole. vrchol T | top 5 by Name desc nulls last
transaction Seskupí výsledky hledání do transakcí.

Příklad SPL
Příklad: row_window_session Příklad KQL
eventstats Vygeneruje souhrnné statistiky z polí ve vašich událostech a uloží tyto statistiky do nového pole.

Příklad SPL
Příklady:
spojení
make_list
mv-expand
Příklad KQL
streamstats Najděte kumulativní součet pole.

Příklad SPL:
... | streamstats sum(bytes) as bytes _ total \| timechart
row_cumsum ...\| serialize cs=row_cumsum(bytes)
anomalydetection Vyhledání anomálií v zadaném poli

Příklad SPL
series_decompose_anomalies() Příklad KQL
where Filtruje výsledky hledání pomocí eval výrazů. Používá se k porovnání dvou různých polí. kde T | where fruit=="apple"

lookup command: KQL example

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 command: KQL example

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

mstats command: KQL example

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

transaction command: SPL example

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

transaction command: KQL example

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

Slouží row_window_session() k výpočtu počátečních hodnot relace pro sloupec v serializované sadě řádků.

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

eventstats command: SPL example

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

eventstats command: KQL example

Tady je příklad s příkazem 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

Tady je příklad s příkazem 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 command: SPL example

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

anomalydetection command: KQL example

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)

Běžné eval příkazy

Příkaz SPL Popis Příklad SPL Příkaz KQL Příklad KQL
abs(X) Vrátí absolutní hodnotu X. abs(number) abs() abs(X)
case(X,"Y",…) Přebírá dvojice argumentů a Y argumentůX, kde X jsou argumenty logickými výrazy. Při vyhodnocení na TRUEvrátí argumenty odpovídající Y argument. Příklad SPL case Příklad KQL
ceil(X) Strop čísla X. ceil(1.9) ceiling() ceiling(1.9)
cidrmatch("X",Y) Identifikuje IP adresy, které patří do konkrétní podsí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,…) Vrátí první hodnotu, která nemá hodnotu null. coalesce(null(), "Returned val", null()) coalesce() coalesce(tolong("not a number"),
tolong("42"), 33) == 42
cos(X) Vypočítá kosinus X. n=cos(0) cos() cos(X)
exact(X) Vyhodnotí výraz X pomocí aritmetiky s plovoucí desetinnou čárkou s dvojitou přesností. exact(3.14*num) todecimal() todecimal(3.14*2)
exp(X) Vrátí eX. exp(3) exp() exp(3)
if(X,Y,Z) Pokud X se vyhodnotí jako TRUE, výsledek je druhý argument Y. Pokud X se vyhodnotí jako FALSE, výsledek se vyhodnotí jako třetí argument Z. if(error==200,
"OK", "Error")
iif() Příklad KQL
isbool(X) Vrátí TRUE , pokud X je logická hodnota. isbool(field) iif()
gettype
iif(gettype(X) =="bool","TRUE","FALSE")
isint(X) Vrátí TRUE , pokud X je celé číslo. isint(field) iif()
gettype
Příklad KQL
isnull(X) Vrátí TRUE hodnotu X null. isnull(field) isnull() isnull(field)
isstr(X) Vrátí TRUE , pokud X je řetězec. isstr(field) iif()
gettype
Příklad KQL
len(X) Tato funkce vrátí délku znaku řetězce X. len(field) strlen() strlen(field)
like(X,"y") Vrátí TRUE , pokud a pouze pokud X je jako vzor SQLite v Y. like(field, "addr%") has
contains
startswith
odpovídá regulárnímu výrazu
Příklad KQL
log(X,Y) Vrátí protokol prvního argumentu X pomocí druhého argumentu Y jako základu. Výchozí hodnota atributu Y je 10. log(number,2) log
log2
log10
log(X)

log2(X)

log10(X)
lower(X) Vrátí hodnotu malá písmena .X lower(username) tolower tolower(username)
ltrim(X,Y) Vrátí X znaky v parametru Y oříznuté z levé strany. Výchozí výstup Y je mezery a tabulátory. ltrim(" ZZZabcZZ ", " Z") trim_start() trim_start(“ ZZZabcZZ”,” ZZZ”)
match(X,Y) Vrátí, pokud X odpovídá vzoru regulárního výrazu Y. match(field, "^\d{1,3}.\d$") matches regex … | where field matches regex @"^\d{1,3}.\d$")
max(X,…) Vrátí maximální hodnotu ve sloupci. max(delay, mydelay) max()
arg_max()
… | summarize max(field)
md5(X) Vrátí hodnotu hash MD5 řetězcové hodnoty X. md5(field) hash_md5 hash_md5("X")
min(X,…) Vrátí minimální hodnotu ve sloupci. min(delay, mydelay) min_of()
min()
arg_min
Příklad KQL
mvcount(X) Vrátí číslo (celkem) X hodnot. mvcount(multifield) dcount …| summarize dcount(X) by Y
mvfilter(X) Filtruje pole s více hodnotami na základě logického X výrazu. mvfilter(match(email, "net$")) mv-apply Příklad KQL
mvindex(X,Y,Z) Vrátí podmnožinu argumentu s X více hodnotami z počáteční pozice (založené na nule) Y na Z (volitelné). mvindex( multifield, 2) array_slice array_slice(arr, 1, 2)
mvjoin(X,Y) Při použití vícehodnotového pole X a oddělovače Yřetězců a spojí jednotlivé hodnoty X použití Y. mvjoin(address, ";") strcat_array Příklad KQL
now() Vrátí aktuální čas reprezentovaný v unixovém čase. now() now() now()

now(-2d)
null() Nepřijímá argumenty a vrací .NULL null() null null
nullif(X,Y) Obsahuje dva argumenty a Yvrátí, X pokud jsou argumenty X odlišné. V opačném případě vrátí hodnotu NULL. nullif(fieldA, fieldB) iif iif(fieldA==fieldB, null, fieldA)
random() Vrátí pseudonáhodné číslo mezi 0 hodnotami 2147483647. random() rand() rand()
relative_ time(X,Y) Vzhledem k času epochy X a specifikátoru Yrelativního času vrátí hodnotu času epochy použitého Y na X. relative_time(now(),"-1d@d") unixový čas Příklad KQL
replace(X,Y,Z) Vrátí řetězec vytvořený nahrazením řetězce Z pro každý výskyt řetězce Y regulárního výrazu v řetězci X. Vrátí datum s přepnulými čísly měsíců a dnů.
Například pro 4/30/2015 vstup je 30/4/2009výstup:

replace(date, "^(\d{1,2})/ (\d{1,2})/", "\2/\1/")
replace() Příklad KQL
round(X,Y) Vrátí X zaokrouhlenou na počet desetinných míst určených Yhodnotou . Výchozí hodnota je zaokrouhlit na celé číslo. round(3.5) round round(3.5)
rtrim(X,Y) Vrátí X znaky Y oříznuté z pravé strany. Pokud Y není zadáno, mezery a tabulátory se oříznou. rtrim(" ZZZZabcZZ ", " Z") trim_end() trim_end(@"[ Z]+",A)
searchmatch(X) Vrátí TRUE , pokud událost odpovídá hledanému řetězci X. searchmatch("foo AND bar") iif() iif(field has "X","Yes","No")
split(X,"Y") Vrátí X jako pole s více hodnotami rozdělené oddělovačem Y. split(address, ";") split() split(address, ";")
sqrt(X) Vrátí druhou odmocninu .X sqrt(9) sqrt() sqrt(9)
strftime(X,Y) Vrátí hodnotu X epochového času vykreslenou pomocí formátu určeného parametrem Y. strftime(_time, "%H:%M") format_datetime() format_datetime(time,'HH:mm')
strptime(X,Y) Vzhledem k času reprezentovaného řetězcem Xvrátí hodnotu parsovanou z formátu Y. strptime(timeStr, "%H:%M") format_datetime() Příklad KQL
substr(X,Y,Z) Vrátí pole X podřetězdce od počáteční pozice (jedno) Y pro Z (volitelné) znaky. substr("string", 1, 3) substring() substring("string", 0, 3)
time() Vrátí hodinový čas s rozlišením mikrosekund. time() format_datetime() Příklad KQL
tonumber(X,Y) Převede vstupní řetězec X na číslo, kde Y (volitelná výchozí hodnota je 10) definuje základ čísla, na který se má převést. tonumber("0A4",16) toint() toint("123")
tostring(X,Y) Popis Příklad SPL tostring() tostring(123)
typeof(X) Vrátí řetězcovou reprezentaci typu pole. typeof(12) gettype() gettype(12)
urldecode(X) Vrátí dekódovanou adresu URL X . Příklad SPL url_decode Příklad KQL

case(X,"Y",…) Příklad SPL

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

case(X,"Y",…) Příklad KQL

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

if(X,Y,Z) Příklad KQL

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

isint(X) Příklad KQL

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

isstr(X) Příklad KQL

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

like(X,"y") příklad

… | where field has "addr"

… | where field contains "addr"

… | where field startswith "addr"

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

min(X,…) Příklad KQL

min_of (expr_1, expr_2 ...)

…|summarize min(expr)

…| summarize arg_min(Price,*) by Product

mvfilter(X) Příklad KQL

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

mvjoin(X,Y) Příklad KQL

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

relative time(X,Y) Příklad KQL

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

replace(X,Y,Z) Příklad KQL

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

strptime(X,Y) Příklad KQL

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

time() Příklad KQL

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

tostring(X,Y)

Vrátí hodnotu X pole jako řetězec.

  • Pokud je hodnota X čísla, X přeformátuje se na řetězcovou hodnotu.
  • Je-li X logická hodnota, X je přeformátována na TRUE nebo FALSE.
  • Pokud X je číslo, druhý argument Y je nepovinný a může být hex buď (převeden X na šestnáctkový), commas (formát X s čárkami a dvěma desetinnými místyX), nebo duration (převede z formátu času v sekundách na čitelný formát času: HH:MM:SS).
tostring(X,Y) Příklad SPL

Tento příklad vrátí:

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

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

urldecode(X) Příklad SPL

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

Příklad běžných stats příkazů KQL

Příkaz SPL Popis Příkaz KQL Příklad KQL
avg(X) Vrátí průměr hodnot pole X. avg() avg(X)
count(X) Vrátí počet výskytů pole X. Chcete-li označit konkrétní hodnotu pole, která se má shodovat, naformátovat X jako eval(field="value"). count() summarize count()
dc(X) Vrátí počet jedinečných hodnot pole X. dcount() …\| summarize countries=dcount(country) by continent
earliest(X) Vrátí chronologicky nejstarší zobrazenou hodnotu X. arg_min() … \| summarize arg_min(TimeGenerated, *) by X
latest(X) Vrátí chronologicky poslední zobrazenou Xhodnotu . arg_max() … \| summarize arg_max(TimeGenerated, *) by X
max(X) Vrátí maximální hodnotu pole X. Pokud jsou hodnoty X nečíselné, maximální hodnota se najde v abecedním pořadí. max() …\| summarize max(X)
median(X) Vrátí střední hodnotu pole X. percentil() …\| summarize percentile(X, 50)
min(X) Vrátí minimální hodnotu pole X. Pokud jsou hodnoty X nečíselné, minimální hodnota se najde v abecedním pořadí. min() …\| summarize min(X)
mode(X) Vrátí nejčastější hodnotu pole X. top-hitters() …\| top-hitters 1 of Y by X
perc(Y) Vrátí hodnotu percentilu X pole Y. Například perc5(total) vrátí pátou percentilovou hodnotu pole total. percentil() …\| summarize percentile(Y, 5)
range(X) Vrátí rozdíl mezi maximální a minimální hodnotou pole X. range() range(1, 3)
stdev(X) Vrátí směrodatnou odchylku výběru pole X. stdev stdev()
stdevp(X) Vrátí směrodatnou odchylku základního souboru pole X. stdevp() stdevp()
sum(X) Vrátí součet hodnot pole X. sum() sum(X)
sumsq(X) Vrátí součet čtverců hodnot pole X.
values(X) Vrátí seznam všech jedinečných hodnot pole X jako položku s více hodnotami. Pořadí hodnot je abecední. make_set() …\| summarize r = make_set(X)
var(X) Vrátí vzorek rozptylu pole X. odchylka variance(X)

Další kroky

V tomto článku jste zjistili, jak namapovat pravidla migrace z Splunku na Microsoft Sentinel.