Návod na analýzu
Kompletní proces analýzy vyžaduje deklarace analyzátoru, mapování a obohacovače. Tento návod rozděluje tvorbu deklarací krok za krokem. Pro více informací o microservisu Parsec navštivte dokumentaci LogMan.io Parsec.
Než začnete
SP-Lang
Deklarace analýzy jsou psány v TeskaLabs SP-Lang. Pro více podrobností o analytických výrazech navštivte dokumentaci SP-Lang.
Deklarace
Pro více informací o specifických typech deklarací, viz:
Vzorové logy
Tento příklad používá tuto sadu logů sesbíraný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"
Logy mohou být obvykle rozděleny do dvou částí: hlavička a tělo. Hlavička je vše před prvním dvojtečkou 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í pojmenování je důležité. V rámci každé deklarace, proces analýzy následuje pořadí, ve kterém jste zapsali výrazy jako kroky.
Sekvence analýzy může zahrnovat více deklarací analyzátoru, a také vyžaduje deklaraci mapování a deklaraci obohacovače. V tomto případě vytvořte tyto deklarace:
- První deklarace analyzátoru: Analyzujte hlavičky syslog
- Druhá deklarace analyzátoru: Analyzujte tělo logů jako zprávu.
- Deklarace mapování: Přejmenujte pole
- Deklarace obohacovače: Přidejte metadata (například název datové sady) a vypočítejte syslog facility a seriousness z priority
Dle naming conventions, nazvěte 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ě rostoucím číselným prefixem. Používejte prefixy jako 10, 20, 30, atd., aby bylo možné přidat novou deklaraci mezi existující později bez přejmenování všech souborů.
1. Analýza hlavičky
Toto je první deklarace analyzátoru. Následující sekce rozebírají a vysvětlují každou část deklarace.
---
define:
type: parser/parsec
parse:
!PARSE.KVLIST
# Část PRI
- '<'
- PRI: !PARSE.DIGITS
- '>'
# Časové razítko
- TIMESTAMP: !PARSE.DATETIME
- year: !PARSE.DIGITS # year: 2023
- ':'
- month: !PARSE.MONTH { what: 'number' } # month: 01
- ':'
- day: !PARSE.DIGITS # day: 12
- '-'
- hour: !PARSE.DIGITS # hour: 13
- ':'
- minute: !PARSE.DIGITS # minute: 08
- ':'
- second: !PARSE.DIGITS # second: 45
- !PARSE.UNTIL ' '
# Hostname a proces
- HOSTNAME: !PARSE.UNTIL ' ' # asgmtx
- PROCESS: !PARSE.UNTIL ':'
# Zpráva
- !PARSE.SPACES
- MESSAGE: !PARSE.CHARS
Hlavičky logu
Hlavička syslog je ve formátu:
<PRI>TIMESTAMP HOSTNAME PROCESS.NAME[PROCESS.PID]:
Důležité: Variabilita logů
Všimněte si, že PROCESS.PID
ve čtvercových závorkách není přítomen v hlavičce prvního logu. Aby parser mohl zvládnout tuto rozdílnost, bude zapotřebí způsob, jak zvládnout možnost, že PROCESS.PID
může být přítomen nebo nepřítomen. Tento problém bude řešen později v návodu.
Analýza PRI
Nejprve analyzujte PRI, což je uzavřeno mezi znaky <
a >
, bez mezery mezi nimi.
Jak analyzovat <PRI>
, jak je uvedeno v první deklaraci analyzátoru:
!PARSE.KVLIST
- !PARSE.EXACTLY { what: '<' }
- PRI: !PARSE.DIGITS
- !PARSE.EXACTLY { what: '>' }
Použité výrazy:
!PARSE.EXACTLY
: Analýza znaků<
a>
!PARSE.DIGITS
: Analýza čísel (čísel) PRI
!PARSE.EXACTLY
zkratka
Výraz !PARSE.EXACTLY
má syntaktickou zkratku, protože se často používá. Místo zahrnutí celého výrazu, PARSE.EXACTLY { what: '(znak)' }
může být zkráceno na '(znak')
.
Takže výše uvedená deklarace analyzátoru 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 to uvedeno v první deklaraci analyzátoru:
# 2023:01:12-13:08:45
- TIMESTAMP: !PARSE.DATETIME
- year: !PARSE.DIGITS # year: 2023
- ':'
- month: !PARSE.MONTH { what: 'number' } # month: 01
- ':'
- day: !PARSE.DIGITS # day: 12
- '-'
- hour: !PARSE.DIGITS # hour: 13
- ':'
- minute: !PARSE.DIGITS # minute: 08
- ':'
- second: !PARSE.DIGITS # second: 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žit v tomto případě) přijímá čísla 01-12'short'
pro zkrácené názvy měsíců (JAN, FEB, atd.)'full'
pro plné názvy měsíců (JANUARY, FEBRUARY, atd.)
Analýza mezery:
Mezera na konci časového razítka také musí být analyzována. Použitím výrazu !PARSE.UNTIL
se 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 bodě je analyzována sekvence znaků <181>2023:01:12-13:08:45
(včetně mezery na konci).
Analýza hostname a procesu
Dále analyzujte hostname a proces: asgmtx sshd[17112]:
.
Pamatujte, že hlavička prvního logu se liší od ostatních. Pro řešení, které zohledňuje tuto rozdílnost, vytvořte deklaraci analyzátoru a poddeklaraci analyzátoru.
Jak je to uvedeno v první deklaraci analyzátoru:
# Hostname a proces
- HOSTNAME: !PARSE.UNTIL ' ' # asgmtx
- PROCESS: !PARSE.UNTIL ':'
# Zpráva
- !PARSE.SPACES
- MESSAGE: !PARSE.CHARS
- Analyzujte hostname: Pro analýzu hostname, použijte výraz
!PARSE.UNTIL
k analýze všeho až po zadaný znak uvnitř' '
, což je v tomto případě mezera, a zastavuje po tomto znaku, aniž by tento znak zahrnul do výstupu. - Analyzujte proces: Použijte
!PARSE.UNTIL
znovu pro analýzu do:
. Po dvojtečce ('
), je hlavička analyzována. - Analyzujte zprávu: V této deklaraci použijte
!PARSE.SPACES
k analýze všech mezer mezi hlavičkou a zprávou. Poté ukládejte zbytek události do poleMESSAGE
pomocí výrazu!PARSE.CHARS
, který v tomto případě analyzuje všechny zbylé znaky v logu. Použijte další deklarace k analýze částí zprávy.
1.5. Analýza pro variabilitu logu
Pro řešení problému, že první log nemá process PID, potřebujete druhou deklaraci analyzátoru, poddeklaraci. V ostatních logách je process PID uzavřen do čtvercových závorek ([ ]
).
Vytvořte deklaraci nazvanou 15_parser_process.yaml
. Abyste zohlednili rozdíly v logách, vytvořte dva "cesty" nebo "větve", které může parser použít. První větev bude analyzovat PROCESS.NAME
, PROCESS.PID
a :
. Druhá větev bude analyzovat pouze PROCESS.NAME
.
Proč potřebujeme dvě větve?
U tří logů je process PID uzavřen ve čtvercových závorkách ([ ]
). Proto analýza, která izoluje PID, začíná analyzací znaku ve čtvercové závorce [
. Nicméně, 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 čtvercovou závorku v tomto logu a bude pokračovat v hledání, i když znak [
není přítomen v hlavičce.
Výsledkem by bylo, že cokoliv uvnitř čtvercových závorek je analyzováno jako PID
, což by v tomto případě nemělo smysl a narušilo by zbytek procesu analýzy pro tento log.
Druhá deklarace:
---
define:
type: parser/parsec
field: PROCESS
error: continue
parse:
!PARSE.KVLIST
- !TRY
- !PARSE.KVLIST
- PROCESS.NAME: !PARSE.UNTIL '['
- PROCESS.PID: !PARSE.UNTIL ']'
- !PARSE.KVLIST
- PROCESS.NAME: !PARSE.CHARS
K dosažení tohoto účelu, vytvořte dva malé parsovací bloky pod kombinátorem !PARSE.KVLIST
pomocí výrazu !TRY
.
Výraz !TRY
Výraz !TRY
umožňuje vnořit seznam výrazů pod něj. !TRY
začíná pokusem použít první výraz a pokud tento první výraz není použitelný pro log, proces pokračuje s dalším vnořeným výrazem, a tak dále, dokud nějaký výraz neuspěje.
Pod výrazem !TRY
:
První větev:
1. Výraz analyzuje PROCESS.NAME
a PROCESS.PID
, očekává čtvercové závorky [
a ]
přítomné v události. Po analyzování těchto znaků, také analyzuje znak :
.
2. Pokud log neobsahuje znak [
, výraz !PARSE.UNTIL '['
selže, a v tom případě celý výraz !PARSE.KVLIST
v první větvi selže.
Druhá větev:
3. Výraz !TRY
bude pokračovat s dalším parserem, který nevyžaduje, aby znak [
byl přítomen v události. Jednoduše analyzuje všechno před :
a zastaví se po něm.
4. Pokud tento druhý výraz selže, log přechází do OTHERS.
2. Analýza zprávy
Zvažte znovu 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.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[