构建正则表达式模式

要创建日志源扩展,请使用正则表达式 (regex) 来匹配来自不受支持的日志源的文本字符串。

关于此任务

以下示例显示了步骤中引用的日志条目。

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 

过程

  1. 直观地分析不受支持的日志源以识别唯一模式。

    这些模式稍后将转换为正则表达式。

  2. 查找要匹配的文本字符串。
    提示: 要提供基本错误检查,请在值前后包含字符,以防止意外匹配类似的值。 稍后可以将实际值与额外字符隔离。
  3. 开发用于匹配模式的伪代码,并包含表示模式开始和结束的空格字符。

    您可以忽略引号。 在示例日志条目中,事件名称为 DROP , PASS 和 REJECT。 以下列表显示了可用事件字段。

    • EventName: “内核:价值”
    • SourceMAC: “MAC=VALUE”
    • SourceIp: " SRC=VALUE "
    • DestinationIp: “DST=VALUE”
    • 协议: " PROTO=VALUE "
    • SourcePort: “SPT=VALUE”
    • DestinationPort: “DPT=VALUE”
  4. 将空格替换为 \s 正则表达式。

    必须对非数字或非字母字符使用转义字符。 例如, = 成 \= 和: 成 \:。

  5. 将伪代码转换为正则表达式。
    表 1. 将伪代码转换为正则表达式
    字段 伪代码 正则表达式

    EventName

    " 内核 :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 = 值 "

    \sDST\=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s

    协议

    PROTO=VALUE

    \sPROTO\=(TCP|UDP|ICMP|GRE)\s

    SourcePort

    " SPT = VALUE "

    \sSPT\=\d{1,5}\s

    DestinationPort

    " DPT = 值 "

    \sDPT\=\d{1,5}\s

  6. 指定捕获组。

    捕获组隔离正则表达式中的特定值。

    例如,在上一个示例中的 SourcePort 模式中,无法传递整个值,因为它包含空格和 SRC=<code>。 而是通过使用捕获组来仅指定端口号。 捕获组中的值是传递到 IBM QRadar中相关字段的值。

    在要捕获的值周围插入括号:

    表 2. 映射正则表达式以捕获事件字段的组
    字段 正则表达式 捕获组

    EventName

    \skernel \:\s. *? \s

    \skernel \:\s (. *?) \s

    SourceMAC

    \sMAC\=(?:[0-9a-fA- F] \:) [ ] \s {2}{5}0-9a-fA-F{2}

    \sMAC\=((?:[0-9a-fA- F] \:) [ ] )\s {2}{5}0-9a-fA-F{2}

    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

    \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

    协议

    \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. 将模式和捕获组迁移到日志源扩展文档中。

    以下代码片段显示了您使用的文档的一部分。

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