Crear patrones de expresión regular

Para crear una extensión de origen de registro, utilice expresiones regulares (regex) para comparar series de texto del origen de registro no soportado.

Acerca de esta tarea

El ejemplo siguiente muestra una entrada de registro a la que se hace referencia en los pasos.

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 

Procedimiento

  1. Analice visualmente el origen de registro no soportado para identificar patrones exclusivos.

    Estos patrones se convierten posteriormente en expresiones regulares.

  2. Busque las series de texto que deben coincidir.
    Sugerencia: Para proporcionar una comprobación de errores básica, incluya caracteres antes y después de los valores para evitar que valores similares coincidan de forma no intencionada. Posteriormente puede aislar el valor real de los caracteres adicionales.
  3. Desarrolle pseudocódigo para la coincidencia de patrones e incluya el carácter de espacio para indicar el principio y el final de un patrón.

    Puede ignorar las comillas. En la entrada de registro de ejemplo, los nombres de suceso son DROP, CORRECTOS y REJECT. La lista siguiente muestra los campos de sucesos utilizables.

    • EventName: " kernel: VALUE "
    • SourceMAC: " MAC=VALUE "
    • SourceIp: " SRC=VALUE "
    • DestinationIp: " DST=VALUE "
    • Protocol: " PROTO=VALUE "
    • SourcePort: " SPT=VALUE "
    • DestinationPort: " DPT=VALUE "
  4. Sustituya un espacio por la expresión regular \s .

    Debe utilizar un carácter de escape para los caracteres que no sean dígitos o alfanuméricos. Por ejemplo, = se convierte en \= y : se convierte en \:.

  5. Convierta el pseudo-código en una expresión regular.
    Tabla 1. Conversión de pseudocódigo a expresiones regulares
    Campo Pseudocódigo Expresión 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.

    Un grupo de captura aísla un valor determinado en la expresión regular.

    Por ejemplo, en el patrón SourcePort del ejemplo anterior, no puede pasar el valor completo, ya que éste incluye espacios y SRC=<code>. En lugar de ello, especifique sólo el número de puerto utilizando un grupo de captura. El valor del grupo de captura es lo que se pasa al campo relevante en IBM QRadar.

    Inserte paréntesis alrededor de los valores que desee capturar:

    Tabla 2. Correlación de expresiones regulares con grupos de captura para campos de suceso
    Campo Expresión 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 los patrones y grupos de captura al documento de extensiones de origen de registro.

    El fragmento de código siguiente muestra parte del documento que se utiliza.

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