正規表現について

2024年4月11日

ID 171632

このセクションでは、正規表現とその使用方法について説明します。

正規表現について

正規表現は、正規化ルールによって処理された受信イベントの解析に使用されます。正規表現は、フィード内のチェック対象の情報、および送信イベントで使用する情報を抽出します。

事前設定済みの正規表現は、検証テストで使用されるイベントの形式に対応します。

検証テストの実行後、場合によっては特定のイベントソースソフトウェアで使用するために新しい正規表現を追加したり、既存の正規表現を変更したりする必要があります。主要なデバイスから発行されたイベントの解析に使用される正規表現の例は、「主要なデバイスに対応する正規表現」セクションを参照してください。

イベントソースの IP アドレスとポート、イベントターゲット、ユーザー名、日付などのデータを抽出するための正規表現を設定することを推奨します。これらの正規表現を使用して送信イベントの形式を定義できます。

正規表現名について

正規表現にはどのような名前も使用できます。ただし、以下は除きます:

  • SourceId
  • MatchedIndicator
  • RecordContext
  • Category
  • ActionableFields
  • Confidence
  • IndicatorInfo
  • EventReceivedDate
  • Retroscan

複合値

concatenate 属性を使用して、イベントから抽出されたデータから複合値を作成するためのルールを設定できます。ルールとは、#N 記号を使用して抽出されたデータのグループを指します。N はグループの番号です(1 から開始)。バックスラッシュ(\)がハッシュ記号(#)の前にある場合、ハッシュ記号はグループの番号には使用されず、番号記号としてのみ扱われます。

次の例のイベントが解析されます:

url_1=http://domain test_event url_2=/page/mypage test

使用された正規表現と例の解析結果を次の表に示します。

正規表現の適用例

Regular expression

解析結果

<RE_URL concatenate="#1#2">url_1=(.*?)\stest_event\surl_2=(.*?)\stest</RE_URL>

http://domain/page/mypage

<RE_URL concatenate="#2#1">url_1=(.*?)\stest_event\surl_2=(.*?)\stest</RE_URL>

/page/mypagehttp://domain

<RE_URL concatenate="#2_/_#1">url_1=(.*?)\stest_event\surl_2=(.*?)\stest</RE_URL>

/page/mypage_/_http://domain

連結ルールを設定していないか concatenate 属性の値が空になっていて、正規表現に複数のグループが含まれている場合、グループの値は正規表現に記載されている順に連結されます。

正規表現より多くのグループが concatenate 属性に含まれている場合、余分な数のグループは無視され、対応する #N テキストに置き換えられます。

解析されているイベント:

url_1=http://domain test_event url_2=/page/my_page test

使用された正規表現:

<RE_URL concatenate="#1#2#3">url_1=(.*?)\stest_event\surl_2=(.*?)\stest</RE_URL>

解析結果:

http://domain/page/my_page#3

複数のマッチング

正規表現を使用してイベントを解析する際、正規表現に一致する値をすべて抽出することができます。それには、extract 属性の値を「all」に設定します。この値を「first」に設定するか、指定しない場合、正規表現に一致する最初の値だけが抽出されます。

一致したすべての値について、個別の検知イベントが生成されます。検知プロセスが特定のイベントフィールドに影響しない場合、出力イベント内のそのフィールド値はハイフン(-)に設定されます。

解析されているイベント:

ip1=12.12.12.12 ip2=23.23.23.23 hash1=abc hash2=cde user1=N1 user2=N2

設定情報ファイルの要素:

<RegExps>

<Source id="default">

<RE_IP extract="all">...</RE_IP>

<RE_HASH extract="all">...</RE_HASH>

<RE_USER extract="first">...</RE_USER>

</Source>

</RegExps>

<EventFormat>ip=%RE_IP% hash=%RE_HASH% user=%RE_USER% %FeedContext%</EventFormat>

使用可能なフィードレコード:

IP = 12.12.12.12

IP = 23.23.23.23

hash = cde

生成された検知イベント:

ip=12.12.12.12 hash=- user= N1 <context for 12.12.12.12>

ip=23.23.23.23 hash=- user= N1 <context for 23.23.23.23>

ip=- hash=cde user=N1 <context for cde>

16 進数コードによる文字の指定

Kaspersky CyberTrace サービスは、PCRE 構文に適合する正規表現を使用します。この構文では、いくつかの方法を使用してそのコードで文字を指定できます。

Kaspersky CyberTrace サービスは、\x{hhh..} 形式での文字の指定をサポートしていません。代わりに、次の方法を使用してコードで文字を指定します:\uhhhh、 ここで hhhh は文字の 16 進数コードです。たとえば、([\x{00a1}-\x{ffff}])という表現は使用できませんが、([\u00a1-\uffff])という表現は使用できます。

正規表現の最適化

正規表現を最適化することで、文字列のマッチングに干渉するバックトラックを防ぐことができます。

正規表現を最適化するには、次のルールを使用します:

  • 絶対最大量指定子(++、*+)を使用する。
  • 可能な場合は、非マッチンググループ(?:)を外側括弧で囲んで使用する。
  • 論理和演算子はできるだけ使用せず、文字列の末尾で一致を見つけるようにする。論理和演算子は、あらゆる正規表現の演算子の中で最も低い優先順位となります。
  • 文字列内の開始位置と終了位置に一致するアンカー(^、$)を使用する。
  • アトミックグループを使用する。アトミックグループは、グループ内のトークンが記憶しているすべてのバックトラック位置を自動的に破棄します。構文は(?> ...)です。
  • 長い正規表現の場合、バックトラックの量が指数関数的に増加しないようにする。(qwerty.*)* などの例は推奨しません。

この記事はお役に立ちましたか?
改善できる点がありましたらお聞かせください。
フィードバックをいただき、ありがとうございました。改善に向けて取り組んでまいります。
フィードバックをいただき、ありがとうございました。改善に向けて取り組んでまいります。