使用 Azure Policy 限制 Windows VM 上的扩展安装

如果想要阻止用户在 Windows VM 上使用或安装某些扩展,可以使用 PowerShell 创建 Azure Policy 定义以限制资源组中的 VM 扩展。

本教程在本地 Shell 中使用 Azure PowerShell,后者已不断更新到最新版本。

创建规则文件

若要限制可以安装哪些扩展,需要使用规则来提供用于识别扩展的逻辑。

本示例演示如何通过在 Azure 本地 Shell 中创建规则文件来拒绝“Microsoft.Compute”发布的扩展,但如果在本地 PowerShell 中操作,也可以创建一个本地文件并将路径 ($home/clouddrive) 替换为计算机上本地文件的路径。

notepad $home/clouddrive/rules.json

将以下 .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"
	}
}

创建参数文件

还需要一个参数文件,以创建一个用于传入要阻止的扩展列表的结构。

此示例演示如何在本地 PowerShell 中为 VM 创建参数文件。 如果在本地使用 PowerShell,也可以创建一个本地文件并将路径 ($home/clouddrive) 替换为计算机上本地文件的路径。

notepad $home/clouddrive/parameters.json

将以下 .json 内容复制并粘贴到文件中并保存:

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

创建策略

策略定义是用于存储想要使用的配置的对象。 策略定义使用规则和参数文件定义策略。 使用 New-AzPolicyDefinition cmdlet 创建策略定义。

策略规则和参数是在本地 shell 中创建并存储为 .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 访问代理扩展或自定义脚本扩展。

使用 Get-AzSubscription | Format-Table cmdlet 获取你的订阅 ID,以替换此示例中的订阅 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 访问扩展。 以下命令应失败并显示消息“Set-AzVMAccessExtension:策略不允许使用资源 'myVMAccess'”。

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

在门户中,密码更改将失败并显示消息“由于违反策略,模板部署失败”。

删除分配

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

删除策略

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

后续步骤

有关详细信息,请参阅 Azure Policy