拡張文書のテンプレート
ここに示す拡張文書の例では、特定のタイプの Cisco FWSM を構文解析し、誤ったイベント名でイベントが送信されないようにする方法を示します。
例として、以下のように session という単語がイベント名の中間に埋め込まれており、その単語を解決する場合を考えます。
Nov 17 09:28:26 192.0.2.1 %FWSM-session-0-302015: Built UDP connection for faddr <IP_address1>/80 gaddr <IP_address2>/31696 laddr <IP_address3>/2157 duration 0:00:00 bytes 57498 (TCP FINs)この状態では DSM がイベントをまったく認識せず、すべてのイベントが構文解析されずに汎用ロガーに関連付けられてしまいます。
QID の検索にはテキスト・ストリングの一部 (302015) しか使用しませんが、イベントが Cisco
FWSM から送信されたことはテキスト・ストリング全体 (%FWSM-session-0-302015) で示されています。 テキスト・ストリング全体では有効にならないため、DSM はイベントが有効でないと見なします。
特定のイベント・タイプを構文解析するための拡張文書の例
FWSM デバイスには多くのイベント・タイプがあり、多くが固有の形式を持っています。 以下の拡張文書の例では、特定のイベント・タイプを構文解析する方法を示します。
SourceIp フィールドおよび SourceIpPreNAT フィールドにまったく同じパターンを使用できます。 ただし、すべての FWSM イベントにこの状況が当てはまるとは限りません。<?xml version="1.0" encoding="UTF-8"?>
<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>
<match-group order="1" description="FWSM Test" device-type-id-override="6" xmlns="">
<matcher field="EventName" order="1" pattern-id="EventNameFWSM_Pattern" capture-group="1"/>
<matcher field="SourceIp" order="1" pattern-id="SourceIp_Pattern" capture-group="1" />
<matcher field="SourcePort" order="1" pattern-id="SourcePort_Pattern" capture-group="2"/>
<matcher field="SourceIpPreNAT" order="1" pattern-id="SourceIpPreNAT_Pattern" capture-group="1" />
<matcher field="SourceIpPostNAT" order="1" pattern-id="SourceIpPostNAT_Pattern" capture-group="1" />
<matcher field="SourcePortPreNAT" order="1" pattern-id="SourcePortPreNAT_Pattern" capture-group="2" />
<matcher field="SourcePortPostNAT" order="1" pattern-id="SourcePortPostNAT_Pattern" capture-group="2" />
<matcher field="DestinationIp" order="1" pattern-id="DestinationIp_Pattern" capture-group="1" />
<matcher field="DestinationPort" order="1" pattern-id="DestinationIp_Pattern" capture-group="2" />
<matcher field="Protocol" order="1" pattern-id="Protocol_Pattern" capture-group="1" />
<matcher field="Protocol" order="2" pattern-id="Protocol_6_Pattern" capture-group="TCP" enable-substitutions=true/>
<event-match-multiple pattern-id="EventNameId" capture-group-index="1" device-event-category="Cisco Firewall"/>
</match-group>
</device-extension> <?xml version="1.0" encoding="UTF-8"?>
<device-extension xmlns="event_parsing/device_extension">
<!-- Do not remove the "allEventNames" value -->
<pattern id="EventName-Fakeware_Pattern" xmlns=""><![CDATA[]]></pattern>
<pattern id="SourceIp-Fakeware_Pattern" xmlns=""><![CDATA[]]</pattern>
<pattern id="SourcePort-Fakeware_Pattern" xmlns=""><![CDATA[]]></pattern>
<pattern id="SourceMAC-Fakeware_Pattern" xmlns=""><![CDATA[]]></pattern>
<pattern id="DestinationIp-Fakeware_Pattern" xmlns=""><![CDATA[]]></pattern>
<pattern id="DestinationPort-Fakeware_Pattern" case-insensitive="true" xmlns=""><![CDATA[]]></pattern>
<pattern id="Protocol-Fakeware_Pattern" case-insensitive="true" xmlns=""><![CDATA[]]></pattern>
<match-group order="1" description="FWSM Test" device-type-id-override="6" xmlns="">
<matcher field="EventName" order="1" pattern-id="EventName-Fakeware_Pattern" capture-group="1"/>
<matcher field="SourceIp" order="1" pattern-id="SourceIp-Fakeware_Pattern" capture-group="1" />
<matcher field="SourcePort" order="1" pattern-id="SourcePort-Fakeware_Pattern" capture-group="1"/>
<matcher field="SourceMAC" order="1" pattern-id="SourceMAC-Fakeware_Pattern" capture-group="1" />
<matcher field="DestinationIp" order="1" pattern-id="DestinationIp-Fakeware_Pattern" capture-group="1" />
<matcher field="DestinationPort" order="1" pattern-id="SDestinationPort-Fakeware_Pattern" capture-group="1" />
<matcher field="Protocol" order="1" pattern-id="Protocol-Fakeware_Pattern" capture-group="1" />
<event-match-multiple pattern-id="EventNameId" capture-group-index="1" device-event-category="Cisco Firewall"/>
</match-group>
</device-extension> 構文解析の基礎
前記の拡張文書の例では、構文解析の基本的な側面のうち、以下のものを示しました。
- IP アドレス
- ポート
- プロトコル
- グループが異なるが同じパターンを使用する複数のフィールド
この例では、指定したパターンに従うすべての FWSM イベントを構文解析します。 イベントの内容が異なる場合は、構文解析対象のフィールドがそのイベントに存在しない場合があります。
イベントで使用できなかった、この構成を作成するために必要であった情報は以下のとおりです。
- イベント名は、イベントの
%FWSM-session-0-302015部分の末尾 6 桁 (302015) のみです。 - FWSM には、ハードコーディングされたデバイス・イベント・カテゴリー
Cisco Firewallがあります。 - FWSM DSM は Cisco Pix
QIDmap を使用するため、比較グループで
device-type-id-override="6"というパラメーターを指定しています。 Pix ファイアウォール・ログ・ソース・タイプの ID は 6 です。
イベント名とデバイス・イベント・カテゴリー
QIDmap の検索時には、イベント名とデバイス・イベント・カテゴリーが必要です。 このデバイス・イベント・カテゴリーはデータベース内のグループ化パラメーターであり、デバイス内の類似イベントの定義に役立ちます。 比較グループの末尾にある event-match-multiple ではカテゴリーをハードコーディングしています。 event-match-multiple は、構文解析したイベント名に対して EventNameId パターンを使用して 6 桁までの比較を行います。 このパターンは、ペイロード全体に対してではなく、EventName フィールドとして構文解析された部分のみに対して実行されます。
EventName パターンはイベントの %FWSM 部分を参照します (すべての Cisco
FWSM イベントに %FWSM 部分が含まれています)。 例に示したパターンは、%FWSM の後に任意の数 (0 個以上) の英字およびダッシュが続いたものに一致します。 このパターン・マッチングにより、イベント名の中間に埋め込まれた単語 session を削除する必要がある点が解決されます。 イベント重大度 (Cisco による) の後にダッシュ、 QRadarによって予期される真のイベント名が続きます。 (\d{6}) 文字列は、 EventNameFWSM パターンの中でキャプチャグループを持つ唯一の文字列です。
イベントの IP アドレスとポートはすべて同じ基本パターンに従っており、IP アドレスの後にコロンとポート番号が続きます。 このパターンは、データの 2 つの部分 (IP アドレスとポート) を構文解析し、matcher セクションで異なるキャプチャー・グループを指定しています。
<device-extension>
<pattern id="EventName1">(logger):</pattern>
<pattern id="DeviceTime1">time=\[(\d{2}/\w{3}/\d{4}:\d{2}:\d{2}:\d{2})\] </pattern>
<pattern id="Username">(TLSv1)</pattern>
<match-group order="1" description="Full Test">
<matcher field="EventName" order="1" pattern-id="EventName1" capture-group="1"/>
<matcher field="DeviceTime" order="1" pattern-id="DeviceTime1"
capture-group="1" ext-data="dd/MMM/YYYY:hh:mm:ss"/>
<matcher field="UserName" order="1" pattern-id="Username" capture-group="1"/>
</match-group>
</device-extension> IP アドレスとポートのパターン
IP アドレスとポートのパターンは、1 桁から 3 桁の数値 4 組をピリオドで区切ったものの後に、コロンとポート番号を続けたものです。 IP アドレスの部分は 1 つのグループになっています。ポート番号も同様ですが、コロンは異なります。 これらのフィールドに対する matcher セクションは同じパターン名を参照していますが、別のキャプチャー・グループを参照しています (IP アドレスはグループ 1 であり、ポートはグループ 2 です)。
プロトコルは共通のパターンであり、ペイロードで TCP、UDP、ICMP、または GRE のうち最初のものを検索します。 パターンには大文字と小文字を区別しないパラメーターを指定しているため、すべての場合に一致します。
例で使用しているイベントに 2 番目のプロトコル・パターンは出現しませんが、順序を 2 として 2 番目のプロトコル・パターンを定義しています。 順序の値が最も小さいプロトコル・パターンが一致しない場合は、次のパターンが適用されます (以後同様)。 2 番目のプロトコル・パターンには直接置換も示しています。このパターンに比較グループはありませんが、enable-substitutions パラメーターが有効であるため、protocol=6 の代わりにテキスト TCP を使用できます。