Um eine Protokollquellenerweiterung zu erstellen, verwenden Sie reguläre Ausdrücke (Regex), um Textzeichenfolgen aus der nicht unterstützten Protokollquelle abzugleichen.
Informationen zu dieser Task
Das folgende Beispiel zeigt einen Protokolleintrag, auf den in den Schritten verwiesen wird.
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
Vorgehensweise
- Analysieren Sie die nicht unterstützte Protokollquelle visuell, um eindeutige Muster zu ermitteln.
Diese Muster werden später in reguläre Ausdrücke umgesetzt.
- Suchen Sie nach den Textzeichenfolgen, die abgeglichen werden sollen.
Tipp: Um eine grundlegende Fehlerprüfung bereitzustellen, schließen Sie Zeichen vor und nach den Werten ein, um zu verhindern, dass ähnliche Werte unbeabsichtigt abgeglichen werden. Sie können den tatsächlichen Wert später von den zusätzlichen Zeichen isolieren.
- Entwickeln Sie Pseudocode für übereinstimmende Muster und fügen Sie das Leerzeichen ein, um den Anfang und das Ende eines Musters zu kennzeichnen.
Sie können die Anführungszeichen ignorieren. Im Beispielprotokolleintrag lauten die Ereignisnamen DROP, PASS und REJECT. Die folgende Liste enthält die verwendbaren Ereignisfelder.
- EventName: "Kernel: WERT"
- SourceMAC: "MAC=WERT"
- SourceIp: "SRC=VALUE"
- DestinationIp: "DST=VALUE"
- Protokoll: " PROTO=WERT "
- SourcePort: " SPT=WERT "
- DestinationPort: "DPT=VALUE"
- Ersetzen Sie ein Leerzeichen durch den regulären Ausdruck
\s .
Sie müssen ein Escapezeichen für Nicht-Ziffern-oder Nicht-Alpha-Zeichen verwenden. Beispiel: = wird zu \= und: wird zu \:.
- Übersetzen Sie den Pseudocode in einen regulären Ausdruck.
Tabelle 1. Umsetzen von Pseudocode in reguläre Ausdrücke
| Feld |
Pseudocode |
Regulärer Ausdruck |
EventName
|
" Kernel: VALUE
"
|
\skernel \:\s. * ?\s
|
SourceMAC
|
" MAC=WERT "
|
\sMAC\=(?:[0-9a-fA-F]{2}\:){5}[0-9a-fA-F]{2}\s
|
SourceIP
|
" SRC=WERT "
|
\sSRC\=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s
|
DestinationIp
|
" DST = WERT "
|
\sDST\=\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\s
|
Protokoll
|
" PROTO=WERT "
|
\sPROTO\=(TCP|UDP|ICMP|GRE)\s
|
SourcePort
|
" SPT = WERT "
|
\sSPT\=\d{1,5}\s
|
DestinationPort
|
" DPT = WERT "
|
\sDPT\=\d{1,5}\s
|
- Erfassungsgruppen angeben.
Eine Erfassungsgruppe isoliert einen bestimmten Wert im regulären Ausdruck.
Im Muster SourcePort im vorherigen Beispiel können Sie beispielsweise nicht den gesamten Wert übergeben, da er Leerzeichen und SRC=<code>enthält. Stattdessen geben Sie nur die Portnummer mithilfe einer Erfassungsgruppe an. Der Wert in der Erfassungsgruppe wird an das relevante Feld in IBM
QRadarübergeben.
Fügen Sie runde Klammern um die Werte ein, die Sie erfassen möchten:
Tabelle 2. Zuordnen regulärer Ausdrücke zu Erfassungsgruppen für Ereignisfelder
| Feld |
Regulärer Ausdruck |
Erfassungsgruppe |
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
|
Ziel-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
|
Protokoll
|
\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
|
- Migrieren Sie die Muster und Erfassungsgruppen in das Erweiterungsdokument für Protokollquellen.
Das folgende Code-Snippet zeigt einen Teil des von Ihnen verwendeten Dokuments.
<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>