Microsoft Defender for Cloud に複数の連続エクスポートを設定する

azure
Published: 2022-10-19

はじめに

Microsoft Defender for Cloud には、推奨事項やアラートなどの検出結果を Log Analytics や EventHub に送信する連続エクスポートという機能があります。

Microsoft Defender for Cloud データを継続的にエクスポートする

ポータルから簡単に設定できるのですが、ポータルからではエクスポート先を Log Analytics と Event Hub それぞれ1つしか設定できません。

「複数設定できないのか?」とドキュメントを読んだ結果、API であれば複数の連続エクスポートを設定できそうなので試してみました。

より大きなボリューム - API を使用して 1 つのサブスクリプションに複数のエクスポート構成を作成できます。 Azure portal の [連続エクスポート] ページでは、サブスクリプションごとに 1 つのエクスポート構成のみがサポートされます。

REST API を使用して連続エクスポートを構成する

設定

/subscriptions/YOUR-SUB-ID/resourceGroups/YOUR-RG-NAME/providers/Microsoft.Security/automations/NAME?api-version=2019-01-01-preview に対して連続エクスポートの設定を記載した JSON を PUT します。JSON のサンプルは次の通りです。

$subID = "YOUR-SUBSCRIPTION-ID"
$rgName = "YOUR-RESOURCEGROUP-NAME"
$automationName = "YOUR-AUTOMATION-NAME"
$laId = "YOUR-LOGANALYTICS-ID"
$guid = "195a64a1-5869-4b41-96ba-4b45d62914b3"

$body = @{
    location   = "japaneast"
    etag = $guid
    tags = @{}
    properties = @{
        description = "1014test01"
        isEnabled   = $true
        scopes      = @(
            @{
                scopePath = "/subscriptions/$subID"
                description = "scope for /subscriptions/$subID"
            }
        )
        sources     = @(
            @{
                EventSource = "Assessments"
                RuleSets    = @(
                    @{
                        Rules = @(
                            @{
                                PropertyJPath    = "type"
                                PropertyType     = "String"
                                ExpectedValue    = "Microsoft.Security/assessments"
                                operator = "Contains"        
                            }
                        )
                    }
                )

            }
            @{
                EventSource = "AssessmentsSnapshot"
                RuleSets    = @(
                    @{
                        Rules = @(
                            @{
                                PropertyJPath    = "type"
                                PropertyType     = "String"
                                ExpectedValue    = "Microsoft.Security/assessments"
                                operator = "Contains"        
                            }
                        )
                    }
                )
            }
            @{
                EventSource = "SubAssessments"
                RuleSets    = $null
            }
            @{
                EventSource = "SubAssessmentsSnapshot"
                RuleSets    = $null

            }
            @{
                EventSource = "Alerts"
                RuleSets    = @(
                    @{
                        Rules = @(
                            @{
                                PropertyJPath    = "Severity"
                                PropertyType     = "String"
                                ExpectedValue    = "low"
                                operator = "Equals"        
                            }
                            @{
                                PropertyJPath    = "Severity"
                                PropertyType     = "String"
                                ExpectedValue    = "medium"
                                operator = "Equals"        
                            }
                            @{
                                PropertyJPath    = "Severity"
                                PropertyType     = "String"
                                ExpectedValue    = "informational"
                                operator = "Equals"        
                            }
                            @{
                                PropertyJPath    = "Severity"
                                PropertyType     = "String"
                                ExpectedValue    = "high"
                                operator = "Equals"        
                            }
                        )
                    }
                )
            }
            @{
                EventSource = "SecureScores"
                RuleSets    = $null

            }
            @{
                EventSource = "SecureScoresSnapshot"
                RuleSets    = $null

            }
            @{
                EventSource = "SecureScoreControls"
                RuleSets    = $null

            }
            @{
                EventSource = "SecureScoreControlsSnapshot"
                RuleSets    = $null

            }
            @{
                EventSource = "RegulatoryComplianceAssessment"
                RuleSets    = $null

            }
            @{
                EventSource = "RegulatoryComplianceAssessmentSnapshot"
                RuleSets    = $null

            }
            
        )
        actions     = @(
            @{
                workspaceResourceId = $laId
                actionType = "Workspace"
            }
        )
    }
} | ConvertTo-Json -Depth 100

Invoke-azrest -Path "/subscriptions/$subID/resourceGroups/$rgName/providers/Microsoft.Security/automations/$automationName`?api-version=2019-01-01-preview" -Method PUT -Payload $body

動作確認

PowerShell を利用して、ポータルで連続エクスポートを設定済みの Microsoft Defender for Cloud に対して、エクスポートする内容は同じだが出力先だけ違う設定を追加してみました。PowerShell を利用して、設定されてる連続エクスポートを確認できます。

> Get-AzSecurityAutomation | Select-Object Name, Actions | fl  

Name    : ExportToWorkspace
Actions : {/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-b1e2097edd51/resourcegroups/test/providers/microsoft.operationalinsights/workspaces/aaaa}      

Name    : export1
Actions : {/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-b1e2097edd51/resourceGroups/test0803/providers/Microsoft.OperationalInsights/workspaces/bbbb}  

複数の連続エクスポートを設定してもポータルから確認できるのは1つだけです。確認画面が変わることはありません。要注意。

それぞれの Log Analytics で連続エクスポートされるテーブルを検索してみると、同じ量の検査結果が書き込まれていることがわかります。

$queryA = @"
SecurityRecommendation
| where TimeGenerated > ago(12h)
| sort by TimeGenerated desc
| count
"@

$resA = Invoke-AzOperationalInsightsQuery `
    -WorkspaceId "xxxxxxxx-xxxx-xxxx-xxxx-784b931577df" ` 
    -Query $queryA

$queryB = @"
SecurityRecommendation
| where TimeGenerated > ago(12h)
| sort by TimeGenerated desc
| count
"@

$resB = Invoke-AzOperationalInsightsQuery `
    -WorkspaceId "xxxxxxxx-xxxx-xxxx-xxxx-29101610be96" `
    -Query $queryB

# ポータルで設定した Logic Analytics の検索結果
$resA.Results | ConvertTo-Csv         
Count
-----
22   

# PowerShell で設定した Logic Analytics の検索結果
$resB.Results | ConvertTo-Csv
Count
-----
22   

まとめ

API を利用して Defender for Cloud に複数の連続エクスポートを設定してみました。もし利用する場合には、「ポータルから複数の連続エクスポート設定が見れない」「POST で投げる JSON が大きい」という点にご注意してください