0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Azure VM に対して Microsoft Defender for Servers がリソース単位で P1/P2 有効化されているかどうか監視する

0
Last updated at Posted at 2026-04-24

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/pricingTierMicrosoft.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"

レスポンスで pricingTiersubPlaninherited が返されます。

4.2 Azure Portal からデプロイする(Deploy to Azure ボタン)

ARM テンプレートを用意しているため、Azure Portal から Deploy to Azure ボタン一発でデプロイできます。

イニシアティブ一括デプロイ(推奨)

P1/P2 両方のポリシー定義 + イニシアティブ + 割り当てを一括デプロイします。

Deploy to Azure

ボタンをクリックすると、Azure Portal のカスタムデプロイ画面が開きます。

以下のパラメーターを設定します。

パラメーター デフォルト 説明
effectP1 AuditIfNotExists P1 チェックポリシーの Effect
effectP2 AuditIfNotExists P2 チェックポリシーの Effect
assignInitiative true true にするとイニシアティブの割り当ても同時に実施

パラメーターを確認したら 「確認と作成」「作成」 をクリックします。
デプロイが完了すると、成功メッセージが表示されます。

P1 のみ / P2 のみを個別にデプロイしたい場合は、以下のボタンを使用してください。

P1 チェックポリシーのみ:
Deploy to Azure

P2 チェックポリシーのみ:
Deploy to Azure

4.3 デプロイ結果を確認する

ポリシー定義の確認

Azure Portal で ポリシー定義 を開き、カテゴリ「Security Center」でフィルタすると、作成されたポリシー定義を確認できます。

image.png

イニシアティブ定義の確認

同じくポリシー定義画面で、種類を「イニシアティブ」に切り替えると、作成されたイニシアティブを確認できます。

image.png

割り当ての確認

ポリシー割り当て を開くと、イニシアティブが管理グループに割り当てられていることを確認できます。

image.png

4.4 コンプライアンス評価を実行する

ポリシーの割り当て直後はまだ評価が実行されていません。通常の評価サイクルは約24時間ですが、az policy state trigger-scan で即時評価をトリガーできます。

# 同期実行(完了まで待機 — 数分かかります)
az policy state trigger-scan --subscription <Subscription ID>

--no-wait(非同期)でトリガーした場合、スキャン完了前に結果を取得すると古いキャッシュの値が返ることがあります。正確な結果が必要な場合は同期実行を推奨します。

4.5 コンプライアンス結果を確認する

Azure Portal で確認する

ポリシーコンプライアンス を開くと、イニシアティブのコンプライアンス状態が表示されます。

image.png

イニシアティブをクリックすると、P1 ポリシーと P2 ポリシーそれぞれの結果を確認できます。

image.png

さらにポリシーをクリックすると、リソース単位の結果が一覧で確認できます。

image.png

結果の読み方

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.pricingTierproperties.subPlanproperties.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/pricingspricingTiersubPlan をチェックする AuditIfNotExists ポリシーが有効
  • AuditIfNotExists は二値判定のため、P1 用と P2 用の2つのポリシーを作成し、イニシアティブで束ねることで各 VM が P1 か P2 か未有効かを一目で識別できる
  • 対象リソースタイプは Microsoft.Compute/virtualMachinesMicrosoft.Compute/virtualMachineScaleSetsMicrosoft.HybridCompute/machines の3種
  • P2 はサブスクリプション単位でのみ設定可能だが、Pricing API の読み取りでは継承された P2 も返されるため検出可能
  • az policy state trigger-scan でオンデマンド評価が可能(非同期ではなく同期実行推奨)
  • ARM テンプレートで P1/P2 ポリシー + イニシアティブ + 割り当てを一括デプロイ可能

*本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。


参考情報

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?