はじめに
Defender for Servers は、Azure VM や Azure Arc対応サーバーに対してリアルタイムの脅威保護やセキュリティ推奨事項を提供する Defender for Cloud の有料プランです。
Defender for Serversには P1(Plan 1)と P2(Plan 2)の2つのサブプランがあり、P1 は Microsoft Defender for Endpoint(以降MDE)との統合による EDR(Endpoint Detection and Response)機能を中心とした入門レベルのプランです。Defender for Servers(主にP1)については、こちらの記事で紹介しておりますので、よろしければご参照ください。
本記事では、Azure Policyを利用して、特定のリソースグループに対してDefender for Servers P1を自動的に有効化する方法を紹介します。
Defender for Serversのプランに関わらず、MDEはP2相当の機能が提供されます。
https://learn.microsoft.com/ja-jp/azure/defender-for-cloud/faq-defender-for-servers#defender-for-endpoint--
Defender for Serversを有効化するときの課題
Defender for Serversを有効化する一般的な方法は、Azureポータルから設定することです。
ただし、Azureポータルから有効化した場合、サブスクリプションレベルでDefender for Serversが有効になります。そのため、以下のような課題が発生します。
- 不要な課金の発生:保護したいサーバー以外も課金対象となり、余計なコストが発生します
- MDEの一括オンボード:Defender for Serversが有効化すると既定でMDEがオンボードされるため、稼働しているサーバーに意図しない影響を与える可能性があります
- 試験的な導入ができない:サブスクリプション単位で有効化されてしまうため、特定のサーバーに対して試験的に導入することができません
リソースレベルでの有効化
Defender for Serversでは、特定のリソースに限定してプランを有効・無効にする方法が提供されています。詳細は、以下の公式ドキュメントをご参照ください。(ただし、P2はリソース単位で有効化できません)
Defender for Servers P1を複数マシンで有効にする場合、スクリプトによる一括有効化と、ポリシー(Azure Policy)による有効化が提供されています。
Azure PolicyでDefender for Servers P1を有効にする
本記事では、次のポリシーを利用してDefender for Servers P1の有効化を構成します。
Azure Policyとは
Azure Policy は、Azure上のリソース設定を自動的にチェックし、特定のルールに違反していないかを継続的に評価するガバナンス機能です。リソース作成時や定期的なスキャンで構成(リソースの設定)を確認し、必要に応じて自動修復を実行します。Azure Policy自体は無料で利用できますが、自動修復によって有効化された機能やリソースに対しては費用が発生します。以降で、上記ポリシーの内容やポリシーの割り当て方法(設定方法)について解説していきます。
使用するポリシー定義
ポリシー定義はGitHubから確認できます。
{
"properties": {
"displayName": "Configure Azure Defender for Servers to be enabled (with 'P1' subplan) for all resources (resource level)",
"policyType": "BuiltIn",
"mode": "All",
"description": "Azure Defender for Servers provides real-time threat protection for server workloads and generates hardening recommendations as well as alerts about suspicious activities. This policy will enable the Defender for Servers plan (with 'P1' subplan) for all resources (VMs and ARC Machines) in the selected scope (subscription or resource group).",
"metadata": {
"version": "1.1.0",
"category": "Security Center - Granular Pricing"
},
"version": "1.1.0",
"parameters": {
"effect": {
"type": "String",
"metadata": {
"displayName": "Effect",
"description": "Enable or disable the execution of the policy"
},
"allowedValues": [
"DeployIfNotExists",
"Disabled"
],
"defaultValue": "DeployIfNotExists"
}
},
"policyRule": {
"if": {
"field": "type",
"in": [
"Microsoft.Compute/virtualMachines",
"Microsoft.HybridCompute/machines"
]
},
"then": {
"effect": "[parameters('effect')]",
"details": {
"type": "Microsoft.Security/pricings",
"name": "VirtualMachines",
"roleDefinitionIds": [
"/providers/Microsoft.Authorization/roleDefinitions/fb1c8493-542b-48eb-b624-b4c8fea62acd"
],
"existenceCondition": {
"allOf": [
{
"field": "Microsoft.Security/pricings/pricingTier",
"equals": "Standard"
},
{
"field": "Microsoft.Security/pricings/subPlan",
"equals": "P1"
}
]
},
"deployment": {
"properties": {
"mode": "incremental",
"parameters": {
"fullResourceName": {
"value": "[field('id')]"
}
},
"template": {
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"fullResourceName": {
"type": "string"
}
},
"variables": {},
"resources": [
{
"type": "Microsoft.Security/pricings",
"apiVersion": "2024-01-01",
"scope": "[parameters('fullResourceName')]",
"name": "VirtualMachines",
"properties": {
"subplan": "P1",
"pricingTier": "Standard"
}
}
],
"outputs": {}
}
}
}
}
}
},
"versions": [
"1.1.0",
"1.0.0"
]
},
"id": "/providers/Microsoft.Authorization/policyDefinitions/1b8c0040-b224-4ea1-be6a-47254dd5a207",
"name": "1b8c0040-b224-4ea1-be6a-47254dd5a207"
}
ポリシー定義の中身
ポリシー定義の中身について見ていきます。
ポリシーの基本情報
前半部分では、ポリシー定義のdisplayName(表示名)やdescription(説明)などの基本情報が定義されています。ここで理解しておくべきポイントはparametersの部分です。parameters には effect が1つだけ定義されています。effectの値としてDeployIfNotExistsと DisabledがallowedValuesとなっており、ユーザーがポリシーの割り当てを作成する際に選択できます。DeployIfNotExistsを選択すると、非準拠リソースに対してポリシーで定義されたARMテンプレートを実行し、Defender for Servers P1を有効にします。
{
"properties": {
"displayName": "すべてのリソース (リソース レベル) に対して Azure Defender for Servers ('P1' サブプラン) を有効にするように構成する",
"policyType": "BuiltIn",
"mode": "All",
"description": "Azure Defender for Servers により、サーバーのワークロードがリアルタイムで脅威から保護され、セキュリティ強化の推奨事項と、疑わしいアクティビティに関するアラートが生成されます。このポリシーは、選択したスコープ (サブスクリプションまたはリソース グループ) 内のすべてのリソース (VM と ARC マシン) に対して、Defender for Servers プラン ('P1' サブプラン) を有効にします。",
"metadata": {
"version": "1.1.0",
"category": "Security Center - Granular Pricing"
},
"version": "1.1.0",
"parameters": {
"effect": {
"type": "String",
"metadata": {
"displayName": "効果",
"description": "ポリシーの実行を有効または無効にします"
},
"allowedValues": [
"DeployIfNotExists",
"Disabled"
],
"defaultValue": "DeployIfNotExists"
}
},
どのリソースを対象にするか
ifセクションでは、どのリソースに対して判定を実行するかを定義しています。Defender for ServersはAzure VM、またはAzure Arc対応サーバーが保護対象となるため、本定義でも同リソースを対象に判定を実行します。
"if": {
"field": "type",
"in": [
"Microsoft.Compute/virtualMachines",
"Microsoft.HybridCompute/machines"
]
}
判定基準
detailsセクションでは、リソースがポリシーに準拠しているかを判定する基準を定義します。準拠していない場合、かつeffectでDeployIfNotExistsを選択している場合、修復タスクとしてARMテンプレートが実行されます。本ポリシーでは、pricingTier が Standard(有効)かつ subPlan が P1 であれば「準拠」と判定します。
"details": {
"type": "Microsoft.Security/pricings",
"name": "VirtualMachines",
"existenceCondition": {
"allOf": [
{ "field": "Microsoft.Security/pricings/pricingTier", "equals": "Standard" },
{ "field": "Microsoft.Security/pricings/subPlan", "equals": "P1" }
]
},
"roleDefinitionIds": [
"/providers/Microsoft.Authorization/roleDefinitions/fb1c8493-542b-48eb-b624-b4c8fea62acd"
]
}
非準拠時の対応
deploymentセクションでは、非準拠時に実行するARMテンプレートが定義されています。"value": "[field('id')]"部分で、非準拠VM のリソース IDを取得しています。mode: incremental は、テンプレートに書かれたリソースだけを追加・更新するモードです。
"deployment": {
"properties": {
"mode": "incremental",
"parameters": {
"fullResourceName": { "value": "[field('id')]" }
},
"template": {
"resources": [{
"type": "Microsoft.Security/pricings",
"apiVersion": "2024-01-01",
"scope": "[parameters('fullResourceName')]",
"name": "VirtualMachines",
"properties": {
"pricingTier": "Standard",
"subplan": "P1"
}
}]
}
}
}
ポリシー評価のタイミング
Azure Policyが特定のリソースに対して、ポリシーに準拠しているかを判定するタイミングは大きく以下の2つがあります。
①リソース作成・更新時
リソースの作成・更新時に評価が実行されます。リソースが準拠していないと判定された場合、自動的に修復(ARM テンプレートのデプロイ)まで実行されます。
②定期コンプライアンス評価
Azure Policy エンジンが約24時間ごとにサブスクリプション内の全リソースを対象にバックグラウンドで評価します。ただし、準拠していないリソースは「非準拠」としてマークされるだけで、自動修復は実行されません。Azure Policyでは修復タスクを作成するという機能があり、手動で修復(ARM テンプレートのデプロイ)を実行することが可能です。
①の評価時は、既定で10分の遅延を経て評価が実行されます。本設定は、DeployIfNotExistsのevaluationDelayオプションにて設定されます。本記事で扱うポリシーではevaluationDelayオプションが定義されていないため、既定の10分が適用されます。
【注意点】ポリシー評価で利用される権限
上記の通り、特定のタイミングでポリシー評価が実行されます。処理としては、評価フェーズと修復フェーズの2段階に分かれています。各フェーズで処理に必要な権限が必要です。各処理タイミングで利用される権限(ID)は、以下の通りです。
| 処理タイミング | ① リソース作成・更新時 | ② 定期コンプライアンス評価 |
|---|---|---|
| フェーズ1:評価 | 呼び出し元のID | Azure Policyの権限 |
| フェーズ2:修復 | マネージドID | マネージドID |
※②の修復はユーザーが修復タスクを作成した場合を指します
Azure Policyの権限は、Azure側で管理しているためユーザー側で意識する必要はありません。また、マネージドIDは修復時に利用されるため、pricingTierを上書きするための権限が必要となりますが、ポリシーの割り当て時にシステム割り当てマネージドID(既定値)を選択すれば自動で必要な権限(セキュリティ管理者)が付与されます。
注意が必要なのは、①の評価はリソース操作を行った呼び出し元IDの権限で実行されるということです。Azure VMの場合は、作成・更新処理をしたユーザーが呼び出し元のIDに該当しますが、pricingTierの読み取り権限も付与されていることが多いためあまり意識せずとも想定通りの動作になることが多いでしょう。
ですが、Azure Arc対応サーバーの場合は組み込みアプリケーションである「Hybrid RP Application」が呼び出し元のIDとなるため、当該アプリケーションに読み取り権限(セキュリティ閲覧者相当)の付与が必要です。本内容に関して直接的に言及しているドキュメントはありませんが、読み取り権限がない場合、次のようなエラーがアクティビティログに記録されます。
"errorMessage": "The user did not have permissions to GET the DeployIfNotExists policy's target type 'Microsoft.Security/pricings'."
ポリシーの割り当て
ポリシーの割り当てを行うことで、実際に特定のリソースグループに対し、Defender for Servers P1を有効にすることができます。ポリシーの割り当てを行うには、以下の手順に従います。
ポリシー定義から「Configure Azure Defender for Servers to be enabled (with 'P1' subplan) for all resources (resource level)」を選択します。「カテゴリ:Security Center - Granular Pricing」でフィルターすると探しやすいです。

必要に応じてその他設定を行い、「レビューと作成」を選択します。

対象のリソースグループ内で特定のリソースだけを対象外とする場合は、除外から該当のリソースを選択します。
ポリシーのバージョンで既定値「1.*.*」を選択した場合、最新のポリシー定義(2026/3/25時点では1.1.0)が利用されます。バージョンは以下のような定義となっています。
- X.0.0:メジャーバージョン(ルールロジックの大幅変更)
- 1.X.0:マイナーバージョン(ルールロジックのマイナー変更、新しいパラメーターの追加等)
- 1.1.X:パッチバージョン(文字列やメタデータの変更、セキュリティの緊急修正)
「1.*.*」を選択した場合、マイナーバージョンアップ、パッチバージョンアップ時はポリシーが自動で更新されるため、変更をコントロールしたい場合は、明示的にバージョンを選択してください。
動作確認
Azure VM、または、Azure Arc対応サーバーを作成して動作を確認します。Azure Arc対応サーバーの場合は、上記の注意点で触れている通り、事前に「Hybrid RP Application」に必要な権限を付与してください。
リソース作成後、10分ほど経過するとポリシーの評価・修復が実行されます。修復が実行されると、アクティビティログからpricingTierが更新されていることを確認できます。
拡張機能にもMDEがインストールされていることが確認できます。

導入時の検討ポイント
リソースグループの新規作成
本記事で紹介した方法を使ってDefender for Servers P1の有効化を検討するパターンとしては、既存リソースに影響を与えたくない場合や展開範囲を絞ってテストしたい場合が想定されます。そのため、基本的には新規にリソースグループを作成し、当該リソースグループを対象としてポリシーの割り当てをするのが良いでしょう。
APIによる個別有効化
展開範囲を絞る場合は、APIで個別に有効化する方法も選択できます。例えば、Azure Arc対応サーバーに対してAPIを実行する場合、以下のようなコマンドで実現できます。既存のリソース(数台)に対して有効化したい場合、API利用の方が簡単かと思います。
# 変数設定
subscriptionId="xxxxxxxxxxxxxxxxxxxxx"
resourceGroupName="xxxxxxxxxxxxxxxxxxxxx"
machineName="xxxxxxxxxxxxxxxxxxxxx"
# ARC ID指定
ARC_ID="/subscriptions/${subscriptionId}/resourceGroups/${resourceGroupName}/providers/Microsoft.HybridCompute/machines/${machineName}"
# 既存設定確認(Pricing TierがFreeであることを確認)
az rest --method get --url "https://management.azure.com${ARC_ID}/providers/Microsoft.Security/pricings/virtualMachines?api-version=2024-01-01"
# P1設定
az rest --method put \
--url "https://management.azure.com${ARC_ID}/providers/Microsoft.Security/pricings/virtualMachines?api-version=2024-01-01" \
--body '{
"properties": {
"pricingTier": "Standard",
"subPlan": "P1"
}
}'
# 設定確認(Pricing TierがP1に変更されたことを確認)
az rest --method get --url "https://management.azure.com${ARC_ID}/providers/Microsoft.Security/pricings/virtualMachines?api-version=2024-01-01"
既存VMの適用
新規にリソースグループを作成する場合は意識する必要はありませんが、既存のリソースに対しては自動修復が実行されないため注意が必要です。既存リソースに対して修復タスクを作成する場合は、以下ドキュメントの手順に従います。
P2の上書き
P2が有効になっているリソースに対して修復が行われるとP1に更新されてしまうため、注意が必要です。
さいごに
Defender for Serversを特定の範囲に絞って有効化したい場合、Azure Policyはかなり有用な選択肢になると思いました。スクリプトを利用しても一括で有効化はできますが、新規リソースを追加していくたびにスクリプトの実行が必要となるため、対象のリソースが増えていくことが想定される場合は、Azure Policyを利用するのがおすすめです。








