Microsoft Sentinel分析ルールの紐解き（Account Created and Deleted in Short Timeframe）

Microsoft Sentinelにおいてもともと準備されている分析ルールについてクエリの中身や注意点等を紐解いていく。

:::note warn
このルールは利用環境によっては過検知が多発するためチューニングが必要である。
例えば
- 情シス部門のユーザーかつ条件付きアクセスで許可されたロケーションからの操作は検知除外する
- 作成／削除後に別ドメインで作成し削除がない場合は検知除外する（対象ドメイン間違いというシナリオ）

である
::: 

# 1. ルール概要
|項目|説明|
|--|--|
|重大度|高|
|ルール名|Account Created and Deleted in Short Timeframe|
|ルールの種類|Scheduled|
|ルールの頻度|1時間ごとにクエリを実行|
|ルールの期間|過去1日のデータ|
|バージョン|1.0.2|
|説明|ユーザー・プリンシパル・ネーム（UPN）イベントを検索します。作成された後、24時間以内に削除されたアカウントを探す。攻撃者は、自分用にアカウントを作成し、不要になった時点で削除することがあります。。（by DeepL）|
|Ref|https://docs.microsoft.com/azure/active-directory/fundamentals/security-operations-user-accounts#short-lived-account|

# 2. 活用するテーブル
|テーブル名|概要|参考URL|
|--|--|--|
|AuditLogs|Azure ADの監査ログ|https://learn.microsoft.com/ja-jp/azure/azure-monitor/reference/tables/auditlogs|

# 3. クエリ解説
```Kusto:Account Created and Deleted in Short Timeframe / version1.0.2
// 削除に関するログ調査の時間を1時間に設定する
let queryfrequency = 1h;
// 作成に関するログ調査の時間を1日に設定する
let queryperiod = 1d;
// AzureADの監査ログを対象とする
AuditLogs
// ログの生成日時が1時間以内のものに絞り込む
| where TimeGenerated > ago(queryfrequency)
// 操作名が大文字小文字問わずユーザー削除を示すログに絞り込む
| where OperationName =~ "Delete user"
//extend UserPrincipalName = tostring(TargetResources[0].userPrincipalName)
// UPNを文字列型フィールドに展開する（UPNにGUIDが含まれることがあるため、正規表現でGUIDあった場合ない場合を加味して処理している）
| extend UserPrincipalName = extract(@'([a-f0-9]{32})?(.*)', 2, tostring(TargetResources[0].userPrincipalName))
// 削除したユーザーおよび削除したユーザーのIPアドレスを文字列型フィールドにそれぞれ展開する
| extend DeletedByUser = tostring(InitiatedBy.user.userPrincipalName), DeletedByIPAddress = tostring(InitiatedBy.user.ipAddress)
// 削除したときのアプリの表示名を文字列型フィールドに展開する
| extend DeletedByApp = tostring(InitiatedBy.app.displayName)
// 削除した日時、UPN、削除したユーザー、削除したユーザーのIPアドレス、削除した際のアプリ表示名、削除した際の詳細情報等のフィールドに並び変える
| project Deletion_TimeGenerated = TimeGenerated, UserPrincipalName, DeletedByUser, DeletedByIPAddress, DeletedByApp, Deletion_AdditionalDetails = AdditionalDetails, Deletion_InitiatedBy = InitiatedBy, Deletion_TargetResources = TargetResources
// メインクエリとサブクエリの主キー（結合キー）が重複するもののみ残す
| join kind=inner (
    // AzureADの監査ログを対象とする
    AuditLogs
    // ログの生成日時が過去1日以内のものに絞り込む
    | where TimeGenerated > ago(queryperiod)
    // 操作名が大文字小文字問わずユーザー作成を示すログに絞り込む
    | where OperationName =~ "Add user"
    // UPNを文字列型フィールドに展開する
    | extend UserPrincipalName = tostring(TargetResources[0].userPrincipalName)
    // ログの日時をリネームする
    | project-rename Creation_TimeGenerated = TimeGenerated
// 結合キーをUPNに設定する
) on UserPrincipalName
// 削除から作成までの時間差を算出する
| extend TimeDelta = Deletion_TimeGenerated - Creation_TimeGenerated
// 時間差が0秒～1日以内のもののみに絞り込む
| where  TimeDelta between (time(0s) .. queryperiod)
// 作成したユーザーおよび削除したユーザーのIPアドレスを文字列型フィールドにそれぞれ展開する
| extend CreatedByUser = tostring(InitiatedBy.user.userPrincipalName), CreatedByIPAddress = tostring(InitiatedBy.user.ipAddress)
// 作成したときのアプリの表示名を文字列型フィールドに展開する
| extend CreatedByApp = tostring(InitiatedBy.app.displayName)
// 表示するフィールドを並び変える
| project Creation_TimeGenerated, Deletion_TimeGenerated, TimeDelta, UserPrincipalName, DeletedByUser, DeletedByIPAddress, DeletedByApp, CreatedByUser, CreatedByIPAddress, CreatedByApp, Creation_AdditionalDetails = AdditionalDetails, Creation_InitiatedBy = InitiatedBy, Creation_TargetResources = TargetResources, Deletion_AdditionalDetails, Deletion_InitiatedBy, Deletion_TargetResources
// エンティティに作成日時、UPN、削除した時のIPアドレスを設定する
| extend timestamp = Deletion_TimeGenerated, CustomAccountEntity = UserPrincipalName, IPCustomEntity = DeletedByIPAddress
```