正規表現パターンの作成

ログ・ソース拡張を作成するには、正規表現を使用して、サポートされていないログ・ソースからのテキスト・ストリングと比較します。

以下の例に、参照するログ項目をステップに分けて示します。

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: " kernel: VALUE "
    • SourceMAC: " MAC=VALUE "
    • SourceIp: " SRC=VALUE "
    • DestinationIp: " DST=VALUE "
    • Protocol: " PROTO=VALUE "
    • SourcePort: " SPT=VALUE "
    • DestinationPort: " DPT=VALUE "
  4. スペースは ¥s という正規表現で置き換えてください。

    英数字以外の文字には必ずエスケープ文字を使用してください。例えば = は ¥= とし、: は ¥: とします。

  5. 疑似コードを正規表現に変換します。
    表 1. 疑似コードから正規表現への変換
    フィールド 疑似コード 正規表現

    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

    Protocol

    " 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. キャプチャー・グループを指定します。

    キャプチャー・グループは、正規表現の中の特定の値を分離します。

    例えば、前記の例に示した SourcePort パターンでは、スペースおよび SRC=<code> を含んでいるため、値全体を渡すことができません。代わりに、キャプチャー・グループを使用してポート番号のみを指定します。キャプチャー・グループの値は、IBM® QRadar® の関連フィールドに渡される値です。

    以下のように、取り込む値の前後に小括弧を挿入します。

    表 2. 正規表現からイベント・フィールドのキャプチャー・グループへのマッピング
    フィールド 正規表現 キャプチャー・グループ

    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

    Protocol

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