Vytvoření analyzátoru ASIM
Uživatelé advanced Security Information Model (ASIM) používají sjednocení analyzátorů místo názvů tabulek v dotazech k zobrazení dat v normalizovaném formátu a zahrnutí všech dat relevantních pro schéma v dotazu. Sjednocení analyzátorů zase používá analyzátory specifické pro zdroj ke zpracování konkrétních podrobností jednotlivých zdrojů.
Microsoft Sentinel poskytuje integrované analyzátory specifické pro zdroj pro mnoho zdrojů dat. Tyto analyzátory specifické pro zdroj můžete chtít upravit nebo vyvíjet v následujících situacích:
Když vaše zařízení poskytuje události, které odpovídají schématu ASIM, ale analyzátor specifický pro zdroj pro vaše zařízení a příslušné schéma není v Microsoft Sentinelu dostupné.
Pokud jsou pro vaše zařízení k dispozici analyzátory specifické pro zdroje ASIM, ale zařízení odesílá události v metodě nebo v jiném formátu, než se očekávalo analyzátory ASIM. Příklad:
Zdrojové zařízení může být nakonfigurované tak, aby odesílala události nestandardním způsobem.
Vaše zařízení může mít jinou verzi, než která je podporovaná analyzátorem ASIM.
Události se můžou shromažďovat, upravovat a předávat zprostředkujícím systémem.
Vývoj vlastního analyzátoru
Následující pracovní postup popisuje základní kroky při vývoji vlastního analyzátoru ASM specifického pro zdroj:
Shromážděte ukázkové protokoly.
Identifikujte schémata nebo schémata, která události odeslané ze zdroje představují.
Namapujte pole zdrojových událostí na identifikované schéma nebo schémata.
Vyvíjejte jeden nebo více analyzátorů ASIM pro váš zdroj. Budete muset vytvořit analyzátor filtrování a analyzátor bez parametrů pro každé schéma, které je relevantní pro zdroj.
Otestujte analyzátor.
Nasaďte analyzátory do pracovních prostorů Microsoft Sentinelu.
Aktualizujte příslušný analyzátor ASIM tak, aby odkazovat na nový vlastní analyzátor.
Možná budete chtít také přispívat analyzátory do primární distribuce ASIM. Analyzátory, které přispěly, mohou být také zpřístupněny ve všech pracovních prostorech jako integrované analyzátory.
Shromažďování ukázkových protokolů
K vytváření efektivních analyzátorů ASIM potřebujete reprezentativní sadu protokolů, což ve většině případů bude vyžadovat nastavení zdrojového systému a jeho připojení k Microsoft Sentinelu. Pokud nemáte dostupné zdrojové zařízení, cloudové služby s průběžným platbou vám umožní nasadit mnoho zařízení pro vývoj a testování.
Kromě toho může vyhledání dokumentace a ukázek dodavatele pro protokoly pomoct zrychlit vývoj a snížit chyby tím, že zajistí pokrytí širokého formátu protokolu.
Reprezentativní sada protokolů by měla zahrnovat:
- Události s různými výsledky událostí
- Události s různými akcemi odezvy.
- Různé formáty pro uživatelské jméno, název hostitele a ID a další pole, která vyžadují normalizaci hodnot.
mapování.
Před vývojem analyzátoru namapujte informace dostupné ve zdrojové události nebo události na schéma, které jste identifikovali:
- Namapovat všechna povinná pole a nejlépe také doporučená pole.
- Pokuste se namapovat všechny informace dostupné ze zdroje na normalizovaná pole. Pokud není k dispozici jako součást vybraného schématu, zvažte mapování polí dostupných v jiných schématech.
- Mapuje hodnoty polí ve zdroji na normalizované hodnoty povolené ASIM. Původní hodnota je uložena v samostatném poli, například EventOriginalResultDetails.
Vývoj analyzátorů
Vyvíjejte filtr i analyzátor bez parametrů pro každé relevantní schéma.
Vlastní analyzátor je dotaz KQL vyvinutý na stránce Protokoly Microsoft Sentinelu. Dotaz analyzátoru má tři části:
Pole Příprava analýzy > filtru >
Filtrování relevantních záznamů
V mnoha případech tabulka v Microsoft Sentinelu obsahuje více typů událostí. Příklad:
- Tabulka Syslog obsahuje data z více zdrojů.
- Vlastní tabulky můžou obsahovat informace z jednoho zdroje, který poskytuje více než jeden typ události a může vyhovovat různým schématům.
Analyzátor by proto měl nejprve filtrovat pouze záznamy relevantní pro cílové schéma.
Filtrování v KQL se provádí pomocí operátoru where . Například Sysmon událost 1 hlásí vytvoření procesu, a proto je normalizována do schématu ProcessEvent . Událost Sysmon 1 je součástí tabulky Událost , takže byste použili následující filtr:
Event | where Source == "Microsoft-Windows-Sysmon" and EventID == 1
Důležité
Analyzátor by neměl filtrovat podle času. Dotaz, který používá analyzátor, použije časový rozsah.
Filtrování podle typu zdroje pomocí seznamu ke zhlédnutí
V některých případech samotná událost neobsahuje informace, které by umožňovaly filtrování pro konkrétní typy zdrojů.
Například události DNS infobloxu se odesílají jako zprávy Syslog a obtížně se odlišují od zpráv Syslog odesílaných z jiných zdrojů. V takových případech analyzátor spoléhá na seznam zdrojů, které definují relevantní události. Tento seznam je zachován v seznamu ke zhlédnutí ASimSourceType.
Použití seznamu ke zhlédnutí ASimSourceType v analyzátorech:
- Na začátek analyzátoru uveďte následující řádek:
let Sources_by_SourceType=(sourcetype:string){_GetWatchlist('ASimSourceType') | where SearchKey == tostring(sourcetype) | extend Source=column_ifexists('Source','') | where isnotempty(Source)| distinct Source };
- Přidejte filtr, který používá seznam ke zhlédnutí v oddílu filtrování analyzátoru. Analyzátor DNS Infoblox například obsahuje následující informace v části filtrování:
| where Computer in (Sources_by_SourceType('InfobloxNIOS'))
Pokud chcete použít tuto ukázku v analyzátoru:
Nahraďte počítač názvem pole, které obsahuje informace o zdroji vašeho zdroje. Můžete ho ponechat jako počítač pro všechny analyzátory založené na syslogu.
Nahraďte token InfobloxNIOS hodnotou podle vašeho výběru analyzátoru. Informujte uživatele analyzátoru, že musí aktualizovat seznam ke zhlédnutí ASimSourceType pomocí vybrané hodnoty a seznam zdrojů, které odesílají události tohoto typu.
Filtrování na základě parametrů analyzátoru
Při vývoji analyzátorů filtrování se ujistěte, že analyzátor přijímá parametry filtrování pro příslušné schéma, jak je uvedeno v referenčním článku pro toto schéma. Použití existujícího analyzátoru jako výchozího bodu zajistí, že analyzátor obsahuje správný podpis funkce. Ve většině případů je skutečný kód filtrování podobný také pro filtrování analyzátorů pro stejné schéma.
Při filtrování se ujistěte, že:
- Před parsováním pomocí fyzických polí můžete filtrovat. Pokud filtrované výsledky nejsou dostatečně přesné, opakujte test po parsování a vylaďte výsledky. Další informace najdete v tématu Optimalizace filtrování.
- Nefiltrujte, pokud parametr není definován a stále má výchozí hodnotu.
Následující příklady ukazují, jak implementovat filtrování pro parametr řetězce, kde výchozí hodnota je obvykle *, a pro parametr seznamu, kde výchozí hodnota je obvykle prázdný seznam.
srcipaddr=='*' or ClientIP==srcipaddr
array_length(domain_has_any) == 0 or Name has_any (domain_has_any)
Optimalizace filtrování
Abyste zajistili výkon analyzátoru, poznamenejte si následující doporučení filtrování:
- Vždy filtrujte předdefinovaná pole a ne parsovaná pole. I když je někdy snazší filtrovat pomocí analyzovaných polí, výrazně ovlivňuje výkon.
- Použijte operátory, které poskytují optimalizovaný výkon. Konkrétně ==, má a začíná. Použití operátorů, jako jsou například obsahuje nebo odpovídá regulárnímu výrazu, také výrazně ovlivňuje výkon.
Doporučení pro filtrování výkonu nemusí být vždy snadná. Například použití funkce has je méně přesné než obsahuje. V jiných případech je porovnání předdefinovaného pole, například SyslogMessage, méně přesné než porovnání extrahovaného pole, například DvcAction. Vtakovýchch materiálech doporučujeme v takových případech ještě předfiltrovat a opakovat filtr s použitím přesnějších podmínek po parsování.
Příklad najdete v následujícím fragmentu kódu analyzátoru DNS infobloxu. Analyzátor nejprve zkontroluje, jestli pole SyslogMessage obsahuje klienta slova. Termín se ale může použít na jiném místě ve zprávě, takže po parsování pole Log_Type analyzátor znovu zkontroluje, že slovo klient byl skutečně hodnotou pole.
Syslog | where ProcessName == "named" and SyslogMessage has "client"
…
| extend Log_Type = tostring(Parser[1]),
| where Log_Type == "client"
Analýza
Jakmile dotaz vybere relevantní záznamy, může je potřeba je analyzovat. Analýza se obvykle vyžaduje, pokud je v jednom textovém poli vyjádřeno více polí událostí.
Níže jsou uvedeny operátory KQL, které provádějí analýzu, seřazené podle optimalizace výkonu. První poskytuje nejoptimaličtější výkon, zatímco poslední poskytuje nejméně optimalizovaný výkon.
Operátor | Popis |
---|---|
split | Parsování řetězce hodnot s oddělovači |
parse_csv | Parsujte řetězec hodnot formátovaných jako řádek CSV (hodnoty oddělené čárkami). |
Analyzovat | Parsujte více hodnot z libovolného řetězce pomocí vzoru, který může být zjednodušeným vzorem s lepším výkonem nebo regulárním výrazem. |
extract_all | Parsuje jednotlivé hodnoty z libovolného řetězce pomocí regulárního výrazu. extract_all má podobný výkon k analýze, pokud druhý výraz používá regulární výraz. |
Extrahovat | Extrahujte jednu hodnotu z libovolného řetězce pomocí regulárního výrazu. Použití extrakce poskytuje lepší výkon než analýza nebo extract_all v případě potřeby jedné hodnoty. Použití více aktivací extrakce přes stejný zdrojový řetězec je však méně efektivní než jedna analýza nebo extract_all a mělo by se jim vyhnout. |
parse_json | Parsujte hodnoty v řetězci formátovaného jako JSON. Pokud z JSON potřebujete jenom několik hodnot, můžete pomocí analýzy, extrakce nebo extract_all dosáhnout lepšího výkonu. |
parse_xml | Parsujte hodnoty v řetězci formátovaného jako XML. Pokud z XML potřebujete jenom několik hodnot, můžete použít parsování, extrakci nebo extract_all dosáhnout lepšího výkonu. |
Kromě analýzy řetězce může fáze analýzy vyžadovat další zpracování původních hodnot, včetně:
Formátování a převod typů Po extrahování může být zdrojové pole potřeba naformátovat tak, aby odpovídalo cílovému poli schématu. Můžete například převést řetězec představující datum a čas na pole datetime. V těchto případech jsou užitečné funkce jako todatetime a tohex.
Vyhledávání hodnot Po extrahování může být potřeba namapovat hodnotu zdrojového pole na sadu hodnot zadaných pro pole cílového schématu. Například některé zdroje hlásí číselné kódy odpovědí DNS, zatímco schéma vyžaduje častější kódy textové odpovědi. Funkce iff a case můžou být užitečné k mapování několika hodnot.
Analyzátor Microsoft DNS například přiřadí pole EventResult na základě ID události a kódu odpovědi pomocí příkazu iff následujícím způsobem:
extend EventResult = iff(EventId==257 and ResponseCode==0 ,'Success','Failure')
Pro několik hodnot použijte datatable a vyhledávání, jak je znázorněno ve stejném analyzátoru DNS:
let RCodeTable = datatable(ResponseCode:int,ResponseCodeName:string) [ 0, 'NOERROR', 1, 'FORMERR'....]; ... | lookup RCodeTable on ResponseCode | extend EventResultDetails = case ( isnotempty(ResponseCodeName), ResponseCodeName, ResponseCode between (3841 .. 4095), 'Reserved for Private Use', 'Unassigned')
Mapování hodnot
V mnoha případech musí být extrahovaná původní hodnota normalizována. Například v ASIM adresa MAC používá dvojtečky jako oddělovač, zatímco zdroj může odeslat adresu MAC s oddělovači s oddělovači. Primárním operátorem transformace hodnot je rozšíření společně se širokou sadou řetězců KQL, číselných a kalendářních funkcí, jak je znázorněno v části Analýza výše.
Příkazy case, iff a lookup use case, iff and lookup when's need to map a set of values to the values allowed by the target field.
Když se každá zdrojová hodnota mapuje na cílovou hodnotu, definujte mapování pomocí operátoru datové tabulky a vyhledávání k mapování. Například
let NetworkProtocolLookup = datatable(Proto:real, NetworkProtocol:string)[
6, 'TCP',
17, 'UDP'
];
let DnsResponseCodeLookup=datatable(DnsResponseCode:int,DnsResponseCodeName:string)[
0,'NOERROR',
1,'FORMERR',
2,'SERVFAIL',
3,'NXDOMAIN',
...
];
...
| lookup DnsResponseCodeLookup on DnsResponseCode
| lookup NetworkProtocolLookup on Proto
Všimněte si, že vyhledávání je užitečné a efektivní také v případech, kdy mapování obsahuje pouze dvě možné hodnoty.
Pokud jsou podmínky mapování složitější, použijte funkce iff nebo case . Funkce iff umožňuje mapování dvou hodnot:
| extend EventResult =
iff(EventId==257 and ResponseCode==0,'Success','Failure’)
Funkce case podporuje více než dvě cílové hodnoty. Následující příklad ukazuje, jak zkombinovat vyhledávání a malá písmena. Výše uvedený příklad vyhledávání vrátí prázdnou hodnotu v poli DnsResponseCodeName, pokud se vyhledávací hodnota nenajde. Následující příklad případu ho rozšíří pomocí výsledku operace vyhledávání , pokud je k dispozici, a v opačném případě určí další podmínky.
| extend DnsResponseCodeName =
case (
DnsResponseCodeName != "", DnsResponseCodeName,
DnsResponseCode between (3841 .. 4095), 'Reserved for Private Use',
'Unassigned'
)
Příprava polí v sadě výsledků
Analyzátor musí připravit pole v sadě výsledků, aby se zajistilo, že se budou používat normalizovaná pole.
K přípravě polí v sadě výsledků se používají následující operátory KQL:
Operátor | Popis | Kdy použít v analyzátoru |
---|---|---|
přejmenování projektu | Přejmenuje pole. | Pokud pole existuje ve skutečné události a stačí ho přejmenovat, použijte přejmenování projektu. Přejmenované pole se stále chová jako předdefinované pole a operace v poli mají mnohem lepší výkon. |
pryč od projektu | Odebere pole. | Pro konkrétní pole, která chcete ze sady výsledků odebrat, použijte projekt pryč. Doporučujeme neodejmout původní pole, která nejsou normalizována ze sady výsledků, pokud nevytvoří nejasnosti nebo jsou velmi velká a mohou mít vliv na výkon. |
projekt | Vybere pole, která existovala dříve nebo byla vytvořena jako součást příkazu, a odebere všechna ostatní pole. | Nedoporučuje se používat v analyzátoru, protože analyzátor by neměl odebírat žádná další pole, která nejsou normalizována. Pokud potřebujete odebrat konkrétní pole, například dočasné hodnoty použité při analýze, odeberte je z výsledků pomocí projektu. |
Rozšířit | Přidejte aliasy. | Kromě své role při generování počítaných polí se operátor extend používá také k vytváření aliasů. |
Zpracování variant analýzy
V mnoha případech události ve streamu událostí zahrnují varianty, které vyžadují jinou logiku analýzy. Pokud chcete analyzovat různé varianty v jednom analyzátoru, použijte podmíněné příkazy, jako je iff a case, nebo použijte sjednocovací strukturu.
Pokud chcete použít sjednocení pro zpracování více variant, vytvořte pro každou variantu samostatnou funkci a pomocí sjednocovacího příkazu zkombinujte výsledky:
let AzureFirewallNetworkRuleLogs = AzureDiagnostics
| where Category == "AzureFirewallNetworkRule"
| where isnotempty(msg_s);
let parseLogs = AzureFirewallNetworkRuleLogs
| where msg_s has_any("TCP", "UDP")
| parse-where
msg_s with networkProtocol:string
" request from " srcIpAddr:string
":" srcPortNumber:int
…
| project-away msg_s;
let parseLogsWithUrls = AzureFirewallNetworkRuleLogs
| where msg_s has_all ("Url:","ThreatIntel:")
| parse-where
msg_s with networkProtocol:string
" request from " srcIpAddr:string
" to " dstIpAddr:string
…
union parseLogs, parseLogsWithUrls…
Aby nedocházelo k duplicitním událostem a nadměrnému zpracování, ujistěte se, že každá funkce začíná filtrováním, pomocí nativních polí, pouze událostí, které má analyzovat. V případě potřeby také před sjednocením používejte projekt mimo každou větev.
Nasazení analyzátorů
Analyzátory nasaďte ručně tak, že je zkopírujete na stránku protokolu služby Azure Monitor a uložíte dotaz jako funkci. Tato metoda je užitečná pro testování. Další informace najdete v tématu Vytvoření funkce.
Pokud chcete nasadit velký počet analyzátorů, doporučujeme použít šablony ARM analyzátoru následujícím způsobem:
Vytvořte soubor YAML založený na příslušné šabloně pro každé schéma a zahrňte do něj váš dotaz. Začněte šablonou YAML, která je relevantní pro váš typ schématu a analyzátoru, filtrování nebo méně parametrů.
Pomocí převaděče šablony ASIM Yaml na ARM převeďte soubor YAML na šablonu ARM.
Pokud nasazujete aktualizaci, odstraňte starší verze funkcí pomocí portálu nebo pomocí nástroje PowerShellu pro odstranění funkce.
Nasaďte šablonu pomocí webu Azure Portal nebo PowerShellu.
Pomocí propojených šablon můžete také zkombinovat více šablon do jednoho procesu nasazení.