Construction de motifs d'expression régulière

Pour créer une extension de source de journal, vous utilisez des expressions régulières (regex) pour correspondre à des chaînes de texte provenant de la source de journal non prise en charge.

A propos de cette tâche

L'exemple suivant montre une entrée de journal référencée dans les étapes.

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 

Procédure

  1. Analysez visuellement la source de journal non prise en charge pour identifier des motifs uniques.

    Ces motifs sont ensuite traduits en expressions régulières.

  2. Recherchez les chaînes de texte à faire correspondre.
    Astuce: Pour fournir une vérification de base des erreurs, incluez des caractères avant et après les valeurs afin d'éviter que des valeurs similaires ne soient involontairement mises en correspondance. Vous pouvez ensuite isoler la valeur réelle des caractères supplémentaires.
  3. Développez le pseudo-code pour les motifs correspondants et incluez le caractère d'espace pour indiquer le début et la fin d'un motif.

    Vous pouvez ignorer les guillemets. Dans l'exemple d'entrée de journal, les noms d'événements sont DROP, PASS, et REJECT. La liste suivante montre les champs d'événement utilisables.

    • EventName: " kernel: VALUE "
    • SourceMAC: " MAC=VALUE "
    • SourceIp: " SRC=VALUE "
    • DestinationIp: " DST=VALUE "
    • Protocol: " PROTO=VALUE "
    • SourcePort: " SPT=VALUE "
    • DestinationPort: " DPT=VALUE "
  4. Remplacer un espace par l'expression régulière \s .

    Vous devez utiliser un caractère d'échappement pour les caractères non numériques ou non alphabétiques. Par exemple, = devient \= et : devient \:.

  5. Transmettre le pseudo-code à une expression régulière.
    Tableau 1. Conversion du pseudo-code en expressions régulières
    Zone Pseudo-code Expression régulière

    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

    Protocole

    " 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. Indiquez des groupes de capture.

    Un groupe de capture isole une certaine valeur dans l'expression régulière.

    Par exemple, dans le motif SourcePort dans l'exemple précédent, vous ne pouvez pas transmettre toute la valeur car elle comprend des espaces et SRC=<code>. Au lieu de cela, vous spécifiez uniquement le numéro de port en utilisant un groupe de capture. La valeur du groupe de capture est celle qui est transmise à la zone appropriée dans IBM QRadar.

    Insérez les parenthèses autour des valeurs que vous souhaitez capturer :

    Tableau 2. Mappage d'expressions régulières pour capturer des groupes pour les champs d'événements
    Zone Expression régulière Groupe de capture

    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 destination

    \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

    Protocole

    \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. Migrez les motifs et les groupes de capture dans le document d'extensions de source de journal.

    Le fragment de code suivant montre une partie du document que vous utilisez.

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