Návod na analýzu¶
Celý proces analýzy vyžaduje deklarace parseru, mapování a obohacovače. Tento návod podrobně popisuje vytváření deklarací krok za krokem. Navštivte LogMan.io Parsec documentation pro více informací o mikroservisu Parsec.
Než začnete
SP-Lang
Deklarace pro analýzu jsou psány v jazyce SP-Lang od TeskaLabs. Pro více informací o výrazech pro analýzu navštivte dokumentaci SP-Lang.
Deklarace
Pro více informací o konkrétních typech deklarací viz:
Ukázkové logy¶
Tento příklad používá tuto sadu logů shromážděných z různých zařízení Sophos SG230:
<181>2023:01:12-13:08:45 asgmtx httpd: 212.158.149.81 - - [12/Jan/2023:13:08:45 +0100] "POST /webadmin.plx HTTP/1.1" 200 2000
<38>2023:01:12-13:09:09 asgmtx sshd[17112]: Failed password for root from 218.92.0.190 port 56745 ssh2
<38>2023:01:12-13:09:20 asgmtx sshd[16281]: Did not receive identification string from 218.92.0.190
<38>2023:01:12-13:09:20 asgmtx aua[2350]: id="3005" severity="warn" sys="System" sub="auth" name="Authentication failed" srcip="43.139.111.88" host="" user="login" caller="sshd" reason="DENIED"
Tyto logy používají formát syslog popsaný v RFC 5424.
Logy lze obvykle rozdělit na dvě části: hlavičku a tělo. Hlavička je cokoli, co předchází prvnímu dvojtečce po časovém razítku. Tělo je zbytek logu.
Strategie analýzy¶
Parsec interpretuje každou deklaraci abecedně podle názvu, takže pořadí názvů je důležité. V rámci každé deklarace následuje proces analýzy pořadí, ve kterém píšete výrazy jako kroky.
Sekvence analýzy může zahrnovat více deklarací parseru a také potřebuje deklaraci mapování a deklaraci obohacovače. V tomto případě vytvořte tyto deklarace:
- První deklarace parseru: Analyzujte hlavičky syslogu
- Druhá deklarace parseru: Analyzujte tělo logů jako zprávu.
- Deklarace mapování: Přejmenujte pole
- Deklarace obohacovače: Přidejte metadata (například název datasetu) a vypočítejte zařízení a závažnost syslogu z priority
Podle pojmenovacích konvencí pojmenujte tyto soubory:
- 10_parser_header.yaml
- 20_parser_message.yaml
- 30_mapping_ECS.yaml
- 40_enricher.yaml
Pamatujte, že deklarace jsou interpretovány v abecedním pořadí, v tomto případě podle rostoucího číselného předpony. Používejte předpony jako 10, 20, 30 atd., abyste mohli později přidat novou deklaraci mezi stávající, aniž byste museli přejmenovávat všechny soubory.
1. Analýza hlavičky¶
Toto je první deklarace parseru. Následující části podrobně rozebírají a vysvětlují každou část deklarace.
---
define:
type: parsec/parser
parse:
!PARSE.KVLIST
# Část PRI
- '<'
- PRI: !PARSE.DIGITS
- '>'
# Časové razítko
- TIMESTAMP: !PARSE.DATETIME
- year: !PARSE.DIGITS # rok: 2023
- ':'
- month: !PARSE.MONTH { what: 'number' } # měsíc: 01
- ':'
- day: !PARSE.DIGITS # den: 12
- '-'
- hour: !PARSE.DIGITS # hodina: 13
- ':'
- minute: !PARSE.DIGITS # minuta: 08
- ':'
- second: !PARSE.DIGITS # sekunda: 45
- !PARSE.UNTIL ' '
# Název hostitele a proces
- HOSTNAME: !PARSE.UNTIL ' ' # asgmtx
- PROCESS: !PARSE.UNTIL ':'
# Zpráva
- !PARSE.SPACES
- MESSAGE: !PARSE.CHARS
Hlavičky logů¶
Hlavičky syslogu jsou ve formátu:
<PRI>TIMESTAMP HOSTNAME PROCESS.NAME[PROCESS.PID]:


Důležité: Variabilita logů
Všimněte si, že PROCESS.PID
v hranatých závorkách není přítomen v hlavičce prvního logu. Abychom vyřešili tuto nesrovnalost, parser bude potřebovat způsob, jak se vypořádat s možností, že PROCESS.PID
může být buď přítomný, nebo nepřítomný. To bude řešeno později v návodu.
Analýza PRI¶
Nejprve analyzujte PRI, který je uzavřen mezi znaky <
a >
, bez mezery mezi nimi.
Jak analyzovat <PRI>
, jak je vidět v první deklaraci parseru:
!PARSE.KVLIST
- !PARSE.EXACTLY { what: '<' }
- PRI: !PARSE.DIGITS
- !PARSE.EXACTLY { what: '>' }
Použité výrazy:
!PARSE.EXACTLY
: Analyzování znaků<
a>
!PARSE.DIGITS
: Analyzování čísel (číslic) PRI
!PARSE.EXACTLY
zkratka
Výraz !PARSE.EXACTLY
má syntaktickou zkratku, protože je tak často používán. Místo zahrnutí celého výrazu, PARSE.EXACTLY { what: '(character)' }
může být zkráceno na '(character')
.
Takže, výše uvedená deklarace parseru může být zkrácena na:
!PARSE.KVLIST
- '<'
- PRI: !PARSE.DIGITS
- '>'
Analýza časového razítka¶
Neanalyzovaný formát časového razítka je:
yyyy:mm:dd-HH:MM:SS
2023:01:12-13:08:45
Analyzujte časové razítko pomocí výrazu !PARSE.DATETIME
.
Jak je vidět v první deklaraci parseru:
# 2023:01:12-13:08:45
- TIMESTAMP: !PARSE.DATETIME
- year: !PARSE.DIGITS # rok: 2023
- ':'
- month: !PARSE.MONTH { what: 'number' } # měsíc: 01
- ':'
- day: !PARSE.DIGITS # den: 12
- '-'
- hour: !PARSE.DIGITS # hodina: 13
- ':'
- minute: !PARSE.DIGITS # minuta: 08
- ':'
- second: !PARSE.DIGITS # sekunda: 45
- !PARSE.UNTIL { what: ' ', stop: after }
Analýza měsíce:
Výraz !PARSE.MONTH
vyžaduje, abyste specifikovali formát měsíce v parametru what
. Možnosti jsou:
'number'
(použito v tomto případě), které přijímá čísla 01-12'short'
pro zkrácené názvy měsíců (LED, ÚNO atd.)'full'
pro plné názvy měsíců (LEDEN, ÚNOR atd.)
Analýza mezery:
Mezera na konci časového razítka také potřebuje být analyzována. Použití výrazu !PARSE.UNTIL
analyzuje vše až do znaku mezery (' '
), zastavuje se po mezeře, jak je definováno (stop: after
).
!PARSE.UNTIL
zkratky a alternativy
!PARSE.UNTIL
má syntaktickou zkratku:
- !PARSE.UNTIL ' '
- !PARSE.UNTIL { what: ' ', stop: after }
Alternativně můžete zvolit výraz, který specificky analyzuje jednu nebo více mezer, respektive:
- !PARSE.SPACE
nebo
- !PARSE.SPACES
V tomto okamžiku je analyzována sekvence znaků <181>2023:01:12-13:08:45
(včetně mezery na konci).
Analýza názvu hostitele a procesu¶
Další je analýza názvu hostitele a procesu: asgmtx sshd[17112]:
.
Pamatujte, že hlavička prvního logu se liší od ostatních. Pro řešení, které zohledňuje tuto odchylku, vytvořte deklaraci parseru a subparser.
Jak je vidět v první deklaraci parseru:
# Název hostitele a proces
- HOSTNAME: !PARSE.UNTIL ' ' # asgmtx
- PROCESS: !PARSE.UNTIL ':'
# Zpráva
- !PARSE.SPACES
- MESSAGE: !PARSE.CHARS
- Analyzujte název hostitele: Pro analýzu názvu hostitele použijte výraz
!PARSE.UNTIL
, který analyzuje vše až do jediného znaku uvedeného uvnitř' '
, což je v tomto případě mezera, a zastaví se po tomto znaku, aniž by zahrnoval znak do výstupu. - Analyzujte proces: Znovu použijte
!PARSE.UNTIL
pro analýzu až do:
. Po dvojtečce ('
), je hlavička analyzována. - Analyzujte zprávu: V této deklaraci použijte
!PARSE.SPACES
pro analýzu všech mezer mezi hlavičkou a zprávou. Poté uložte zbytek události do poleMESSAGE
pomocí výrazu!PARSE.CHARS
, který v tomto případě analyzuje všechny zbývající znaky v logu. Další deklarace použijete k analýze částí zprávy.
1.5. Analýza pro variabilitu logů¶
Abychom vyřešili problém, že první log nemá PID procesu, potřebujete druhou deklaraci parseru, subparser. V ostatních logech je PID procesu uzavřen v hranatých závorkách ([ ]
).
Vytvořte deklaraci nazvanou 15_parser_process.yaml
. Abychom zohlednili rozdíly v logech, vytvořte dvě "cesty" nebo "větve", které parser může použít. První větev bude analyzovat PROCESS.NAME
, PROCESS.PID
a :
. Druhá větev bude analyzovat pouze PROCESS.NAME
.
Proč potřebuji dvě větve?
U třech logů je PID procesu uzavřen v hranatých závorkách ([ ]
). Proto začíná výraz, který izoluje PID, analýzu na hranaté závorce [
. Avšak v prvním logu pole PID není přítomno. Pokud se pokusíte analyzovat první log pomocí stejného výrazu, parser se pokusí najít hranatou závorku v tomto logu a bude pokračovat v hledání, bez ohledu na to, že znak [
není v hlavičce přítomen.
Výsledkem by bylo, že cokoli, co je uvnitř hranatých závorek, je analyzováno jako PID
, což by v tomto případě bylo nesmyslné a narušilo by zbytek procesu analýzy pro tento log.
Druhá deklarace:
---
define:
type: parsec/parser
field: PROCESS
parse:
!PARSE.KVLIST
- !TRY
- !PARSE.KVLIST
- PROCESS.NAME: !PARSE.UNTIL '['
- PROCESS.PID: !PARSE.UNTIL ']'
- !PARSE.KVLIST
- PROCESS.NAME: !PARSE.CHARS
Abychom toho dosáhli, vytvořte dvě malé parsery pod kombinátorem !PARSE.KVLIST
pomocí výrazu !TRY
.
Výraz !TRY
Výraz !TRY
vám umožňuje zanořit seznam výrazů pod ním. !TRY
začíná tím, že se pokusí použít první výraz, a pokud je tento první výraz nepoužitelný pro log, proces pokračuje druhým zanořeným výrazem, a tak dále, dokud nebude úspěšný.
Pod výrazem !TRY
:
První větev:
1. Výraz analyzuje PROCESS.NAME
a PROCESS.PID
, očekávající, že hranaté závorky [
a ]
budou přítomny v události. Po jejich analýze také analyzuje znak :
.
2. Pokud log neobsahuje znak [
, výraz !PARSE.UNTIL '['
selže, a v tomto případě selže celá !PARSE.KVLIST
v první větvi.
Druhá větev:
3. Výraz !TRY
bude pokračovat dalším parserem, který nevyžaduje, aby znak [
byl přítomen v události. Jednoduše analyzuje vše před :
a zastaví se po něm.
4. Pokud tento druhý výraz selže, log jde do OTHERS.
2. Analýza zprávy¶
Znovu zvažte události:
``` <181>2023:01:12-13:08:45 asgmtx httpd: 212.158.149.81 - - [12/Jan/2023:13:08:45 +0100] "POST /webadmin.plx HTTP/1.