次の方法で共有


Azure Policy を使用して Windows VM への拡張機能のインストールを制限する

自分の Windows VM で特定の拡張機能が使用またはインストールされないようにする必要がある場合は、PowerShell を使用して Azure Policy 定義を作成すると、リソース グループ内で VM の拡張機能を制限できます。

このチュートリアルでは、Cloud Shell で Azure PowerShell を使用します。このバージョンは常に更新され最新になっています。

規則ファイルを作成する

どの拡張機能をインストールできるようにするかを制限するには、拡張機能を特定するロジックを提供する規則が必要です。

この例では、Azure Cloud Shell で規則ファイルを作成することで、"Microsoft. Compute" によって発行された拡張機能を拒否する方法を示していますが、ローカルの PowerShell で作業している場合は、ローカル ファイルを作成して、パス ($home/clouddrive) を、ご利用のマシンのそのローカル ファイルへのパスに置き換えることもできます。

  1. Cloud Shell で、任意のテキスト エディターを使用してファイル $home/clouddrive/rules.json を作成します。

  2. 次の .json の内容をコピーして新しいファイルに貼り付け、保存します。

{
	"if": {
		"allOf": [
			{
				"field": "type",
				"equals": "Microsoft.Compute/virtualMachines/extensions"
			},
			{
				"field": "Microsoft.Compute/virtualMachines/extensions/publisher",
				"equals": "Microsoft.Compute"
			},
			{
				"field": "Microsoft.Compute/virtualMachines/extensions/type",
				"in": "[parameters('notAllowedExtensions')]"
			}
		]
	},
	"then": {
		"effect": "deny"
	}
}

パラメーター ファイルを作成する

また、ブロックする拡張機能の一覧を渡すための構造体が自動的に作成されるように、パラメーター ファイルを作成する必要もあります。

この例では、Cloud Shell で VM 用のパラメーター ファイルを作成する方法を示していますが、ローカルの PowerShell で作業している場合は、ローカル ファイルを作成して、パス ($home/clouddrive) を、ご利用のマシンのそのローカル ファイルへのパスに置き換えることもできます。

  1. Cloud Shell で、任意のテキスト エディターを使用してファイル $home/clouddrive/parameters.json を作成します。

  2. 次の .json の内容をコピーして新しいファイルに貼り付け、保存します。

{
	"notAllowedExtensions": {
		"type": "Array",
		"metadata": {
			"description": "The list of extensions that will be denied.",
			"displayName": "Denied extension"
		}
	}
}

ポリシーの作成

ポリシー定義は、使用したい構成を格納するためのオブジェクトです。 ポリシー定義では、規則とパラメーター ファイルを使用してポリシーを定義します。 New-AzPolicyDefinition コマンドレットを使用してポリシー定義を作成します。

ポリシーの規則とパラメーターは、ご自身のクラウド シェルで、.json ファイルとして作成し格納したファイルです。 必要に応じて例の -Policy-Parameter のファイル パスを置き換えてください。

$definition = New-AzPolicyDefinition `
   -Name "not-allowed-vmextension-windows" `
   -DisplayName "Not allowed VM Extensions" `
   -description "This policy governs which VM extensions that are explicitly denied."   `
   -Policy 'C:\Users\ContainerAdministrator\clouddrive\rules.json' `
   -Parameter 'C:\Users\ContainerAdministrator\clouddrive\parameters.json'

ポリシーを割り当てる

この例では、New-AzPolicyAssignment を使用して、ポリシーをリソース グループに割り当てます。 myResourceGroup リソース グループに作成された VM はどれも、VM Access Agent やカスタム スクリプト拡張機能をインストールできません。

Get-AzSubscription | Format-Table コマンドレットを使用して、この例にあるものの代わりに使用するサブスクリプション ID を取得します。

$scope = "/subscriptions/<subscription id>/resourceGroups/myResourceGroup"
$assignment = New-AzPolicyAssignment `
   -Name "not-allowed-vmextension-windows" `
   -Scope $scope `
   -PolicyDefinition $definition `
   -PolicyParameter '{
    "notAllowedExtensions": {
        "value": [
            "VMAccessAgent",
            "CustomScriptExtension"
        ]
    }
}'
$assignment

ポリシーをテストする

ポリシーをテストするために、VM Access 拡張機能を使用してみます。 "Set-AzVMAccessExtension: リソース 'myVMAccess' はポリシーにより許可されませんでした" というメッセージが表示され、失敗します。

Set-AzVMAccessExtension `
   -ResourceGroupName "myResourceGroup" `
   -VMName "myVM" `
   -Name "myVMAccess" `
   -Location EastUS

ポータルではパスワードの変更が失敗し、"ポリシー違反のためテンプレートのデプロイに失敗しました" というメッセージが表示されます。

割り当てを解除する

Remove-AzPolicyAssignment -Name not-allowed-vmextension-windows -Scope $scope

ポリシーを削除する

Remove-AzPolicyDefinition -Name not-allowed-vmextension-windows

次のステップ

詳細については、Azure Policy に関するページをご覧ください。