Jak s příručkou pracovat
Najdi níže, co chceš zjistit. Zkopíruj jeden celý řádek z rámečku do Search, změň hodnoty a spusť ho. V rámečcích je pouze syntaxe Loggeru: žádné vysvětlivky, odkazy ani značky, které bys musel mazat. Každý řádek je samostatný dotaz.
V příkladech měň hlavně:
- abc za hodnotu svého zákazníka.
- 189.123.12.14 za vyšetřovanou zdrojovou IP.
- 198.51.100.20 za vyšetřovanou cílovou IP.
- alice za účet, který hledáš.
- Port, počet výsledků, časový interval a prahovou hodnotu podle úkolu.
Nejdřív v rozhraní vyber časové okno, například poslední hodinu. Pokud nepoužíváš pole customerName, odstraň zákaznickou podmínku i navazující AND. Názvy polí ponech přesně podle svého schématu.
Syntaxe vychází z oficiální dokumentace Logger 7.3. Pracovní příklady jsou sestavené z doložených příkazů, ale nebyly spuštěné na tvém Loggeru. Konkrétní akce firewallu, ID přihlášení, parsery a lookup tabulky vyžadují místní nastavení; upozornění je vždy u příslušného příkladu. Rozporné varianty nejsou mezi běžnými recepty.
Co tu najdeš
- Jak složit dotaz a přidávat další kroky.
- Chci vyfiltrovat události.
- Chci zjistit nejčastější nebo neobvyklé hodnoty.
- Chci počty, řazení a filtr až po agregaci.
- Chci analyzovat firewall, porty a síťovou komunikaci.
- Chci analyzovat přihlášení.
- Chci zjistit, jak se aktivita mění v čase.
- Chci vypočítat vlastní hodnotu nebo statistiku.
- Chci získat údaje ze zprávy pomocí regexu.
- Chci seskupit související události.
- Chci použít seznam IP, parser nebo raw klíče.
- Chci změnit zobrazení výsledků.
- Přehled parametrů a dalších funkcí.
- Co zkontrolovat, když dotaz nefunguje.
1. Jak složit dotaz a přidávat další kroky
Dotaz čti zleva doprava. Před první svislou čárou vybíráš události. Za každou další svislou čáru přidáš jeden krok, který pracuje s výsledkem předchozího kroku.
Za svislou čáru píšeš skutečný příkaz: například chart, where, sort nebo head. Slovo „agregace“ je jen české označení činnosti, do dotazu se nepíše.
Krok 1: najdu události jedné IP
Tohle je výchozí filtr. Ještě nic nesčítá, vrací události.
customerName=“abc“ AND sourceAddress=“189.123.12.14″
Krok 2: přidám počty podle cílové IP
Přidáním chart count z jednotlivých událostí vytvořím přehled: cílová IP a počet jejích událostí. Počet pojmenuji Hits, abych s ním mohl dál pracovat.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | chart count as Hits by destinationAddress
Krok 3: nechám jen cíle s alespoň 20 událostmi
Přidám where. Teď už filtruji spočítané výsledky podle Hits, nikoli původní události.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | chart count as Hits by destinationAddress | where Hits>=20
Krok 4: seřadím je od nejvyššího počtu
Přidám sort. Minus znamená sestupně, tedy největší hodnoty nahoře.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | chart count as Hits by destinationAddress | where Hits>=20 | sort – Hits
Krok 5: ponechám prvních deset
Přidám head 10. Celý tento řádek můžeš zkopírovat a spustit jako jeden dotaz.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | chart count as Hits by destinationAddress | where Hits>=20 | sort – Hits | head 10
Proč záleží na pořadí
Když omezíš události před počítáním, nespočítáš celou aktivitu. Následující dva dotazy mají jiný význam.
První nejdřív spočítá všechny nalezené události a pak ukáže deset největších skupin:
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | chart count as Hits by destinationAddress | sort – Hits | head 10
Druhý počítá jen z prvních deseti vstupních událostí. Pro přehled celkové aktivity jej nepoužívej:
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | head 10 | chart count as Hits by destinationAddress
Na co si dát pozor po chart
Po seskupení podle destinationAddress už máš cílovou IP a Hits. Původní jednotlivé porty už v tomto přehledu nejsou. Pokud chceš filtrovat port 443, dej jeho filtr před chart. Pokud chceš porty porovnávat i po agregaci, přidej destinationPort do seskupení za by.
Filtr portu před agregací:
customerName=“abc“ AND sourceAddress=“189.123.12.14″ AND destinationPort=443 | chart count as Hits by destinationAddress | sort – Hits
Port jako součást výsledných skupin a následný filtr:
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | chart count as Hits by destinationAddress destinationPort | where destinationPort=443 | sort – Hits
2. Chci vyfiltrovat události
AND znamená „současně“, OR „jedno nebo druhé“, NOT vyloučení. Pro kombinace používej závorky. Mezera mezi podmínkami může fungovat jako AND; v příkladech je AND napsané výslovně, aby byl význam vidět.
Události zákazníka
Základní filtr, ke kterému můžeš připojovat další podmínky nebo kroky.
customerName=“abc“
Jedna zdrojová IP
Změň zákazníka a zdrojovou adresu.
customerName=“abc“ AND sourceAddress=“189.123.12.14″
IP na kterékoli straně komunikace
Najde IP jako zdroj nebo cíl.
customerName=“abc“ AND (sourceAddress=“189.123.12.14″ OR destinationAddress=“189.123.12.14″)
Konkrétní dvojice zdroj a cíl
Obě podmínky musejí platit současně.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ AND destinationAddress=“198.51.100.20″
Jeden port, několik portů, vyloučení portu
První řádek hledá port 443, druhý seznam portů, třetí vyřadí port 443. Seznam za IN patří do hranatých závorek.
customerName=“abc“ AND destinationPort=443 customerName=“abc“ AND destinationPort IN [22,80,443,3389] customerName=“abc“ AND destinationPort!=443
Rozsah portů nebo číselný práh
První hledá porty v rozsahu, druhý události s vyšší jednotlivou hodnotou odeslaných bajtů.
customerName=“abc“ AND destinationPort BETWEEN 1 AND 1024 customerName=“abc“ AND bytesOut>1000000
Text ve zprávě, na začátku nebo na konci
CONTAINS hledá uvnitř textu, STARTSWITH na začátku, ENDSWITH na konci.
customerName=“abc“ AND message CONTAINS „failed“ customerName=“abc“ AND message STARTSWITH „Failed“ customerName=“abc“ AND message ENDSWITH „denied“
Více textových možností a vyloučení výjimky
Najde failed nebo denied a vyloučí zprávy obsahující healthcheck.
customerName=“abc“ AND (message CONTAINS „failed“ OR message CONTAINS „denied“) AND NOT message CONTAINS „healthcheck“
Pole má hodnotu, nebo naopak chybí
IS NOT NULL vyžaduje vyplněné pole. IS NULL hledá chybějící hodnotu; není to porovnání s textem NULL.
customerName=“abc“ AND sourceUserName IS NOT NULL customerName=“abc“ AND sourceUserName IS NULL
Zdrojová IP je v podsíti nebo rozsahu
První řádek používá CIDR, druhý rozsah adres, třetí IPv6 prefix.
customerName=“abc“ AND sourceAddress INSUBNET „192.0.2.0/24″ customerName=“abc“ AND sourceAddress INSUBNET „192.0.2.10-192.0.2.30″ customerName=“abc“ AND sourceAddress INSUBNET „2001:db8::/32“
Zdroj je v síti 10/8 a cíl mimo ni
Tohle znamená mimo rozsah 10/8, nikoli automaticky do internetu. Cíl může být v jiné interní síti.
customerName=“abc“ AND sourceAddress INSUBNET „10.0.0.0/8“ AND NOT destinationAddress INSUBNET „10.0.0.0/8“
Hledání bez konkrétního pole
První řádek je fulltextové hledání slova či prefixu; druhý hledá uvozovanou frázi. Fulltext není totéž jako CONTAINS nad polem message.
failed AND login „failed login“
3. Chci zjistit nejčastější nebo neobvyklé hodnoty
top je nejrychlejší cesta k nejčastějším hodnotám. Když napíšeš více polí, dostaneš četnost jejich kombinací, například dvojice zdrojové a cílové IP. rare řadí opačně, od nejméně častých.
20 nejčastějších dvojic zdroj a cíl
Změň 20 podle požadovaného počtu výsledných kombinací.
customerName=“abc“ | top 20 sourceAddress destinationAddress
10 nejčastějších portů
Ukáže nejčastější cílové porty vybraného zákazníka.
customerName=“abc“ | top 10 destinationPort
Kam nejčastěji komunikuje jedna IP
Kombinuje cíl a cílový port vybraného zdroje.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | top 20 destinationAddress destinationPort
20 nejméně častých cílových IP
rare nemá v doložené syntaxi číselný parametr jako top. Počet zobrazených řádků omezíš přidáním head.
customerName=“abc“ | rare destinationAddress | head 20
Neobvyklé dvojice zdroj a cíl
Vzácnost se vztahuje k vybranému filtru a časovému oknu; sama neprokazuje útok.
customerName=“abc“ | rare sourceAddress destinationAddress | head 20
4. Chci počty, řazení a filtr až po agregaci
chart count počítá události. Za by uvedeš, podle kterých polí je rozdělit do skupin. as Hits pojmenuje výsledný počet. Hits je název, který si volíš; můžeš místo něj použít třeba Attempts, ale musíš ho změnit i v navazujícím where a sort.
Počet událostí každé zdrojové IP
Jeden výsledný řádek odpovídá jedné zdrojové IP.
customerName=“abc“ | chart count as Hits by sourceAddress
Počty pro každou dvojici adres
Jeden řádek odpovídá jedné dvojici zdroj–cíl.
customerName=“abc“ | chart count as Hits by sourceAddress destinationAddress
Jen zdroje s alespoň 100 událostmi
where po chart porovnává výsledný počet Hits.
customerName=“abc“ | chart count as Hits by sourceAddress | where Hits>=100 | sort – Hits
Počty mezi dvěma mezemi
Ponechá skupiny s počtem od 20 do 100.
customerName=“abc“ | chart count as Hits by sourceAddress | where Hits>=20 AND Hits<=100 | sort – Hits
20 největších skupin s IP a portem
Seskupí tři pole, seřadí počty a omezí výsledek.
customerName=“abc“ | chart count as Hits by sourceAddress destinationAddress destinationPort | sort – Hits | head 20
5. Chci analyzovat firewall, porty a síťovou komunikaci
Nejdřív si na několika skutečných událostech zjisti hodnoty deviceAction. Někde je blokace deny, jinde drop, block nebo jiná hodnota. V následujících receptech se předpokládá deny.
Zjistit, jaké akce firewall zapisuje
Pokud jsou ve výsledcích i jiné produkty, přidej do výchozího filtru konkrétní zařízení nebo produkt.
customerName=“abc“ | top 20 deviceAction
Nejčastější blokované kombinace
Změň deny podle ověřené hodnoty akce.
customerName=“abc“ AND deviceAction=“deny“ | top 20 sourceAddress destinationAddress destinationPort
Zdroje s nejvyšším počtem blokací
Počítá blokované logy, ne automaticky pakety nebo spojení.
customerName=“abc“ AND deviceAction=“deny“ | chart count as Denies by sourceAddress | sort – Denies | head 20
Komunikace na porty 22, 445 a 3389
Jde o orientační triáž administrativních služeb. Samotný port nepotvrzuje skutečný aplikační protokol.
customerName=“abc“ AND destinationPort IN [22,445,3389] | top 20 sourceAddress destinationAddress destinationPort
Jaké porty zkoušela jedna IP
Seřadí porty podle jejich čísla a uvede počet událostí.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | chart count as Hits by destinationPort | sort + destinationPort
Seznam různých cílů a portů jedné IP
dedup ponechá jednu událost každé kombinace. Dostaneš přehled pro triáž skenování, nikoli automaticky potvrzený port scan.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | dedup destinationAddress,destinationPort | fields + destinationAddress + destinationPort
Největší jednotlivé odchozí přenosy
Vybere nejvýše 100 událostí s nejvyšší hodnotou bytesOut.
customerName=“abc“ AND bytesOut IS NOT NULL | sort 100 – bytesOut
Souhrn odeslaných bajtů podle cíle
Použij až po kontrole mapování bytesOut a součtu na malém známém vzorku. Dokumentace sum obsahuje nejasný popis opakovaných hodnot.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | chart sum(bytesOut) as OutBytes by destinationAddress | sort – OutBytes | head 20
Počet logů i vykázané bajty současně
Více agregačních funkcí odděluje čárka. Za by jsou společná pole seskupení.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | chart count as Hits, sum(bytesOut) as OutBytes by destinationAddress destinationPort | sort – OutBytes
6. Chci analyzovat přihlášení
Následující Windows příklady předpokládají, že deviceEventClassId obsahuje 4625 pro neúspěch a 4624 pro úspěch. To musí odpovídat tvému konektoru. Pokud neodpovídá, změň filtr události; zbytek dotazu lze použít stejně.
Neúspěšná přihlášení podle zdroje a účtu
Najde nejčastější kombinace zdrojové IP a uživatele.
customerName=“abc“ AND deviceEventClassId=“4625″ | top 20 sourceAddress sourceUserName
Účty s alespoň 20 událostmi neúspěchu
Nejprve vybere selhání, potom počítá podle účtu a teprve poté filtruje počet.
customerName=“abc“ AND deviceEventClassId=“4625″ | chart count as Failures by sourceUserName | where Failures>=20 | sort – Failures
Jaké účty zkoušel jeden zdroj
Použitelné pro první triáž password spray. Nastav odpovídající krátké časové okno.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ AND deviceEventClassId=“4625″ | top 50 sourceUserName
Odkud se úspěšně přihlásil konkrétní účet
Nahraď alice skutečným účtem.
customerName=“abc“ AND deviceEventClassId=“4624″ AND sourceUserName=“alice“ | top 20 sourceAddress destinationHostName
Neznám mapování ID a chci první textovou orientaci
Text failed může být neúplný či nepřesný filtr. Podle nalezených logů si potom vytvoř přesnější podmínku.
customerName=“abc“ AND message CONTAINS „failed“ | top 20 name sourceUserName
7. Chci zjistit, jak se aktivita mění v čase
Nejdřív v UI nastav rozsah hledání. Potom přidej span do příkazu chart. span=5m znamená pětiminutové skupiny; není to délka celého hledání.
Použij s pro sekundy, m pro minuty, h pro hodiny, d pro dny. span bez zadaného pole používá EventTime.
Počty po pěti minutách podle zdroje
Pomůže najít nárazové zvýšení aktivity.
customerName=“abc“ | chart count as Hits by sourceAddress span=5m
Minutový profil jedné IP podle cíle
Každý cíl sleduje po minutách.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | chart count as Hits by destinationAddress span=1m
Průběh komunikace konkrétní dvojice
Ukáže rozdělení cílových portů v čase.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ AND destinationAddress=“198.51.100.20″ | chart count as Hits by destinationPort span=5m
Alespoň 20 selhání přihlášení za pět minut
Počítá pro každou zdrojovou IP a pětiminutovou skupinu. Jde o pevné skupiny, ne automaticky libovolné klouzavé okno.
customerName=“abc“ AND deviceEventClassId=“4625″ | chart count as Failures by sourceAddress span=5m | where Failures>=20
Hodinový objem vykázaných odchozích bajtů
Platí stejná nutnost ověřit význam bytesOut a chování sum jako u objemových receptů.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | chart sum(bytesOut) as OutBytes by destinationAddress span=1h
Seskupovat podle konkrétního časového pole
Pole se píše v závorkách za span. Zde jde o deviceReceiptTime.
customerName=“abc“ | chart count as Hits by destinationPort span(deviceReceiptTime)=5m
Poslední dvě hodiny, dnešek nebo včerejšek
Tohle se nastavuje v polích Start a End v rozhraní, nepřipojuje se to za svislou čáru.
- Poslední dvě hodiny: Start je Now−2h,EndjeNow.
- Dnešek: Start je Today,EndjeNow.
- Celý včerejšek: Start je Today−1d,EndjeToday.
- Tento týden: Start je CurrentWeek,EndjeNow.
- Minulý kalendářní měsíc: Start je CurrentMonth−1M,EndjeCurrentMonth.
Čas přijetí Loggerem může být jiný než čas události ze zařízení. V UI si zkontroluj časový základ. span=1d znamená pevné 24hodinové období i při změně letního času. Pravidelné sloupce grafu jsou podnět k analýze; samy nepotvrzují beaconing.
8. Chci vypočítat vlastní hodnotu nebo statistiku
eval vytvoří nové pole pro každý vstupní řádek. chart potom může tyto hodnoty seskupovat. where neumí přímo volat výpočetní funkce; výpočet udělej v eval a ve where použij název výsledného pole.
U číselného výstupu uváděj typ v závorkách, například (int), (long) nebo (double). Bez typu eval vytváří text a číselné řazení by nemuselo mít očekávaný výsledek.
Délka URL a nejdelší URL nahoře
UrlLength je vlastní číselné pole; dále jej můžeš filtrovat a řadit.
customerName=“abc“ | eval (int)UrlLength=len(requestUrl) | where UrlLength>200 | sort – UrlLength
Součet příchozích a odchozích bajtů jedné události
eval sum sčítá argumenty uvnitř jednoho řádku, nikoli všechny události dohromady.
customerName=“abc“ AND bytesIn IS NOT NULL AND bytesOut IS NOT NULL | eval (long)TotalBytes=sum(bytesIn,bytesOut) | sort 100 – TotalBytes
Převaha odchozích bajtů nad příchozími
bytesIn>0 zabrání dělení nulou. Poměr sám nepotvrzuje exfiltraci.
customerName=“abc“ AND bytesOut IS NOT NULL AND bytesIn>0 | eval (double)OutInRatio=bytesOut/bytesIn | where OutInRatio>10 | sort – OutInRatio
Sjednotit velikost písmen uživatelského jména
Název pole ve funkci nemá uvozovky. Uvozovaný text by byl literál.
customerName=“abc“ AND sourceUserName IS NOT NULL | eval UserLower=lower(sourceUserName) | top 20 UserLower
Vlastní označení podle podmínky
Uvnitř eval se rovnost testuje dvojitým ==. Výsledek pojmenuji PortLabel.
customerName=“abc“ | eval PortLabel=if(destinationPort==443,“Port443″,“Other“) | top PortLabel
Průměr, minimum a maximum bajtů podle zdroje
Jednotlivé funkce odděluje čárka.
customerName=“abc“ | chart avg(bytesOut) as Average, min(bytesOut) as Minimum, max(bytesOut) as Maximum by sourceAddress
Odchylka a 90. percentil
Použij numerické pole. P90 je pojmenování výsledku, perc90 je samotná funkce.
customerName=“abc“ | chart stdev(bytesOut) as Deviation, perc90(bytesOut) as P90 by sourceAddress
9. Chci získat údaje ze zprávy pomocí regexu
regex vybere odpovídající události. rex naopak zachytí část textu do nového pole. Až potom nad novým polem použiješ where, top nebo chart.
Následující extrakční vzory jsou praktické příklady pro konkrétní tvar zprávy. Přizpůsob je skutečným raw logům.
Zpráva obsahuje failed nebo denied
Svislá čára uvnitř uvozovaného regexu znamená alternativu ve vzoru.
customerName=“abc“ | regex message=“failed|denied“
Ve zprávě musejí být oba vzory
Dva kroky regex za sebou musejí projít oba.
customerName=“abc“ | regex message=“failed“ | regex message=“password“
Vyřadit zprávy odpovídající regexu
Nerovnost zde neguje shodu s výrazem.
customerName=“abc“ | regex message!=“healthcheck“
Z raw textu user=alice získat účet
UserValue je nové pole. Vzor čte hodnotu do mezery nebo středníku.
customerName=“abc“ | rex „user=(?[^ ;]+)“ | where UserValue IS NOT NULL | top 20 UserValue
Z raw zprávy získat kandidáta na IPv4
IPAddress je nové pole. Vzor hledá tvar čtyř čísel, ale nekontroluje rozsah oktetů 0 až 255.
customerName=“abc“ | rex „(?[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3})“ | where IPAddress IS NOT NULL | top 20 IPAddress
Získat část URL za http
Použitelné pro raw text s nešifrovaným prefixem http. Vzor není automaticky univerzální extrakce všech URL.
customerName=“abc“ | rex „http://(?[^ ]*)“ | top 20 URL
Nahradit text pouze ve výsledku hledání
Tento podporovaný režim rex nemění původní uloženou událost. g znamená všechny výskyty.
customerName=“abc“ | rex field=message mode=sed „s/Authentication/xxxx/g“
10. Chci seskupit související události
transaction spojí události podle stejných hodnot vybraných polí. Můžeš přidat maximální délku, maximální přestávku a počet událostí.
- maxspan=5m: transakce má trvat nejvýše pět minut.
- maxpause=30s: dvě sousední události mají být nejvýše 30 sekund od sebe.
- maxevents=100: transakce má obsahovat nejvýše 100 událostí.
Výstup obsahuje transactionid, duration a eventcount. duration je v milisekundách. Metadata jsou připojena k jednotlivým událostem, takže jedna transakce se může zobrazit na více řádcích.
Seskupit komunikaci zdroje a cíle
Mezera nad 30 sekund nebo dosažení jiného limitu ukončí skupinu.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | transaction sourceAddress destinationAddress maxspan=5m maxpause=30s maxevents=100
Nechat jen skupiny s alespoň 20 událostmi
transactionid>0 vylučuje události, které nebyly zařazené do transakce.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | transaction sourceAddress destinationAddress maxspan=5m | where transactionid>0 AND eventcount>=20
Jeden řádek za každou transakci
dedup transactionid odstraní opakování stejné transakce. Pak ji můžeš seřadit podle délky.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | transaction sourceAddress destinationAddress maxspan=10m maxpause=60s | where transactionid>0 | dedup transactionid | sort – duration
Relace podle textu přihlášení a odhlášení
Vyžaduje, aby raw logy opravdu obsahovaly odpovídající texty. startswith a endswith zde hledají regex v raw události, nejsou to podmínky nad polem message.
customerName=“abc“ | transaction sourceUserName sourceAddress maxspan=1h startswith=“user [Ll]ogin“ endswith=“[Ll]ogout“
Před transaction nevyfiltruj události, které potřebuješ jako začátek nebo konec. Samotná IP může kvůli NAT spojit více uživatelů. Transakce obsahující úspěšné i neúspěšné přihlášení sama neprokazuje pořadí neúspěch → úspěch; prohlédni časy a obsah.
11. Chci použít seznam IP, parser nebo raw klíče
Tato část vyžaduje konkrétní lookup tabulku, uložený parser nebo formát raw logu. Názvy z příkladů nejsou automaticky přítomné na každém Loggeru.
Porovnat cílové IP se seznamem indikátorů
Předpoklad: nahraná lookup tabulka maliciousIP se sloupci ip a label. ip je jméno CSV sloupce; destinationAddress je pole Loggeru.
customerName=“abc“ | lookup + maliciousIP ip as destinationAddress output label
Vyloučit IP ze seznamu povolených zdrojů
Předpoklad: lookup tabulka allowlistedIP má sloupec ip. Minus ponechá události bez shody.
customerName=“abc“ | lookup – allowlistedIP ip as sourceAddress
Doplnit vlastníka cílového zařízení
Předpoklad: tabulka assets obsahuje ip, owner a criticality. Hvězdička zachová i události bez nalezeného záznamu.
customerName=“abc“ | lookup * assets ip as destinationAddress output owner,criticality
Porovnat IP i port najednou
Předpoklad: tabulka services obsahuje ip, port a service.
customerName=“abc“ | lookup + services ip as destinationAddress,port as destinationPort output service
Použít uložený parser a potom filtrovat jeho pole
Předpoklad: existuje parser Web Server Access Log, který vytváří login_status a username. Vytvořená pole filtruj až za parse.
customerName=“abc“ | parse Web Server Access Log | where login_status=“failed“ | top 20 username
Zjistit klíče raw logu
Pro raw text ve formátu user=alice;action=failed;src=192.0.2.10. keys vrací přehled klíčů, ne extrahované původní události.
customerName=“abc“ | keys pairdelim=“;“ kvdelim=“=“ limit=100
Z raw klíčů získat hodnoty a dál je analyzovat
Spusť jako nový dotaz nad raw událostmi. Nepřipojuj extract za keys. Pole user a action vzniknou až zde.
customerName=“abc“ | extract pairdelim=“;“ kvdelim=“=“ maxchars=20000 fields=“user,action“ | where action=“failed“ | top 20 user
12. Chci změnit zobrazení výsledků
fields vybírá sloupce, where vybírá odpovídající řádky. sort určuje pořadí. head a tail vybírají řádky z aktuálního pořadí; samy neznamenají nejnovější nebo nejstarší události.
Zobrazit jen síťová pole
Znaménko plus pole zahrnuje. Pokud se změna v UI neprojeví, vyber User Defined Fieldsets.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | fields + sourceAddress + destinationAddress + destinationPort + deviceAction
Skrýt dlouhou zprávu
Minus pole vyloučí ze zobrazení.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | fields – message
Prvních nebo posledních 20 řádků
Záleží na aktuálním pořadí výsledků. Není to průběžné sledování logu.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | head 20 customerName=“abc“ AND sourceAddress=“189.123.12.14″ | tail 20
Více podmínek řazení
Primárně sestupně podle bytesOut, při shodě vzestupně podle destinationAddress.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | sort 100 – bytesOut + destinationAddress
Ponechat jednu událost na každou cílovou IP
dedup nezobrazuje četnost. Pro četnosti použij top nebo chart count.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | dedup destinationAddress
Ponechat pět příkladů každé cílové IP
Číslo za dedup určuje počet ponechaných výskytů.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | dedup 5 destinationAddress
Přejmenovat pole pro výstup
Nový název SourceIP můžeš použít v dalším kroku. Původní sloupec může ve výsledcích zůstat.
customerName=“abc“ AND sourceAddress=“189.123.12.14″ | rename sourceAddress as SourceIP | fields + SourceIP + destinationAddress
Nahradit označení akce ve výsledku
replace mění zobrazenou hodnotu. Nenahrazuje filtr akce.
customerName=“abc“ | replace „deny“ with „blocked“, „allow“ with „permitted“ in deviceAction
13. Přehled parametrů a dalších funkcí
Tato část doplňuje recepty. Nejsou v ní řádky tabulky, které by vypadaly jako dotaz. Když chceš něco spustit, kopíruj vždy celý řádek z rámečku.
Podmínky před první svislou čárou a ve where
- = je rovnost, != nerovnost.
- , <, >= a <= porovnávají hodnoty podle jejich typu; text se řadí lexikograficky.
- IN vybírá ze seznamu v hranatých závorkách; NOT IN nebo NOT před podmínkou ji neguje.
- BETWEEN dolní mez AND horní mez určuje rozmezí.
- STARTSWITH, ENDSWITH a CONTAINS jsou textové podmínky.
- IS NULL a IS NOT NULL kontrolují chybějící hodnotu.
- INSUBNET přijímá CIDR, rozsah IP i wildcardový prefix, například 192.0.2.*.
- AND, OR, NOT a závorky kombinují podmínky.
top, rare a chart
- top: počet a pole; bez čísla standardně 500 výsledných kombinací.
- rare: pole bez doloženého číselného parametru; pro omezení výstupu připoj head.
- chart: funkce, nepovinné as s vlastním názvem, pole za by a případně span.
- count počítá události. sum sčítá hodnoty numerického pole; interpretaci součtů ověř na známém vzorku.
- avg a mean jsou dvě jména pro průměr. min a max vracejí extrémy.
- stdev počítá směrodatnou odchylku. perc50 je 50. percentil, perc90 90. percentil; číslo může být 0 až 100.
- Více funkcí chart odděluje čárka; každá numerická funkce má jedno vstupní pole.
- span přijímá s, m, h, d. Explicitní časové pole je v závorkách, například span(deviceReceiptTime)=5m.
- Graf standardně zobrazuje deset hodnot. Zkontroluj Display Limit, než usoudíš, že dalších skupin není víc. Dokumentace uvádí i výchozí limit 500 položek grafových výsledků.
where, sort, head, tail, fields a dedup
- where přijímá podmínku nad dostupnými poli. Funkce a aritmetiku proveď předem v eval.
- sort: nepovinný počet 1 až 10 000, pak pole se znaménkem plus nebo minus. Standardně vrací nejvýše 10 000 řádků. Textové řazení rozlišuje velikost písmen.
- head a tail: volitelný počet, standardně 10. Potřebují dokončení dotazu; tail není sledování přibývajících logů.
- fields: plus pro zahrnutí, minus pro vyloučení. Vyžaduje úplné názvy polí, wildcardy v nich nejsou podporované.
- dedup: nepovinný počet, standardně 1, potom pole. U více polí porovnává jejich kombinaci.
- dedup keepempty=true ponechá i události s NULL v porovnávaných polích; standardně false.
- dedup keepevents=true ponechá duplicitní řádky a nastaví jejich porovnávaná pole na NULL; standardně false.
eval a všechny doložené funkce
Nové pole vzniká přiřazením za jednoduchým =. Porovnání uvnitř výrazu se píše ==. Číselné typy jsou int, bigint, long, float a double; bez typu je výstup textový.
Uvnitř eval lze použít +, -, *, /, %, mocninu ^, unární znaménka, porovnání a logické &&, || a !. Složitější výrazy závorkuj. Plus může také spojovat texty.
Následující skupiny jsou celé dotazy s krátkými příklady funkcí. Číselné konstanty umožňují snadno zkontrolovat očekávaný výsledek.
Absolutní hodnota, zaokrouhlení nahoru oběma podporovanými názvy, dolů a na nejbližší celé číslo:
customerName=“abc“ | eval (int)Result=abs(-3) customerName=“abc“ | eval (int)Result=ceil(1.2) customerName=“abc“ | eval (int)Result=ceiling(1.2) customerName=“abc“ | eval (int)Result=floor(1.9) customerName=“abc“ | eval (int)Result=round(1.5)
Odmocnina, exponenciála, přirozený a desítkový logaritmus, modulo, součet argumentů a náhodná hodnota:
customerName=“abc“ | eval (double)Result=sqrt(9) customerName=“abc“ | eval (double)Result=exp(3) customerName=“abc“ | eval (double)Result=ln(100) customerName=“abc“ | eval (double)Result=log(10000) customerName=“abc“ | eval (int)Result=mod(25,10) customerName=“abc“ | eval (int)Result=sum(1,2,3) customerName=“abc“ | eval (double)Result=rand()
Podmínky: if vybírá ze dvou hodnot. case vrátí hodnotu první pravdivé podmínky a bez shody NULL. istrue a isfalse testují pravdivost; u čísel dokumentace chápe kladné číslo jako true a nulu či záporné jako false:
customerName=“abc“ | eval Result=if(destinationPort==443,“HTTPS“,“Other“) customerName=“abc“ | eval Result=case(destinationPort==443,“HTTPS“,destinationPort==80,“HTTP“) customerName=“abc“ | eval Result=istrue(8) customerName=“abc“ | eval Result=isfalse(4+4==9)
Text: délka, malá a velká písmena včetně synonym, odstranění mezer po obou stranách, zleva a zprava:
customerName=“abc“ | eval (int)Result=len(requestUrl) customerName=“abc“ | eval Result=lower(sourceUserName) customerName=“abc“ | eval Result=tolower(sourceUserName) customerName=“abc“ | eval Result=upper(sourceUserName) customerName=“abc“ | eval Result=toupper(sourceUserName) customerName=“abc“ | eval Result=trim(sourceUserName) customerName=“abc“ | eval Result=ltrim(sourceUserName) customerName=“abc“ | eval Result=rtrim(sourceUserName)
Výřez substr začíná indexem od nuly; poslední argument je koncový index, který se nezahrnuje, nikoli délka. První řádek vrátí Arc. Funkce replace nahrazuje regexové shody v textu a urldecode dekóduje URL:
customerName=“abc“ | eval Result=substr(„ArcSight“,0,3) customerName=“abc“ | eval Result=replace(deviceVendor,“ArcSight“,“OpenText“) customerName=“abc“ | eval Result=urldecode(requestUrl)
Dávej pozor na NULL, dělení nulou a neplatné vstupy. U záporné odmocniny nebo nekladného logaritmu nepředpokládej použitelný číselný výsledek. rand vrací podle dokumentace hodnotu od 0 do 1. Varianta round se dvěma argumenty zde doložená není.
regex a rex
- regex bez názvu pole hledá v raw události; s polem použij = nebo != a uvozovaný vzor. Dokumentace uvádí case-insensitive porovnání.
- rex zachycuje pomocí pojmenované skupiny. Zvol alfanumerické jméno nového pole.
- rex field s mode=sed podporuje substituci s/pattern/replacement/g; bez g nahradí první výskyt.
- Tečka v regexu znamená libovolný znak; [.] doslovnou tečku. ^ a $ ukotvují začátek a konec vstupu.
- Backslash může být nutnou součástí regexu, není to dekorace. Nemaž jej ze skutečných vzorů jen proto, že se nepíše v běžných podmínkách.
transaction
- Pole určují společný klíč skupiny.
- maxevents má výchozí hodnotu 1 000. maxspan a maxpause jsou bez výchozího časového omezení; jednotky jsou s, m, h, d.
- startswith a endswith jsou regexy nad raw událostí. Pokud použiješ více koncových podmínek, stačí první dosažená.
- transactionid=0 znamená nezařazenou událost. duration je v milisekundách a eventcount je velikost skupiny.
lookup, parse, keys a extract
- lookup plus nebo bez znaménka vybere shody; minus neshody; hvězdička ponechá všechny události.
- V mapování ip as destinationAddress je ip sloupec CSV a destinationAddress pole Loggeru. Více klíčů odděluje čárka.
- output určí připojené sloupce CSV; output * připojí všechny. Bez output se externí sloupce nepřidají. Při minus output nepoužívej.
- Lookup při duplicitním klíči použije jen první shodu. Síť v CIDR nefunguje automaticky jako join na podsíť. Mapování a typ IP ověř malým testem, dokumentace obsahuje nejednotné popisy pořadí názvů.
- První lookup používá platné event field na straně Loggeru; další lookup může navazovat na pole předchozích kroků. Pro velké lookup tabulky dokumentace uvádí přibližně 1 GB sdílené paměti všech lookup hledání.
- parse přijímá jméno existujícího parseru. Jeho pole vzniknou až při zpracování, nelze je bez dalšího filtrovat před prvním krokem dotazu. Při kolizi polí má přednost poslední explicitní parser.
- keys: pairdelim odděluje dvojice, kvdelim klíč a hodnotu, limit omezuje počet dvojic. Výchozí pairdelim obsahuje středník, svislou čáru a čárku, kvdelim je rovná se. Pro limit není uveden výchozí ani maximální počet.
- extract: stejné oddělovače, povinné fields se seznamem klíčů a volitelné maxchars, standardně 10 240 znaků.
- keys i extract jsou pro raw události, nikoli CEF nebo pole vytvořená rex. Chybějící oddělovače znemožní správné rozdělení. keys ignoruje prázdné hodnoty a jeho výstup nelze řetězit do extract.
rename, replace a historické cef
- rename používá původní pole, as a nové jméno. Nové jméno je case-sensitive, platí jen pro dotaz a může přibýt vedle původního sloupce.
- Názvy s mezerami a wildcardy se uzavírají do dvojitých uvozovek. Interní pole začínající _raw nelze přejmenovat.
- Samostatné replace používá původní text, with, nový text a doporučené in se seznamem polí. Více náhrad odděluje čárka.
- U částečné náhrady použij hvězdičky pro zachované části. Obsahují-li hvězdičky obě strany, jejich počty musejí odpovídat. Původní text se porovnává bez rozlišení velikosti písmen.
- Bez in není zaručen zásah všech polí; týká se polí zpřístupněných předchozími kroky. Funkce replace v eval má jinou podobu: tři argumenty a regexovou náhradu.
- cef je starší explicitní extrakce CEF polí. Od verze 5.2 je běžně implicitní, pro nové dotazy ji obvykle nepotřebuješ. U non-CEF vstupů dává NULL.
Částečná náhrada se zachováním okolního textu:
customerName=“abc“ | replace „*EPS*“ with „*Events*“ in deviceEventCategory
Historický zápis cef pro čtení starých dotazů:
customerName=“abc“ | cef sourceAddress destinationAddress
Omezení hledání na skupiny a peery
Následující názvy musejí existovat v místní konfiguraci. Omezení patří před první zpracovací krok, ne doprostřed agregace. Při kombinaci OR dej odpovídající podmínky do závorek.
_storageGroup IN [„Default Storage Group“] AND sourceAddress=“189.123.12.14″ | top 20 destinationAddress _deviceGroup IN [„Firewalls“] AND destinationPort=443 | top 20 sourceAddress _peerLogger IN [„peer1″,“peer2″] AND sourceAddress=“189.123.12.14“ | top 20 destinationAddress (failed OR denied) _storageGroup IN [„Default Storage Group“]
Distribuované hledání závisí na oprávněních, verzích peerů a shodných vlastních polích. Logger 7.3 dokumentuje až 100 peerů. Výpadek peeru nebo neexistující skupina může znamenat neúplný přehled.
14. Co zkontrolovat, když dotaz nefunguje
Nenajdu ani základní události
- Zkus nejdřív samotný filtr zákazníka a ověř časové okno.
- Zkontroluj, zda je customerName skutečné pole a abc skutečná hodnota.
- Přidej IP a další podmínky postupně. Uvidíš, po které podmínce události zmizely.
- U textových podmínek zkontroluj velikost písmen a skutečný obsah pole.
Nevím, který krok dotaz rozbil
Vrať se k poslední funkční podobě a přidávej vždy jen jeden krok za svislou čáru. Po agregaci používej jen seskupovací pole a výsledné sloupce. Pokud potřebuješ původní události, začni znovu od filtru před chart.
Počty nebo pořadí nesedí
- Nepoužil jsi head nebo jiný omezující krok před chart?
- Nedošlo k oříznutí na limit 10 000 výsledků sort?
- Nemáš v grafu nastavených jen deset zobrazených skupin?
- Je hledání dokončené a neskočilo na omezení skenování?
- Je číslo vytvořené eval skutečně číselné, například s typem (int)?
- Počítáš události, skutečná spojení, nebo již souhrnné logy? count automaticky nesčítá baseEventCount.
- Nevytváří konektor více logů pro jediný pokus nebo spojení?
Vytvořené pole nevidím
Zkus v rozhraní User Defined Fieldsets. Pole vytvořená rex, parse, extract a eval existují až ve výsledku zpracování, ne automaticky v trvalém schématu. Při exportu může být potřeba zahrnout uživatelská pole pomocí volby *user.
Co sem záměrně nepatří jako hotový recept
V dokumentaci jsou nejednotnosti kolem _count, některých percentilových zápisů a popisu sum. Pracovní recepty používají chart count s vlastním názvem výsledku a percentily numerického pole. Objemové součty před použitím ověř na malém vzorku s opakovanými známými hodnotami.
Nepřepisuj sem automaticky příkazy stats, timechart, join nebo funkce dc a cidrmatch z jiných produktů. V referenčním seznamu Loggeru 7.3 nejsou doložené. Stejně tak sem nepatří linuxové tail -f nebo libovolné volby systémového sed.
Moje místní poznámky
- Verze a build Loggeru: doplnit.
- Skutečná hodnota customerName: doplnit.
- Blokovací akce firewallu: doplnit.
- Pole a ID úspěšného a neúspěšného přihlášení: doplnit.
- Význam bytesIn a bytesOut: doplnit.
- Ověřené lookup tabulky a parsery: doplnit.
- Výsledek kontroly sum na známém vzorku: doplnit.
Nový recept doplň jako ostatní: co chceš zjistit, co je třeba upravit, celý dotaz na jednom řádku a případné místní předpoklady. Vysvětlení piš mimo kopírovatelný rámeček.
Podklad: oficiální ArcSight Logger 7.3 Administrator’s Guide, kapitola Searching and Analyzing Events a Appendix A: Search Operators. Seznam zdrojů je odděleně v souboru ArcSight_Logger_Zdroje.txt, aby nepřekážel mezi pracovními dotazy.