Para criar uma extensão de origem de log, use expressões regulares (regex) para corresponder
sequências de texto da origem de log não suportada.
O exemplo a seguir mostra uma entrada de log referenciada nas etapas.
May 20 17:24:59 kernel: DROP MAC=<MAC_address>
SRC=<Source_IP_address> DST=<Destination_IP_address> LEN=351 TOS=0x00 PREC=0x00 TTL=64 ID=9582
PROTO=UDP SPT=67 DPT=68 LEN=331
May 20 17:24:59 kernel: PASS MAC=<MAC_address>
SRC=<Source_IP_address> DST=<Destination_IP_address> LEN=351 TOS=0x00 PREC=0x00 TTL=64
ID=9583 PROTO=TCP SPT=1057 DPT=80 LEN=331
May 20 17:24:59 kernel: REJECT
MAC=<MAC_address> SRC=<Source_IP_address> DST=<Destination_IP_address> LEN=351
TOS=0x00 PREC=0x00 TTL=64 ID=9584 PROTO=TCP SPT=25212 DPT=6881 LEN=331
-
Analise visualmente a origem de log não suportada para identificar padrões exclusivos.
Esses padrões serão, mais tarde, convertidos em expressões regulares.
-
Localize as sequências de texto a serem correspondidas.
Dica: Para fornecer verificação básica de erro, inclua caracteres antes e depois dos valores para
evitar que valores semelhantes sejam correspondidos sem querer. Posteriormente, é possível isolar o valor real
dos caracteres extras.
-
Desenvolva pseudocódigo para padrões de correspondência e inclua o caractere de espaço para denotar o
início e o término de um padrão.
É possível ignorar as aspas. No exemplo de entrada de log, os nomes dos eventos são DROP, PASS e REJECT.
A lista a seguir mostra os campos de evento utilizáveis.
- EventName: " kernel: VALUE "
- SourceMAC: " MAC=VALUE "
- SourceIp: " SRC=VALUE "
- DestinationIp: " DST=VALUE "
- Protocol: " PROTO=VALUE "
- SourcePort: " SPT=VALUE "
- DestinationPort: " DPT=VALUE "
-
Substitua um espaço pela expressão regular
\s.
Deve-se usar um caractere de escape para caracteres que não forem dígitos ou alfanuméricos. Por exemplo, = torna-se
\= e : torna-se \:.
-
Converta o pseudo-código em uma expressão regular.
Tabela 1. Convertendo pseudocódigo em expressões regulares
| Campo |
Pseudocódigo |
Expressão regular |
|
EventName
|
" kernel: VALUE
"
|
\skernel\:\s.*?\s
|
|
SourceMAC
|
" MAC=VALUE "
|
\sMAC\=(?:[0-9a-fA-F]{2}\:){5}[0-9a-fA-F]{2}\s
|
|
SourceIP
|
" SRC=VALUE "
|
\sSRC\=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s
|
|
DestinationIp
|
" DST=VALUE "
|
\sDST\=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s
|
|
Protocolo
|
" PROTO=VALUE "
|
\sPROTO\=(TCP|UDP|ICMP|GRE)\s
|
|
SourcePort
|
" SPT=VALUE "
|
\sSPT\=\d{1,5}\s
|
|
DestinationPort
|
" DPT=VALUE "
|
\sDPT\=\d{1,5}\s
|
-
Especifique grupos de captura.
Um grupo de captura isola um determinado valor na expressão regular.
Por exemplo, no padrão SourcePort no exemplo anterior, não é possível passar o valor inteiro,
uma vez que ele inclui espaços e SRC=<code>. Em vez disso, especifique somente o número da
porta usando um grupo de captura. O valor no grupo de captura é o que é passado para o campo
relevante no IBM®
QRadar.
Insira parêntese ao redor dos valores que deseja capturar:
Tabela 2. Mapeando expressões regulares para capturar grupos para campos de evento
| Campo |
Expressão regular |
Grupo de captura |
|
EventName
|
\skernel\:\s.*?\s
|
\skernel\:\s(.*?)\s
|
|
SourceMAC
|
\sMAC\=(?:[0-9a-fA- F]{2}\:){5}[0-9a-fA-F]{2}\s
|
\sMAC\=((?:[0-9a-fA- F]{2}\:){5}[0-9a-fA-F]{2})\s
|
|
SourceIP
|
\sSRC\=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s
|
\sSRC\=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s
|
|
Destination IP
|
\sDST\=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s
|
\sDST\=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\s
|
|
Protocolo
|
\sPROTO\=(TCP|UDP|ICMP|GRE)\s
|
\sPROTO\=((TCP|UDP|ICMP|GRE))\s
|
|
SourcePort
|
\sSPT\=\d{1,5}\s
|
\sSPT\=(\d{1,5})\s
|
|
DestinationPort
|
\sDPT\=\d{1,5}\s
|
\sDPT\=(\d{1,5})\s
|
-
Migre os padrões e os grupos de captura para o documento de extensões de origem de log.
O fragmento de código a seguir mostra parte do documento usado.
<device-extension xmlns="event_parsing/device_extension">
<pattern id="EventNameFWSM_Pattern" xmlns=""><![CDATA[%FWSM[a-zA-Z\-]*\d-(\d{1,6})]]></pattern>
<pattern id="SourceIp_Pattern" xmlns=""><![CDATA[gaddr (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/([\d]{1,5})]]></pattern>
<pattern id="SourceIpPreNAT_Pattern" xmlns=""><![CDATA[gaddr (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/([\d]{1,5})]]></pattern>
<pattern id="SourceIpPostNAT_Pattern" xmlns=""><![CDATA[laddr (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/([\d]{1,5})]]></pattern>
<pattern id="DestinationIp_Pattern" xmlns=""><![CDATA[faddr (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/([\d]{1,5})]]></pattern>
<pattern id="Protocol_Pattern" case-insensitive="true" xmlns=""><![CDATA[(TCP|UDP|ICMP|GRE)]]></pattern>
<pattern id="Protocol_6_Pattern" case-insensitive="true" xmlns=""><![CDATA[protocol=6]]></pattern>
<pattern id="EventNameId_Pattern" xmlns=""><![CDATA[(\d{1,6})]]></pattern>