ArcSight 検出ルールをMicrosoft Sentinelに移行する

この記事では、ArcSight の検出ルールを特定、比較、および Microsoft Sentinel の分析ルールに移行する方法について説明します。

ルールを特定して移行する

Microsoft Sentinelでは、機械学習分析を使用して、忠実性が高く実用的なインシデントが作成され、既存の検出の一部がMicrosoft Sentinelで冗長になる場合があります。 そのため、すべての検出と分析のルールを盲目的に移行しないでください。 既存の検出規則を特定するときは、次の考慮事項を確認します。

  • ビジネスの優先順位と効率性を考慮して、ルールの移行を正当化するユース ケースを必ず選択してください。
  • Microsoft Sentinel のルールの種類を理解していることを確認します。
  • ルールの用語を理解していることを確認します。
  • 過去6〜12ヶ月間にアラートが発生していないルールを確認し、それらがまだ有効かどうかを判断してください。
  • 日常的に無視する低レベルの脅威やアラートを排除します。
  • 既存の機能を使用し、Microsoft Sentinelの組み込み分析ルールが現在のユース ケースに対応できるかどうかをチェックします。 Microsoft Sentinelは機械学習分析を使用して、忠実性が高く実用的なインシデントを生成するため、既存の検出の一部が不要になる可能性があります。
  • 接続されているデータ ソースを確認し、データ接続方法を確認します。 データ収集の会話を見直して、検出する予定のユース ケース全体でデータの深さと幅を確保します。
  • SOC Prime Threat Detection Marketplace などのコミュニティ リソースを調べて、ルールが使用可能かどうかをチェックします。
  • Uncoder.io などのオンライン クエリ コンバーターがルールに対して機能するかどうかを検討します。
  • ルールが使用できない場合、または変換できない場合は、KQL クエリを使用して手動で作成する必要があります。 ルール マッピングを確認して、新しいクエリを作成します。

検出ルールを移行するためのベスト プラクティスの詳細については、こちらをご覧ください。

分析ルールをMicrosoft Sentinelに移行するには:

  1. 移行する各ルールに対してテスト システムが用意されていることを確認します。

    1. 完全なテスト シナリオやスクリプトなど、移行されたルールの検証プロセスを準備します。

    2. 移行されたルールをテストするためにチームに役立つリソースがあることを確認します。

    3. 必要なデータ ソースが接続されていることを確認し、 データ接続方法を確認します。

  2. 検出がMicrosoft Sentinelの組み込みテンプレートとして使用できるかどうかを確認します。

    • 組み込みのルールで十分な場合は、組み込みのルール テンプレートを使用して、独自のワークスペースのルールを作成します。

      Microsoft Sentinelで、[Configuration > Analytics > Rule templates]\(ルール テンプレート\) タブに移動し、関連する各分析ルールを作成して更新します。

      組み込みテンプレートからルールを作成する方法を学びたい方は、「 テンプレートからスケジュールされた分析ルールを作成」をご覧ください。

    • Microsoft Sentinelの組み込みルールでカバーされていない検出がある場合は、Uncoder.io などのオンライン クエリ コンバーターを試してクエリを KQL に変換してください。

      トリガー条件とルール アクションを特定し、KQL クエリを構築して確認します。

    • 組み込みのルールもオンライン ルール コンバーターでも十分な場合は、ルールを手動で作成する必要があります。 このような場合は、次の手順を使用してルールの作成を開始します。

      1. ルールで使用するデータ ソースを特定します。 クエリを実行するテーブルを識別するために、Microsoft Sentinelのデータ ソースとデータ テーブルの間にマッピング テーブルを作成します。

      2. ルールで使用するデータ内の属性、フィールド、またはエンティティを特定します。

      3. ルールの条件とロジックを特定します。 この段階では、KQL クエリを構築する方法のサンプルとしてルール テンプレートを使用できます。

        フィルター、相関ルール、アクティブ リスト、参照セット、ウォッチリスト、検出異常、集計などを検討します。 レガシーSIEMが提供する参照を使って ArcSightクエリ構文をKQLにマッピングするのも良いでしょう。

      4. トリガー条件とルール アクションを特定し、KQL クエリを構築して確認します。 クエリを確認するときは、KQL 最適化ガイダンス リソースを検討してください。

  3. 関連する各ユース ケースでルールをテストします。 期待される結果が得られない場合は、KQL を確認し、もう一度テストすることができます。

  4. 問題なければ、そのルールは移行済みと見なせます。 必要に応じて、ルール アクションのプレイブックを作成します。 ルールアクションのためのプレイブックを作成・使用するには、Microsoft Sentinelの「プレイブックによる脅威対応の自動化」をご覧ください。

分析ルールの詳細については、以下を参照してください。

ルールの用語を比較する

この表は、ArcSight と比較してMicrosoft Sentinelルールの概念を明確にするのに役立ちます。

ArcSight Microsoft Sentinel
規則の種類 - フィルタールール
- 結合ルール
- アクティブリストルール
- それ以外にも
- スケジュールクエリ
- 核融合
- Microsoft Security
- Machine Learning(ML)行動分析
基準 ルール条件で定義する KQL で定義する
トリガー条件 - 動作中の定義
- イベント集約において定義
しきい値: クエリ結果の数
操作 - イベントフィールドをセット
- 通知を送信
- 新しいケースを作成する
- アクティブリストに追加
- それ以外にも
- アラートまたはインシデントの作成
- ロジックアプリとの統合

ルール サンプルのマップと比較

以下のサンプルを使って、ArcSight検出ルールとKustoクエリ言語(KQL)で書かれた同等のMicrosoft Sentinelクエリを比較してください。

ルール 説明 サンプル検出ルール (ArcSight) KQL クエリのサンプル リソース
フィルター (AND) AND条件を含むサンプル ルール。 イベントはすべての条件に一致する必要があります。 フィルター (AND) の例 フィルター (AND) の例 文字列フィルター:
- 文字列演算子

数値フィルター:
- 数値演算子

日時フィルター:
-
- デートタイム
- 間に
- 今すぐに

解析:
- 構文解析
- 抜粋
- parse_json
- parse_csv
- parse_path
- parse_url
フィルター (OR) OR条件を含むサンプル ルール。 イベントは、任意の条件と一致できます。 フィルター (OR) の例 フィルター (OR) の例 - 文字列演算子
- において
ネストされたフィルター 入れ子になったフィルター条件を持つサンプル ルール。 ルールには、フィルター条件も含まれる MatchesFilter ステートメントが含まれます。 ネストされたフィルターの例 ネストされたフィルターの例 - 解析を高速化するためにKQL関数を使う
- パラメータ化された関数でWindowsのセキュリティイベントを豊かにする
- 参加
- ここで
有効なリスト(参照) InActiveList ステートメントを使用するサンプル参照規則。 アクティブ リスト (ルックアップ) の例 アクティブ リスト (ルックアップ) の例 - ウォッチリストはアクティブリスト機能に相当します。 ウォッチリストの詳細については 、こちらをご覧ください
- ルックアップの他の実装方法
相関関係 (一致) Matching Event ステートメントを使用して、一連の基本イベントに対して条件を定義するサンプル ルール。 相関関係 (照合) の例 相関関係 (照合) の例 結合演算子:
- 参加
- 時間枠で結合
- シャッフル
- 放送
- 連合

定義ステートメント:
- とします

集計:
- make_set
- make_list
- make_bag
- bag_pack
相関関係 (時間枠) Matching Event ステートメントを使用して一連の基本イベントに対して条件を定義し、Wait timeフィルター条件を使用するサンプル ルール。 相関関係 (時間枠) の例 相関関係 (時間枠) の例 - 参加
- Microsoft Sentinel ルールとジョインステートメント

フィルター (AND) の例: ArcSight

ArcSight で条件を AND するフィルター ルールの例を次に示します。

サンプル フィルター規則を示す図。

フィルター (AND) の例: KQL

KQL で条件を AND するフィルター 規則を次に示します。

SecurityEvent
| where EventID == 4728
| where SubjectUserName =~ "AutoMatedService"
| where isnotempty(SubjectDomainName)

この規則では、Azure監視エージェント (AMA) がWindows セキュリティ イベントを収集することを前提としています。 したがって、規則では、Microsoft Sentinel SecurityEvent テーブルが使用されます。

次のベスト プラクティスを検討してください。

  • クエリを最適化するには、可能な場合は大文字と小文字を区別しない演算子 ( =~) を避けます。
  • 値の大文字と小文字が区別されない場合は、 == を使用します。
  • 最も多くのデータを除外する where ステートメントから始めるように、フィルターを並べます。

フィルター (OR) の例: ArcSight

ArcSight で条件を OR するフィルター ルールの例を次に示します。

サンプル フィルター規則 (または) を示す図。

フィルター (OR) の例: KQL

KQL で OR 条件を使用してフィルター規則を記述する方法を次に示します。

最初のオプションとして、 in ステートメントを使用します。

SecurityEvent
| where SubjectUserName in
 ("Adm1","ServiceAccount1","AutomationServices")

2 番目のオプションとして、 or ステートメントを使用します。

SecurityEvent
| where SubjectUserName == "Adm1" or 
SubjectUserName == "ServiceAccount1" or 
SubjectUserName == "AutomationServices"

どちらのオプションもパフォーマンスは同じですが、読みやすい最初のオプションをお勧めします。

入れ子になったフィルターの例: ArcSight

ArcSight の入れ子になったフィルター 規則の例を次に示します。

入れ子になったフィルター規則のサンプルを示す図。

/All Filters/Soc Filters/Exclude Valid Users フィルターの規則を次に示します。

[有効なユーザーの除外] フィルターを示す図。

入れ子になったフィルターの例: KQL

KQL で OR 条件を使用してフィルター規則を記述する方法を次に示します。

最初のオプションとして、 where ステートメントで直接フィルターを使用します。

SecurityEvent
| where EventID == 4728 
| where isnotempty(SubjectDomainName) or 
isnotempty(TargetDomainName) 
| where SubjectUserName !~ "AutoMatedService"

2 番目のオプションとして、KQL 関数を使用します。

  1. 次のクエリを、 ExcludeValidUsers エイリアスを使用して KQL 関数として保存します。

        SecurityEvent
        | where EventID == 4728
        | where isnotempty(SubjectDomainName)
        | where SubjectUserName =~ "AutoMatedService"
        | project SubjectUserName
    
  2. 次のクエリを使用して、 ExcludeValidUsers エイリアスをフィルター処理します。

        SecurityEvent    
        | where EventID == 4728
        | where isnotempty(SubjectDomainName) or 
        isnotempty(TargetDomainName)
        | where SubjectUserName !in (ExcludeValidUsers)
    

3 番目のオプションとして、パラメーター関数を使用します。

  1. 名前とエイリアスとして ExcludeValidUsers を持つパラメーター関数を作成します。

  2. 関数のパラメーターを定義します。 例:

        Tbl: (TimeGenerated:datetime, Computer:string, 
        EventID:string, SubjectDomainName:string, 
        TargetDomainName:string, SubjectUserName:string)
    
  3. parameter関数には、次のクエリがあります。

        Tbl
        | where SubjectUserName !~ "AutoMatedService"
    
  4. 次のクエリを実行して、パラメーター関数を呼び出します。

        let Events = (
        SecurityEvent 
        | where EventID == 4728
        );
        ExcludeValidUsers(Events)
    

4 番目のオプションとして、 join 関数を使用します。

let events = (
SecurityEvent
| where EventID == 4728
| where isnotempty(SubjectDomainName) 
or isnotempty(TargetDomainName)
);
let ExcludeValidUsers = (
SecurityEvent
| where EventID == 4728
| where isnotempty(SubjectDomainName)
| where SubjectUserName =~ "AutoMatedService"
);
events
| join kind=leftanti ExcludeValidUsers on 
$left.SubjectUserName == $right.SubjectUserName

Considerations

  • わかりやすくするため、 where ステートメント (最初のオプション) で直接フィルターを使用することをお勧めします。 パフォーマンスを最適化するには、 join (4 番目のオプション) を使用しないでください。
  • クエリを最適化するには、可能であれば、=~!~ の大文字と小文字を区別しない演算子の使用を避けてください。 演算子 ==!= は、値で大文字と小文字が区別されない場合に使用します。

アクティブ リスト (ルックアップ) の例: ArcSight

ArcSight のアクティブなリスト (ルックアップ) ルールを次に示します。

アクティブなリスト ルール (参照) のサンプルを示す図。

アクティブ リスト (ルックアップ) の例: KQL

Important

このクエリを実行する前に、Microsoft SentinelでCyber-Ark 例外アカウントウォッチリストを作成し、アカウントフィールドを含めてください。

以下のKQLクエリは、Cyber-Ark 例外アカウントウォッチリストを使って検索結果をフィルタリングします。

let Activelist=(
_GetWatchlist('Cyber-Ark Exception Accounts')
| project Account );
CommonSecurityLog
| where DestinationUserName in (Activelist)
| where DeviceVendor == "Cyber-Ark"
| where DeviceAction == "Get File Request"
| where DeviceCustomNumber1 != ""
| project DeviceAction, DestinationUserName, 
TimeGenerated,SourceHostName, 
SourceUserName, DeviceEventClassID

フィルターを注文するには、最も多くのデータをフィルター処理する where ステートメントから始めます。

相関 (照合) の例: ArcSight

Matching Event ステートメントを使用して、一連の基本イベントに対して条件を定義する ArcSight ルールの例を次に示します。

相関ルールのサンプル (照合) を示す図。

相関関係 (一致) の例: KQL

次の KQL の例は、Microsoft Sentinelで ArcSight 照合相関ルールを実装する方法を示しています。

let event1 =(
SecurityEvent
| where EventID == 4728
);
let event2 =(
SecurityEvent
| where EventID == 4729
);
event1
| join kind=inner event2 
on $left.TargetUserName==$right.TargetUserName

ベスト プラクティス

  • クエリを最適化するには、小さいテーブルが join 関数の左側にあることを確認します。
  • テーブルの左側が比較的小さい (最大 100 K レコード) 場合は、パフォーマンスを向上させるために hint.strategy=broadcast を追加します。

関連付け (時間枠) の例: ArcSight

Matching Event ステートメントを使用して一連の基本イベントに対して条件を定義し、Wait timeフィルター条件を使用する ArcSight ルールの例を次に示します。

相関ルールのサンプル (時間枠) を示す図。

関連付け (時間枠) の例: KQL

次の KQL の例では、ArcSight の例と同等の時間枠を持つ相関ルールを実装します。

let waittime = 10m;
let lookback = 1d;
let event1 = (
SecurityEvent
| where TimeGenerated > ago(waittime+lookback)
| where EventID == 4728
| project event1_time = TimeGenerated, 
event1_ID = EventID, event1_Activity= Activity, 
event1_Host = Computer, TargetUserName, 
event1_UPN=UserPrincipalName, 
AccountUsedToAdd = SubjectUserName 
);
let event2 = (
SecurityEvent
| where TimeGenerated > ago(waittime)
| where EventID == 4729
| project event2_time = TimeGenerated, 
event2_ID = EventID, event2_Activity= Activity, 
event2_Host= Computer, TargetUserName, 
event2_UPN=UserPrincipalName,
 AccountUsedToRemove = SubjectUserName 
);
 event1
| join kind=inner event2 on TargetUserName
| where event2_time - event1_time < lookback
| where tolong(event2_time - event1_time ) >=0
| project delta_time = event2_time - event1_time,
 event1_time, event2_time,
 event1_ID,event2_ID,event1_Activity,
 event2_Activity, TargetUserName, AccountUsedToAdd,
 AccountUsedToRemove,event1_Host,event2_Host, 
 event1_UPN,event2_UPN

集計の例: ArcSight

集計設定(10 分以内に 3 回一致)を含む ArcSight ルールの例を次に示します。

サンプル集計ルールを示す図。

集計の例: KQL

次の KQL クエリは、集計を使用して 3 つ以上の一致を検出する方法を示しています。

SecurityEvent
| summarize Count = count() by SubjectUserName, 
SubjectDomainName
| where Count >3

次のステップ