Construindo padrões de expressão regular

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.

Sobre esta tarefa

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 

Procedimento

  1. 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.

  2. Localize as sequências de texto a serem correspondidas.
    Dica: Para fornecer verificação de erro básica, inclua caracteres antes e depois dos valores para evitar que valores semelhantes sejam incompatíveis intencionalmente. Posteriormente, é possível isolar o valor real dos caracteres extras.
  3. 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 "
  4. Substituir um espaço com a 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 \:.

  5. 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

  6. 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 é transmitido ao campo relevante em 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

    IP de destino

    \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

  7. 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>