1. はじめに
Microsoft Defender for Servers は、Azure VM / VMSS / Arc Machine に対する脆弱性評価やエンドポイント保護(MDE 統合)などを提供するセキュリティ機能です。プランには P1(基本的なエンドポイント保護) と P2(脆弱性評価・JIT・適応型セキュリティ等のフル機能) の2段階があり、「各 VM がどのプランで保護されているか」をリソース単位で一元的に把握するのが意外と難しいという課題があります。
本記事では、Azure Policy カスタム定義とイニシアティブを使って、各 VM のリソース単位での Defender for Servers の P1/P2 有効化状態を継続的に監査する方法を紹介します。
本記事で紹介するカスタムポリシー・ARM テンプレートの具体的な内容は、以下の GitHub リポジトリにて公開しています。Deploy to Azure ボタンからワンクリックでデプロイも可能です。
https://github.com/hisashin0728/Check-DefenderForServersResourceLevel
本記事は生成 AI の力を借りて作成しました。
2. Defender for Servers の P1/P2 プラン
Microsoft Defender for Servers は用途に応じて P1/P2 のライセンスが提供されています。二つのライセンスの比較は以下の通りです。
2.1 プランの違い
| プラン | 主な機能 | 設定可能なスコープ |
|---|---|---|
| P1 | MDE 統合、エンドポイント保護 | サブスクリプション単位 / リソース単位 |
| P2 | P1 の全機能 + 脆弱性評価、JIT VM アクセス、適応型アプリケーション制御、エージェントレススキャン等 | サブスクリプション単位のみ |
2.2 Pricing API でリソース単位の状態を確認する
Defender for Cloud の Pricings - Get API を使うと、各 VM に対する Defender for Servers の有効化状態をリソース単位で確認できます。
GET https://management.azure.com/{vmResourceId}/providers/Microsoft.Security/pricings/VirtualMachines?api-version=2024-01-01
レスポンス例:
{
"id": "/subscriptions/.../providers/Microsoft.Compute/virtualMachines/VM-1/providers/Microsoft.Security/pricings/VirtualMachines",
"name": "VirtualMachines",
"type": "Microsoft.Security/pricings",
"properties": {
"pricingTier": "Standard",
"subPlan": "P2",
"freeTrialRemainingTime": "PT0S",
"enablementTime": "2023-03-01T12:42:42.1921106Z",
"inherited": "True",
"inheritedFrom": "/subscriptions/20ff7fc3-e762-44dd-bd96-b71116dcdc23",
"extensions": [
{
"name": "AgentlessVmScanning",
"isEnabled": "True"
},
{
"name": "MdeDesignatedSubscription",
"isEnabled": "True"
}
]
}
}
ここで重要なプロパティは以下の通りです。
| プロパティ | 意味 |
|---|---|
pricingTier |
Free(無効)/ Standard(有効) |
subPlan |
P1 または P2
|
inherited |
True の場合、サブスクリプションから設定を継承 |
inheritedFrom |
継承元のスコープ ID |
3. Azure Policy で P1/P2 を検出する仕組み
3.1 ポリシーエイリアスの存在
Azure Policy で Microsoft.Security/pricings のプロパティを参照するには、対応するポリシーエイリアスが必要です。Get-AzPolicyAlias で確認すると、Microsoft.Security/pricings/pricingTier と Microsoft.Security/pricings/subPlan のエイリアスが登録されていることが分かります。
これにより、Azure Policy の AuditIfNotExists で VM ごとの pricingTier(Free / Standard)と subPlan(P1 / P2)をチェックできます。
3.2 なぜ P1/P2 を1つのポリシーで判別できないのか
AuditIfNotExists は「条件を満たすか/満たさないか」の 二値判定 です。1つのポリシーでは subPlan == "P1" か subPlan == "P2" のどちらか一方しかチェックできません。
そこで、P1 チェック用と P2 チェック用の2つのポリシーを作成し、イニシアティブで束ねるアプローチを採用します。
イニシアティブ: Defender for Servers P1/P2 Coverage
├─ ポリシー1: P1 チェック(pricingTier == "Standard" かつ subPlan == "P1")
└─ ポリシー2: P2 チェック(pricingTier == "Standard" かつ subPlan == "P2")
各ポリシーの具体的な JSON 定義や ARM テンプレートは GitHub リポジトリ を参照してください。
4. 試してみる
4.1 現状を確認する — Pricing API でリソース単位の状態を見てみる
まずは、対象の VM に対する Defender for Servers の現在の状態を REST API で確認してみます。
# VM のリソース ID を指定
$vmResourceId = "/subscriptions/<Sub>/resourceGroups/<RG>/providers/Microsoft.Compute/virtualMachines/<VM>"
az rest --method get `
--url "https://management.azure.com${vmResourceId}/providers/Microsoft.Security/pricings/VirtualMachines?api-version=2024-01-01"
レスポンスで pricingTier、subPlan、inherited が返されます。
4.2 Azure Portal からデプロイする(Deploy to Azure ボタン)
ARM テンプレートを用意しているため、Azure Portal から Deploy to Azure ボタン一発でデプロイできます。
イニシアティブ一括デプロイ(推奨)
P1/P2 両方のポリシー定義 + イニシアティブ + 割り当てを一括デプロイします。
ボタンをクリックすると、Azure Portal のカスタムデプロイ画面が開きます。
以下のパラメーターを設定します。
| パラメーター | デフォルト | 説明 |
|---|---|---|
effectP1 |
AuditIfNotExists |
P1 チェックポリシーの Effect |
effectP2 |
AuditIfNotExists |
P2 チェックポリシーの Effect |
assignInitiative |
true |
true にするとイニシアティブの割り当ても同時に実施 |
パラメーターを確認したら 「確認と作成」 → 「作成」 をクリックします。
デプロイが完了すると、成功メッセージが表示されます。
4.3 デプロイ結果を確認する
ポリシー定義の確認
Azure Portal で ポリシー → 定義 を開き、カテゴリ「Security Center」でフィルタすると、作成されたポリシー定義を確認できます。
イニシアティブ定義の確認
同じくポリシー定義画面で、種類を「イニシアティブ」に切り替えると、作成されたイニシアティブを確認できます。
割り当ての確認
ポリシー → 割り当て を開くと、イニシアティブが管理グループに割り当てられていることを確認できます。
4.4 コンプライアンス評価を実行する
ポリシーの割り当て直後はまだ評価が実行されていません。通常の評価サイクルは約24時間ですが、az policy state trigger-scan で即時評価をトリガーできます。
# 同期実行(完了まで待機 — 数分かかります)
az policy state trigger-scan --subscription <Subscription ID>
--no-wait(非同期)でトリガーした場合、スキャン完了前に結果を取得すると古いキャッシュの値が返ることがあります。正確な結果が必要な場合は同期実行を推奨します。
4.5 コンプライアンス結果を確認する
Azure Portal で確認する
ポリシー → コンプライアンス を開くと、イニシアティブのコンプライアンス状態が表示されます。
イニシアティブをクリックすると、P1 ポリシーと P2 ポリシーそれぞれの結果を確認できます。
さらにポリシーをクリックすると、リソース単位の結果が一覧で確認できます。
結果の読み方
2つのポリシーの結果を組み合わせることで、各 VM の状態を正確に把握できます。
P1 ポリシー P2 ポリシー 解釈
───────────────────────────────────────────────────────
Compliant NonCompliant → P1 で保護中
NonCompliant Compliant → P2 で保護中(フル機能)
NonCompliant NonCompliant → ❌ Defender 無効(要対応)
P1 と P2 は排他的なため、両方が同時に Compliant になることはありません。両方とも NonCompliant の場合、その VM は Defender for Servers が有効化されていない(Free tier)ことを意味します。
Azure CLI で確認する
コマンドラインで結果を取得することもできます。
# P1 ポリシーの結果確認
az policy state list `
--subscription <Subscription ID> `
--filter "policyDefinitionName eq 'custom-defender-for-servers-p1-audit'" `
--query "[].{resource:resourceId, compliant:complianceState}" `
-o table
# P2 ポリシーの結果確認
az policy state list `
--subscription <Subscription ID> `
--filter "policyDefinitionName eq 'custom-defender-for-servers-p2-audit'" `
--query "[].{resource:resourceId, compliant:complianceState}" `
-o table
4.6 NonCompliant リソースの詳細を確認する
NonCompliant と判定された VM について、Pricing API で直接設定値を確認できます。
$vmResourceId = "/subscriptions/<Sub>/resourceGroups/<RG>/providers/Microsoft.Compute/virtualMachines/<VM>"
az rest --method get `
--url "https://management.azure.com${vmResourceId}/providers/Microsoft.Security/pricings/VirtualMachines?api-version=2024-01-01"
レスポンスの properties.pricingTier、properties.subPlan、properties.inherited を確認することで、その VM がどのプランでどのスコープから保護されているかを特定できます。
5. リソース単位の subPlan に関する注意事項
Pricing API のドキュメントには以下の記載があります。
For VirtualMachines plan, available sub plans are 'P1' & 'P2', where for resource level only 'P1' sub plan is supported.
つまり:
| 操作 | P1 | P2 |
|---|---|---|
| リソース単位で 設定 | ✅ 可能 | ❌ 不可(サブスクリプション単位のみ) |
| リソース単位で 読み取り(API) | ✅ 返される | ✅ 返される(inherited: "True") |
P2 はサブスクリプションレベルでのみ設定可能ですが、Pricing API の 読み取り ではサブスクリプションから継承された P2 も subPlan: "P2" + inherited: "True" として返されます。そのため、本ポリシーで P1/P2 の両方を正しく検出 できます。
リソース単位で P1 を直接設定している VM に対してサブスクリプション単位で P2 を有効化した場合、inherited: "False" のまま subPlan: "P1" が返る可能性があります。意図したプランが適用されているか、inherited / inheritedFrom も合わせて確認することを推奨します。
6. まとめ
- Defender for Servers の P1/P2 有効化状態をリソース単位で監査するには、
Microsoft.Security/pricingsのpricingTierとsubPlanをチェックするAuditIfNotExistsポリシーが有効 -
AuditIfNotExistsは二値判定のため、P1 用と P2 用の2つのポリシーを作成し、イニシアティブで束ねることで各 VM が P1 か P2 か未有効かを一目で識別できる - 対象リソースタイプは
Microsoft.Compute/virtualMachines、Microsoft.Compute/virtualMachineScaleSets、Microsoft.HybridCompute/machinesの3種 - P2 はサブスクリプション単位でのみ設定可能だが、Pricing API の読み取りでは継承された P2 も返されるため検出可能
-
az policy state trigger-scanでオンデマンド評価が可能(非同期ではなく同期実行推奨) - ARM テンプレートで P1/P2 ポリシー + イニシアティブ + 割り当てを一括デプロイ可能
*本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。





