演習2 に加えて、Sentinel のインシデントに含まれるエンティティ情報を利用して Advanced Hunting を実行してみましょう
Microsft Sentinel のインシデント検知をトリガーとして、インシデントに含まれるエンティティ情報から Defender XDR へクエリー分析を自動化するロジックアプリを実践してみましょう。 構成イメージは以下の通りです
インシデントトリガーのロジックアプリを作成する
JSON アレイを理解する
- Sentinel インシデントトリガーから得られるエンティティ情報は JSON アレイ型になっています
- 例えば、MDE for Linux が EICAR ファイルを検知した際のエンティティ情報は以下のようになります
kind
がHost
属性となるホスト情報kind
がFile
属性となるファイル名情報kind
がFileHash
属性となるファイルハッシュ情報
- ここでは、後述の Advanced Hunting に使うデータとして、ホスト情報を抽出する想定としています
[
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-xxx-xxx/providers/Microsoft.OperationalInsights/workspaces/log-hubhnakada-JapanEast/providers/Microsoft.SecurityInsights/Entities/",
"type": "Microsoft.SecurityInsights/Entities",
"kind": "Host",
"properties": {
"dnsDomain": "rglnoiucbtnuzarcriubjs2azc.lx.internal.cloudapp.net",
"hostName": "vmlinuxcustomlog",
"osFamily": "Unknown",
"osVersion": "7.9",
"additionalData": {
"MdatpDeviceId": "95ffd3240bde37ef347cf836db74b13f85cbf185",
"DeviceDnsName": "vmlinuxcustomlog.rglnoiucbtnuzarcriubjs2azc.lx.internal.cloudapp.net",
"RiskScore": "informational",
"HealthStatus": "active",
"FirstSeenDateTime": "2023-09-04T03:29:26.736412+00:00",
"RbacGroupName": "Servers",
"DefenderAvStatus": "notSupported",
"OnboardingStatus": "onboarded"
},
"friendlyName": "vmlinuxcustomlog"
}
},
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-xxx-xxx/providers/Microsoft.OperationalInsights/workspaces/log-hubhnakada-JapanEast/providers/Microsoft.SecurityInsights/Entities/",
"type": "Microsoft.SecurityInsights/Entities",
"kind": "File",
"properties": {
"directory": "/home/azureuser",
"fileName": "eicar.com",
"fileHashEntityIds": [
"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-xxx-xxx/providers/Microsoft.OperationalInsights/workspaces/log-hubhnakada-JapanEast/providers/Microsoft.SecurityInsights/entities/",
"/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-xxx-xxx/providers/Microsoft.OperationalInsights/workspaces/log-hubhnakada-JapanEast/providers/Microsoft.SecurityInsights/entities/"
],
"additionalData": {
"MdatpDeviceId": "95ffd3240bde37ef347cf836db74b13f85cbf185",
"DetectionStatus": "prevented"
},
"friendlyName": "eicar.com"
}
},
{
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg-xxx-xxx/providers/Microsoft.OperationalInsights/workspaces/log-hubhnakada-JapanEast/providers/Microsoft.SecurityInsights/Entities/",
"type": "Microsoft.SecurityInsights/Entities",
"kind": "FileHash",
"properties": {
"hashValue": "3395856ce81f2b7382dee72602f798b642f14140",
"algorithm": "SHA1",
"friendlyName": "3395856ce81f2b7382dee72602f798b642f14140(SHA1)"
}
}
]
- この演習では、Defender XDR に対してホスト情報を用いて Advanced Hunting クエリーを使用したいので、ホスト情報だけを抽出するため Sentinel 標準コネクタ「エンティティ - ホストを取得」を用います
- コネクタが追加されましたら、トリガーとなった Sentinel の「エンティティ」リストを適用します
- このコネクタを用いることで、エンティティの JSON アレイに含まれる情報のうち、
kind
=Host
条件のものだけを抽出出来たことが分かります
[
{
"dnsDomain": "rglnoiucbtnuzarcriubjs2azc.lx.internal.cloudapp.net",
"hostName": "vmlinuxcustomlog",
"osFamily": "Unknown",
"osVersion": "7.9",
"additionalData": {
"MdatpDeviceId": "95ffd3240bde37ef347cf836db74b13f85cbf185",
"DeviceDnsName": "vmlinuxcustomlog.rglnoiucbtnuzarcriubjs2azc.lx.internal.cloudapp.net",
"RiskScore": "informational",
"HealthStatus": "active",
"FirstSeenDateTime": "2023-09-04T03:29:26.736412+00:00",
"RbacGroupName": "Servers",
"DefenderAvStatus": "notSupported",
"OnboardingStatus": "onboarded"
},
"friendlyName": "vmlinuxcustomlog",
"Type": "host"
},
{
"dnsDomain": "(以後省略)",
},
"additionalData": {
"friendlyName": "(以後省略)",
"Type": "(以後省略)"
}
]
JSON アレイのエンティティ情報をループ処理させる
- 前プロセスで Host 条件のエンティティ情報だけ抽出が出来ましたが、エンティティには複数の Host 情報が含まれる可能性があるため JSON アレイ型になっています
- JSON アレイの情報をループ処理させるために For Each ループを用います
- 「ビルトイン」-> 「制御」-> 「For Each」を選択して下さい。
- For Each 処理は JSON アレイを入れることで、JSON フィールド毎に分解されます。先に設定した JSON アレイ変数を設定しましょう
- For Each 処理をすることで、前述のJSONアレイは分解され、JSON フィールド毎に処理されます(アレイが外れます)
{
"dnsDomain": "rglnoiucbtnuzarcriubjs2azc.lx.internal.cloudapp.net",
"hostName": "vmlinuxcustomlog",
"osFamily": "Unknown",
"osVersion": "7.9",
"additionalData": {
"MdatpDeviceId": "95ffd3240bde37ef347cf836db74b13f85cbf185",
"DeviceDnsName": "vmlinuxcustomlog.rglnoiucbtnuzarcriubjs2azc.lx.internal.cloudapp.net",
"RiskScore": "informational",
"HealthStatus": "active",
"FirstSeenDateTime": "2023-09-04T03:29:26.736412+00:00",
"RbacGroupName": "Servers",
"DefenderAvStatus": "notSupported",
"OnboardingStatus": "onboarded"
},
"friendlyName": "vmlinuxcustomlog",
"Type": "host"
}
演習2と同じ内容で Advanced Hunting Query を設定しましょう
- 目的となる JSON 情報に分解出来たので、Defender ATP コネクタを接続して、Advanced Hunting Query を設定します
- ロジックアプリのフロー Defender XDR コネクタを追加
- 「詳細な検索」を選択
- テナント接続が出てきますので、Entra ID 認証を用いて接続
- Hunting Query は演習2 と同様なものか、ホスト情報を条件に出来るクエリーを設定して下さい
DeviceTvmSoftwareVulnerabilities
| where DeviceName contains "(ホスト名)"
| where VulnerabilitySeverityLevel == @"High"
| where RecommendedSecurityUpdate != ""
| distinct RecommendedSecurityUpdate, RecommendedSecurityUpdateId, SoftwareVendor, SoftwareName, SoftwareVersion
DeviceTvmSoftwareInventory
| where DeviceName contains "(ホスト名)"
| distinct SoftwareVendor,SoftwareName,SoftwareVersion
- ハンティングクエリーを設定する際に、For Each 処理によって JSON アレイから分解されたJSONフィールドの情報をマッピングします
- ロジックアプリは賢いので、For Each 処理前のプロセスである **エンティティ - ホストを取得「ホスト ホスト名」**を選択した場合でも、自動的に
items('For_each')?['HostName']
に変換してくれます!
- ロジックアプリは賢いので、For Each 処理前のプロセスである **エンティティ - ホストを取得「ホスト ホスト名」**を選択した場合でも、自動的に
- For Each 処理後のエンティティ抽出は式から JSON 起票で設定することも可能です。
- JSON の設定イメージは以下図を参考にしてください
- https://jpazinteg.github.io/blog/LogicApps/how-to-treat-json-in-logicApps/
- クエリーが設定出来ましたら、過去のトリガーを再生してテストを行って下さい
- エンティティのホスト情報が反映されて、Advanced Hunting Query 結果が返ってくれば成功です!
JSON -> HTML 変換、メール通知 / Teams 通知を実践してみましょう
- 演習2 と同様に、得られた結果を通知しましょう!!
お疲れ様でした!
- この演習では以下を実践していただきました
- Microsoft Sentinel コネクタのインシデント情報から JSON アレイを抽出する
- JSON アレイを処理するために For Each 処理を用いる
- For Each 処理で分解された個々の JSON 情報を元に Defender ATP コネクタを用いてクエリーを実行する
- [オプション] 得られた結果を成型して外部通知する
- まだまだあるよ!次の演習もやってみよう!