こんにちは。 Microsoft Sentinel を使用して脅威情報の調査・研究を行っている安藤です。
Microsoft Sentinel ではさまざまなデータソースからログを集約し、ルールを設定することでアラートおよびインシデントを出力することができますが、サービスのデフォルト機能ではこれらを通知する手段がありません。本記事ではこれらのアラートおよびインシデントを通知する方法についてご紹介します。
本記事で記載している内容では
- 有効な Azure サブスクリプション(および十分な Azure IAM 権限)
- Exchange Online ライセンスおよび通知用のメールボックス
が準備されている前提で記載しております。
※ 通知方法によってはその他製品ライセンスを必要とする場合もあります。
Microsoft Sentinel のアラート/インシデント通知方法
Microsoft Sentinel では分析ルールという設定によってログデータを分析・集計し、閾値を越えた場合にアラート/インシデントを出力させることができます。
アラートとインシデントの差異は次の通りです。
左右にスクロールしてご覧ください。
項目 | アラート | インシデント |
---|---|---|
管理テーブル | SecurityAlert | SecurityIncident |
識別子 | SystemAlertId | IncidentNumber |
含まれる主な情報 |
|
|
ステータス管理 | 不可 | 可能 |
担当者アサイン | 不可 | 可能 |
コメント | 不可 | 可能 |
専用 URL | なし | あり |
これらの通知方法はさまざまな方法がありますが最もスタンダードなものはオートメーションルールから Azure Logic App を呼び出す方法です。オートメーションルールは Microsoft Sentinel の左側ブレードから設定できます。
プレイブックの作成
今回はインシデントに対して担当者をアサインしたタイミングで、担当者向けにアラートおよびインシデントをメールで通知するシステムを作ります。メールの通知内容はインシデントの概要、URL の他、アラート検出内容の一部を含むこととします。
[作成]ボタンから[インシデント トリガーを使用したプレイブック]を選択します。
サブスクリプション、リソースグループ、プレイブック名を入力します。通知アクションのためのログを Log Analytics に保管する場合は「Log Analytics で診断ログを有効にする」にチェックを入れてください。
続いて Microsoft Sentinel に接続するコネクタの設定を行います。マネージド ID か、操作をされているユーザーの権限かどちらかを選択することができますが、マネージド ID を推奨いたします。
[プレイブックの作成]を選択してください。Azure Logic App および API Connection が作成されます。
Azure Logic App が作成されると、インシデント発生時に起動するトリガーが既に設定された状態となっています。
では、このままの状態でインシデントの概要をメール送信する設定を行います。[新しいステップ]から Office 365 Outlook を選択して[メールの送信]あるいは[共有メールボックスからメールを送信する]を選択してください。今回は[メールの送信]を選択します。
※ Office 365 Outlook アクションを使用する場合、接続の作成が必要な場合がありますが本記事では割愛します。
メールの宛先や本文の設定を行います。宛先、件名、本文には以下のように設定します。
左右にスクロールしてご覧ください。
項目 | 使用する動的なコンテンツ | コードビュー上の指定 |
---|---|---|
宛先 | インシデント所有者 | @{triggerBody()?['object']? ['properties']?['owner']['email']} |
件名 | インシデント Sentinel ID | インシデント通知 - @{triggerBody()?['object']? ['properties']?['incidentNumber']} |
本文 | インシデントのタイトル、 インシデントの説明、 インシデント URL |
インシデント名: @{triggerBody()?['object']? ['properties']?['title']} インシデントの説明: @{triggerBody()?['object']? ['properties']?['description']} インシデントURL: @{triggerBody()?['object']? ['properties']?['incidentUrl']} |
インシデントのタイトルと説明は、分析ルールの設定値に依存します。デフォルトであれば分析ルール名がインシデントタイトル、分析ルールの説明がインシデントの説明となります。
※ 分析ルールの設定によってこれらを動的に変更することが可能ですが、本記事では割愛いたします。
まずはこの状態で通知させるためにインシデントを発生させます。今回はスケジュール分析ルールを使用します。設定方法の詳細は割愛しますが、下図のように設定しています。
この分析ルールの検出想定は以下となります。
左右にスクロールしてご覧ください。
カラム名 | 内容 |
---|---|
test | これはアラートとして検出されるログ部分です |
IPAddress | 192.0.2.1 |
AssetName | 資産1 |
オートメーションルールの作成
分析ルールの設定後、オートメーションルールの設定を行います。Microsoft Sentinel の左側ブレードから[オートメーション]を選択し、[作成]をクリックします。
今回はインシデントに対して担当者のアサインを行うこともオートメーションルールで設定します。順序を1としたうえで[インシデントが作成されたとき]をトリガーとしてアクションに[所有者の割り当て]を行い、ユーザー自身に割り当てられるよう設定します。
分析ルールを作成してすぐの場合は条件として分析ルール名を指定できない可能性がありますので、その場合は時間をおいて指定してください。
左右にスクロールしてご覧ください。
設定項目 | 値 |
---|---|
オートメーションルール名 | IncidentAlertTestAssign |
トリガー | インシデントが作成されたとき |
条件 | インシデントプロバイダーが次に等しい:すべて 分析ルール名が次に等しい:IncidentAlertTestRule |
アクション | 所有者への割り当て(自分への割り当て) |
ルールの有効期限 | 無期限 |
順序 | 1 |
次に新しいオートメーションルールとして先ほど作成した Azure Logic App を呼び出すために、アクションとして[プレイブックの実行]を選択します。この際、トリガーは[インシデントの更新時]とします。
過去にオートメーションルールを作成してプレイブックの実行アクションを設定していない場合、プレイブック実行のためのアクセス許可を設定する必要があります。こちらは[プレイブックのアクセス許可を管理]から設定を行います。
先ほど Azure Logic App を作成したリソースグループを選択します。その後[適用]をクリックします。
アクセス許可を適用した場合はその時点でプレイブックを読み込めない可能性があるため、右上の×ボタンから設定を中止し、設定しなおしてください。
引き続きオートメーションルールを以下の通り設定します。
左右にスクロールしてご覧ください。
設定項目 | 値 |
---|---|
オートメーションルール名 | IncidentAlertTestAction |
トリガー | インシデントの更新時 |
条件 | インシデントプロバイダーが次に等しい:すべて 分析ルール名が次に等しい:IncidentAlertTestRule 所有者:変更 |
アクション | プレイブックの実行:test |
ルールの有効期限 | 無期限 |
順序 | 2 |
オートメーションルールの設定を完了したので、分析ルールによるインシデント発報を待ちますが、テストとしてはルールの無効化後、再度有効化することで即時発報させることができます。
インシデントが発報されると、オートメーションルールが動作してプレイブックが実行されます。作成した Azure Logic App を確認すると実行されていることがわかります。
アラート詳細情報の取得
続いて、通知するメールにアラートの詳細情報を追記するようにします。
詳細情報を追記する方法としては2種類あり、1つ目が分析ルールに対してエンティティを設定し、エンティティを取り出す方法です。こちらは実装がシンプルですが、取得できる内容に制限があるため本記事での解説は割愛します。
2つ目が Azure Logic App からアラートの詳細情報を確認する方法です。発報されたインシデントには関連するアラート ID の情報が含まれています。まずは発生したインシデントに関連するアラート ID を確認して当該アラートの情報を出力させます。
インシデントトリガーの下に[データ操作>選択]アクションを追加します。
[選択]アクションには以下のように設定してください。
左右にスクロールしてご覧ください。
設定項目 | 値 |
---|---|
開始 | @{triggerBody()?['object']?['properties']?['Alerts']} |
マップ(キー) | SystemAlertId |
マップ(値) | @item()['properties']['systemAlertId'] |
続いて選択アクションの下にもアクションを追加します。monitor と検索いただき、[Azure Monitor ログ]を選択します。
[クエリを実行して結果を一覧表示する]アクションを選択します。
※ Azure Monitor ログ アクションを使用する場合、接続の作成が必要な場合がありますが本記事では割愛します。
[クエリを実行して結果を一覧表示する]アクションには以下のように設定してください。
左右にスクロールしてご覧ください。
設定項目 | 値 |
---|---|
サブスクリプション | @triggerBody()?['workspaceInfo']?['SubscriptionId'] |
リソースグループ | @triggerBody()?['workspaceInfo']?['ResourceGroupName'] |
リソースの種類 | Log Analytics Workspace |
リソース名 | @triggerBody()?['workspaceInfo']?['WorkspaceName'] |
クエリ | let AlertIdTable = datatable(AlertIds:string) [``` @{body('AlertIdsを抽出')} ```] | extend AlertIds = parse_json(AlertIds) | mv-expand AlertIds | evaluate bag_unpack(AlertIds) | extend SystemAlertId = tostring(SystemAlertId); SecurityAlert | join kind=rightouter AlertIdTable on SystemAlertId |
時間範囲 | Set In Query |
これによりインシデントに含まれるアラートの情報を取得することができました。続いてアラートに含まれるクエリを実行して、その出力からアラート詳細情報を取得します。
Azure Monitor ログアクションの後に[制御>For each]アクションを追加して、先ほど追加したアクションの出力を引数とします。
追加した For each アクションの中に再び Azure Monitor ログアクションを追加し、以下のように設定します。
左右にスクロールしてご覧ください。
設定項目 | 値 |
---|---|
サブスクリプション | @triggerBody()?['workspaceInfo']?['SubscriptionId'] |
リソースグループ | @triggerBody()?['workspaceInfo']?['ResourceGroupName'] |
リソースの種類 | Log Analytics Workspace |
リソース名 | @triggerBody()?['workspaceInfo']?['WorkspaceName'] |
クエリ | @{json(items('For_each')['ExtendedProperties']) ['Query']} |
時間範囲 | Set In Query |
ここまでの実行結果が以下となります。
このように分析ルールで設定したクエリが改めて実行され、フィルタリングされたログデータや検出したアラート詳細情報を取得することができます。この値を取り出してメール送信するために変数を初期化してアラート詳細情報を追加します。
最後に格納した変数をメール本文に追加します。必要な情報の選択や、どのような見た目とするか(例えば HTML テーブルとして表出力する)なども Azure Logic App 上で実装できます。
以下は HTML テーブル化した情報をメール本文に追加した例です。
まとめ
いかがでしたでしょうか。Microsoft Sentinel で検出内容をメール通知する方法についてご紹介しました。
今後も Microsoft Sentinel の活用方法についてブログを公開してまいりますので、ご覧いただければ幸いです。また、当社では Microsoft Sentinel による自動監視と、セキュリティ専門アナリストによる有人調査を組み合わせたサービス「MSS for Microsoft Sentinel」をご提供していますので、ご興味のある方はぜひ下記からお問い合わせください。
関連ページ |