Microsoft Sentinel の分析ルールを使うと、取り込んだログを定期的に検索し、怪しい操作を自動で見つけられます。この記事では、Azure Activity のログを対象にした分析ルールをテンプレートから作成し、実際にインシデントが作られるところまで確認します。
具体的には、リソースグループを追加した操作を Azure Activity のログから検出し、Microsoft Sentinel にインシデントを作らせます。
分析ルールを作る前に、Azure Activity のログを Microsoft Sentinel に取り込むデータコネクタの設定が必要です。設定手順は次の記事を参照してください。
- 分析ルール、アラート、インシデントの関係
- テンプレート「Suspicious Resource deployment」から分析ルールを作る手順と、各設定の意味
- リソースグループを追加して、インシデントが作られることの確認
分析ルールとは?
分析ルールは、Log Analytics ワークスペースに取り込んだログに対して KQL(Kusto Query Language)のクエリを実行し、条件に合う結果が見つかったらアラートを生成する仕組みです。アラートは、設定に従ってインシデント(調査の単位)にまとめられます。運用者は、インシデントを見て調査や対応を進めます。
分析ルールにはいくつかの種類があります。今回の Azure Activity のテンプレート一覧に出てくるのは、次の 2 種類です。
| ルールの種類 | 動き |
|---|---|
| Scheduled(スケジュール済み) | 決めた間隔(5 分〜14 日)でクエリを実行し、決めた期間(5 分〜14 日)のログを検索する。もっともよく使われる種類 |
| NRT(ほぼリアルタイム) | 1 分ごとにクエリを実行する。スケジュール済みルールより設定できる項目が限られる |
今回使うテンプレート:Suspicious Resource deployment
今回は動作確認用に、スケジュール済みのテンプレート「Suspicious Resource deployment(不審なリソースのデプロイ)」を使います。説明には「以前は見られなかった呼び出し元によって、まれなリソースおよびリソースグループのデプロイが行われたことを検出する」という意味の英文が書かれています。
テンプレートのクエリは、次のようになっています(Azure-Sentinel の GitHub リポジトリで公開されているテンプレート、バージョン 2.0.4 のクエリです)。
ルールのクエリ(テンプレートの既定)
// Add or remove operation names below as per your requirements. For operations lists, please refer to https://learn.microsoft.com/en-us/Azure/role-based-access-control/resource-provider-operations#all let szOperationNames = dynamic(["Microsoft.Compute/virtualMachines/write", "Microsoft.Resources/deployments/write", "Microsoft.Resources/subscriptions/resourceGroups/write"]); let starttime = 14d; let endtime = 1d; let RareCaller = AzureActivity | where TimeGenerated between (ago(starttime) .. ago(endtime)) | where OperationNameValue in~ (szOperationNames) | summarize count() by CallerIpAddress, Caller, OperationNameValue, bin(TimeGenerated,1d) // Returns all the records from the right side that don't have matches from the left. | join kind=rightantisemi ( AzureActivity | where TimeGenerated > ago(endtime) | where OperationNameValue in~ (szOperationNames) | summarize StartTimeUtc = min(TimeGenerated), EndTimeUtc = max(TimeGenerated), ActivityTimeStamp = make_set(TimeGenerated,100), ActivityStatusValue = make_set(ActivityStatusValue,100), CorrelationIds = make_set(CorrelationId,100), ResourceGroups = make_set(ResourceGroup,100), ResourceIds = make_set(_ResourceId,100), ActivityCountByCallerIPAddress = count() by CallerIpAddress, Caller, OperationNameValue) on CallerIpAddress, Caller, OperationNameValue; RareCaller | extend Name = iif(Caller has '@',tostring(split(Caller,'@',0)[0]),"") | extend UPNSuffix = iif(Caller has '@',tostring(split(Caller,'@',1)[0]),"") | extend AadUserId = iif(Caller !has '@',Caller,"")
このクエリは、「特定の操作をした」だけで検出するのではありません。過去の操作と比べて、新しい組み合わせの操作が行われたときに検出します。
| クエリの部分 | 意味 |
|---|---|
| szOperationNames | 対象にする操作。VM の作成・更新(Microsoft.Compute/)、デプロイ(Microsoft.Resources/)、リソースグループの作成・更新(Microsoft.Resources/)の 3 つ |
| starttime = 14d endtime = 1d | 14 日前から 1 日前までを「過去の操作(基準)」、直近 1 日を「新しい操作」として分ける |
| join kind=rightantisemi | 直近 1 日の操作のうち、基準の中に同じ「IP アドレス(CallerIpAddress)・呼び出し元(Caller)・操作(OperationNameValue)」の組み合わせが無いものだけを残す |
| extend Name extend UPNSuffix extend AadUserId | 呼び出し元を、ユーザー名・ドメイン部分・ユーザー ID に分ける。あとで説明するエンティティ マッピングで使う |
このルールは、同じ管理者が同じ IP アドレスから、過去 13 日間(14 日前〜1 日前)に同じ操作をしていると検出しません。毎日リソースを作る環境では検出されにくく、普段リソースを作らない人や、いつもと違う場所からの操作を見つけるためのルールです。
分析ルールの作成(Azure Activity)
規則のテンプレートを開く
Microsoft Sentinel のメニューから 構成 ›› 分析 をクリックします。分析ルールの画面が開き、検証時は有効なルール(アクティブな規則)が 1 つだけありました。「規則のテンプレート」タブをクリックすると、コンテンツハブでインストールしたソリューションに含まれるテンプレートが一覧で表示されます。
この記事の画面は、実際の画面ではなく、検証時の画面から操作する項目(見るポイント)を抜き出して描いたイメージです。バージョンによって、項目の並びや表記は変わります。
| 1アクティブな規則 | 1 |
| 重要度別の規則 | 高 (1) 中 (0) 低 (0) 情報提供 (0) |
| 重要度 | 名前 | ルールの種類 | データ ソース |
|---|---|---|---|
| 中 | GitHub Signin … | Scheduled | Microsoft Entra… |
| 中 | Cross-tenant A… | Scheduled | Microsoft Entra… |
| 中 | TI map Domain… | Scheduled | Windows DNS via l… |
| 高 | Authentication … | Scheduled | Microsoft Entra ID |
| ⋮ (中略) | |||
| No. | 項目 | 内容 |
|---|---|---|
| 1 | アクティブな規則 | 有効になっている分析ルールの数。検証時は 1 つ(重要度「高」のルール。赤が高、オレンジ・黄が中・低、グレーが情報提供) |
| 2 | 規則のテンプレート | インストール済みのテンプレートの一覧。Azure Activity 以外のソリューションのテンプレートも混ざって表示される |
Azure Activity のテンプレートだけに絞り込みます。「フィルターの追加」をクリックし、「ソース名」を選びます。ソース名の一覧で「Azure Activity」にチェックを入れて、「適用」をクリックします。
| 重要度 | |
| ルールの種類 | |
| 2ソース名 | |
| データ ソース | |
| 戦術 |
| ☐ Microsoft Entra ID | |
| ☐ Microsoft Defender XDR | |
| 3☑ Azure Activity | |
| ☐ Apache Log4j Vulnerability Detection | |
| ⋮(中略) | |
| No. | 項目 | 内容 |
|---|---|---|
| 1 | フィルターの追加 | テンプレートの一覧を絞り込む条件を追加する |
| 2 | ソース名 | テンプレートの提供元(ソリューション)で絞り込む |
| 3 | Azure Activity | チェックを入れる |
| 4 | 適用 | クリックすると、一覧が Azure Activity のテンプレートだけになる |
これで、Azure Activity の分析ルールのテンプレートだけが表示されます。データ ソースがすべて Azure Activity になっていることを確認します。
テンプレートからルールを作成する(全般)
一覧から「Suspicious Resource deployment」を右クリックし、「ルールの作成」をクリックします(テンプレートを選択して、右側の詳細の「ルールの作成」をクリックしても同じです)。
| 重要度 | 名前 | ルールの種類 | データ ソース | 手法 |
|---|---|---|---|---|
| 中 | NRT Microsoft Entra ID H… | NRT | Azure Activity | T1578 |
| 低 | New CloudShell User | Scheduled | Azure Activity | T1059 |
| 低 | Creation of expensive computes … | Scheduled | Azure Activity | T1578 |
| 低 | Rare subscription-level operatio… | Scheduled | Azure Activity | T1003 +1 |
| 1 低 | Suspicious Resource deployment 2+ ルールの作成 | Scheduled | Azure Activity | T1496 |
| 中 | NRT Creation of expensive comp… | NRT | Azure Activity | T1578 |
| 低 | Subscription moved to another t… | Scheduled | Azure Activity | T1496 |
| No. | 項目 | 内容 |
|---|---|---|
| 1 | Suspicious Resource deployment | 重要度「低」、種類「Scheduled」のテンプレート。名前が「NRT」で始まるものは NRT ルールのテンプレート |
| 2 | ルールの作成 | 右クリックで表示される。クリックすると、テンプレートの内容が入った状態でルールの作成画面が開く |
ルールの作成画面が開き、最初に「全般」タブが表示されます。名前、説明、重要度などは、テンプレートの値があらかじめ入っています。そのまま「次へ:ルールのロジックを設定 >」をクリックします。
| 1名前 | Suspicious Resource deployment |
| 説明 | Identifies when a rare Resource and ResourceGroup deployment occurs by a previously unseen caller. |
| 重要度 | 低 |
| MITRE ATT&CK | 2 個選択済み |
| 2状態 | 有効 |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | 名前・説明・重要度・MITRE ATT&CK | テンプレートの値のまま。MITRE ATT&CK は、このルールが検出する攻撃の戦術(Impact)と手法(T1496) |
| 2 | 状態 | 有効(緑)のまま。有効で作成すると、ルールは作成した直後に 1 回目のクエリを実行し、その後は設定した間隔で実行される |
| 3 | 次へ | ルールのロジックの設定に進む |
ルールのロジックを設定する
「ルールのロジックを設定」タブでは、クエリ、エンティティ マッピング、実行の間隔などを設定します。今回は、すべてテンプレートの既定のままにします。ルールのクエリには、上で説明したクエリが入っています。
| 1ルールのクエリ | | join kind=rightantisemi ( ⋯(テンプレートのクエリ) | ||||||||||||||||
| 2エンティティ マッピング |
| ||||||||||||||||
| 3クエリの実行間隔 | 1 日 | ||||||||||||||||
| 次の時間分の過去のデータを参照 | 14 日 | ||||||||||||||||
| 実行の開始 | ◉ 自動○ 特定の時刻 (プレビュー) | ||||||||||||||||
| 4アラートのしきい値 | クエリ結果件数が 次の値より大きい 0 | ||||||||||||||||
| 5イベント グループ化 | ◉ すべてのイベントを単一のアラートにグループ化する ○ 各イベントに対するアラートをトリガーする | ||||||||||||||||
| 6抑制 | アラートの生成後にクエリの実行を停止する: オフ |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | ルールのクエリ | テンプレートのクエリのまま。変更すると、画面の下ですぐに文法がチェックされる |
| 2 | エンティティ マッピング | クエリ結果の列を、Sentinel が扱うエンティティ(アカウント、IP など)に対応付ける。対応付けたエンティティはアラートとインシデントに表示され、STEP 4 のアラートのグループ化にも使われる |
| 3 | 実行間隔 1 日/過去 14 日分を参照 | 1 日に 1 回、過去 14 日分のログを対象にクエリを実行する。クエリの中で 14 日前までさかのぼるので、参照する期間も 14 日にしている。どちらも 5 分〜14 日の範囲で設定でき、参照する期間は実行間隔以上にする |
| 4 | アラートのしきい値 | クエリ結果が 0 件より多い、つまり 1 件でも結果があればアラートを生成する |
| 5 | イベント グループ化 | 既定は「すべてのイベントを単一のアラートにグループ化する」。1 回の実行で結果が何件あっても、アラートは 1 件にまとめられる。結果 1 件ごとにアラートを出す場合は「各イベントに対するアラートをトリガーする」を選ぶ |
| 6 | 抑制 | オン(最大 24 時間)にすると、アラートを生成したあと、指定した時間はクエリを実行しない。既定はオフで、アラートが出たあとも設定した間隔で実行を続ける |
| 7 | 次へ | インシデントの設定に進む |
インシデントの設定
「インシデントの設定」タブでは、アラートからインシデントを作るかどうかと、複数のアラートを 1 つのインシデントにまとめるかどうかを設定します。インシデントの作成は既定で有効です。既定のままだと、アラート 1 件ごとにインシデントが 1 件作られます。
今回は、同じアラートでインシデントが増えすぎないように、アラートのグループ化を有効にしました(既定は無効)。
| 1この分析ルールによってトリガーされるアラートからインシデントを作成する | 有効 |
| 2この分析ルールによってトリガーされる関連アラートをインシデントにグループ化する | 有効 |
| 3選択した期間内に作成されたアラートのみにグループを制限する | 5 時間 |
| 4次の方法で単一のインシデントにグループ化する | ◉ すべてのエンティティが一致した場合にアラートを 1 つのインシデントにグループ化する (推奨) ○ このルールによってトリガーされるすべてのアラートを 1 つのインシデントにグループ化する ○ 選択したエンティティ型と詳細が一致する場合、アラートを 1 つのインシデントにグループ化する。 |
| 5閉じた一致するインシデントを再度開く | 無効 |
| No. | 項目 | 設定内容 |
|---|---|---|
| 1 | インシデントを作成する | 有効(緑)のまま。無効にすると、アラートだけが作られてインシデントは作られない |
| 2 | アラートのグループ化 | 有効にする。最大 150 件のアラートを 1 つのインシデントにまとめられる。150 件を超えた分は、同じ内容の新しいインシデントにまとめられる |
| 3 | グループを制限する期間 | この期間内に作られたアラートだけをまとめる。期間の外のアラートは別のインシデントになる。検証では 5 時間 |
| 4 | グループ化の方法 | 推奨の「すべてのエンティティが一致した場合」を選ぶ。STEP 3 でマッピングしたエンティティ(アカウントと IP)の値がすべて同じアラートを、1 つのインシデントにまとめる |
| 5 | 閉じた一致するインシデントを再度開く | 無効のまま。閉じたインシデントに当てはまるアラートが後から出たとき、閉じたインシデントを開き直さず、新しいインシデントを作る |
| 6 | 次へ | 自動応答の設定に進む |
自動応答と、確認と作成
「自動応答」タブでは、このルールのインシデントに対して動くオートメーション ルール(担当者の割り当てやプレイブックの実行など)を確認・追加できます。今回は何も設定せず、「次へ:確認と作成 >」をクリックします。
「確認と作成」タブで、設定内容の検証に合格したことを確認し、「保存」をクリックします。
| 名前 | Suspicious Resource deployment |
| MITRE ATT&CK | Impact (1) |
| 重要度 | 低 |
| 状態 | 有効 |
| ルールのクエリ | // Add or remove operation names below as per your requirements. ⋯ |
| No. | 表示・項目 | 意味・操作 |
|---|---|---|
| 1 | 検証に合格しました。(緑) | 設定に誤りがない。エラーがある場合は、エラーのあるタブに印が付くので、そのタブを開いて直す |
| 2 | 保存 | クリックするとルールが作成され、「アクティブな規則」タブに表示される。テンプレートの一覧では、使ったテンプレートに「In use」(使用中)の印が付く |
インシデントの確認
インシデントを発生させるため、Azure portal でリソースグループを 3 つ(sentineltest1〜3)追加しました。リソースグループの作成は、クエリの対象の操作 Microsoft.Resources/ として Azure Activity のログに記録されます。
| 名前 | サブスクリプション | 場所 |
|---|---|---|
| NetworkWatcherRG | Azure subscription 1 | Japan East |
| Sentinel_Blog | Azure subscription 1 | Japan East |
| 1sentineltest1 | Azure subscription 1 | Japan East |
| sentineltest2 | Azure subscription 1 | Japan East |
| sentineltest3 | Azure subscription 1 | Japan East |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | sentineltest1〜3 | 検証のために追加したリソースグループ。これらの作成操作を分析ルールで検出する |
Microsoft Sentinel のメニューから 脅威管理 ›› インシデント を開きます。しばらくすると、Suspicious Resource deployment のインシデントが作られました。
| 1インシデントを開く | 1 (新しいインシデント 1 / アクティブなインシデント 0) |
| 重大度 | インシデント番号 | タイトル |
|---|---|---|
| 2 低 | 3 | Suspicious Resource deployment |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | インシデントを開く:1 | 対応が終わっていないインシデントの数。まだ誰も手を付けていない「新規」が 1 件 |
| 2 | 低/3/Suspicious Resource deployment | 重大度はルールの重要度(低)、タイトルはルール名になる。番号 3 なのは、以前の検証で番号 1、2 のインシデントが作られていたため |
インシデントを選択すると、右側に概要が表示されます。「すべての詳細を表示」をクリックすると、詳細の画面が開きます。
| 重大度/状態/所有者 | 低 新規 未割り当て |
| 説明 | Identifies when a rare Resource and ResourceGroup deployment occurs by a previously unseen caller. |
| 1証拠 | イベント 3 アラート 3 ブックマーク 0 |
| 作成時刻/最終更新時刻 | 2024/8/16 0:24:10 / 2024/8/16 0:34:11 |
| 2エンティティ(2 個) | アカウント:admin@(伏せています) IP:(伏せています) |
| 戦術と手法 | Impact (1) |
| 3Suspicious Resource deployment 低 Microsoft Sentinel |
| Suspicious Resource deployment 低 Microsoft Sentinel |
| Suspicious Resource deployment 低 Microsoft Sentinel |
| 重大度 | インシデント番号 | タイトル | 状態 |
|---|---|---|---|
| 4 低 | 2 | Suspicious Resource deployment | 終了 – 不明 |
| 低 | 1 | Suspicious Resource deployment | 終了 – 不明 |
| No. | 表示 | 意味 |
|---|---|---|
| 1 | 証拠:イベント 3、アラート 3 | このインシデントにまとめられたアラートの数。右側の概要を開いたとき(0:29 更新)は 2 件で、詳細を開いたとき(0:34 更新)には 3 件に増えていた。アラートのグループ化を有効にしたので、同じエンティティのアラートが新しいインシデントにならず、このインシデントに追加されている |
| 2 | エンティティ | STEP 3 のエンティティ マッピングで対応付けた、操作したアカウントと接続元の IP アドレス。誰がどこから操作したかが、ここでわかる |
| 3 | インシデントのタイムライン | インシデントに含まれるアラートが時刻の順に並ぶ |
| 4 | 類似インシデント | 同じルールなどで作られた過去のインシデント。以前の検証で作り、終了にしたもの |
この記事の画面は、検証時(2024 年 8 月)の Azure portal の Microsoft Sentinel です。Microsoft Sentinel は、2027 年 3 月 31 日以降は Azure portal でのサポートが終わり、Microsoft Defender ポータルだけで使えるようになります。
- 分析ルールは
Microsoft Sentinel ›› Configuration ›› Analytics(英語表示の場合)から、同じウィザードで作成できます。 - インシデントは
Investigation & response ›› Incidents & alerts ›› Incidents(英語表示の場合)で確認します。 - Defender ポータルに接続した環境では、インシデントは Microsoft Defender XDR が作ります。アラートのグループ化の設定はインシデントを作るときだけ使われ、Defender の相関エンジンが別のまとめ方をすることがあります。「閉じた一致するインシデントを再度開く」は使えません。
うまくいかないとき
| 状態 | よくある原因 | 確認すること |
|---|---|---|
| テンプレートの「ルールの作成」が押せない | テンプレートに必要なデータソース(AzureActivity)が接続されていない、またはデータが届いていない | Azure Activity のデータコネクタの状態 |
| ルールを保存できない | ワークスペースへの書き込み権限がない | Microsoft Sentinel 共同作成者などのロールの割り当て |
| リソースグループを作ってもインシデントが出ない | 過去 13 日間に、同じアカウント・同じ IP アドレスで同じ操作をしている | このルールの検出条件(新しい組み合わせだけを検出する) |
| しばらく待ってもインシデントが出ない | ルールは 1 日に 1 回の実行。作成直後の 1 回目より後の操作は、次の実行まで検出されない | ログの画面で AzureActivity テーブルに操作が記録されているか、ルールの実行間隔 |
| 同じようなインシデントが大量に作られる | アラートのグループ化が無効で、アラート 1 件ごとにインシデントが作られている | インシデントの設定のアラートのグループ化。必要なら抑制も使う |
まとめ
| 手順 | やること | ポイント |
|---|---|---|
| STEP 1 | 分析の「規則のテンプレート」をソース名 Azure Activity で絞り込む | コンテンツハブで入れたソリューションのテンプレートが表示される |
| STEP 2 | Suspicious Resource deployment からルールを作成 | 状態「有効」で作ると、作成直後に 1 回目が実行される |
| STEP 3 | ルールのロジックは既定のまま | 1 日ごとに過去 14 日分を検索し、新しい「アカウント・IP・操作」の組み合わせを検出 |
| STEP 4 | アラートのグループ化を有効にする | エンティティが同じアラートを、1 つのインシデントにまとめる |
| STEP 5 | 検証に合格したことを確認して保存 | 自動応答は今回は設定なし |
| 確認 | リソースグループを追加し、インシデントを確認 | エンティティで、誰がどこから操作したかがわかる |
コメント