你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 ARM 模板创建策略分配以识别不合规的资源

本快速入门介绍如何使用 Azure 资源管理器模板(ARM 模板)创建策略分配以验证资源是否符合 Azure 策略。 策略分配给资源组,并对不使用托管磁盘的虚拟机进行审核。 创建策略分配后,可以识别不合规的虚拟机。

Azure 资源管理器模板是定义项目基础结构和配置的 JavaScript 对象表示法 (JSON) 文件。 模板使用声明性语法。 你可以在不编写用于创建部署的编程命令序列的情况下,描述预期部署。

如果你的环境满足先决条件,并且你熟悉如何使用 ARM 模板,请选择“部署到 Azure”按钮。 模板将在 Azure 门户中打开。

“部署到 Azure”按钮的屏幕截图,其中显示了使用 Azure 资源管理器模板分配策略。

分配内置策略或计划定义时,可以选择引用一个版本。 内置定义的策略分配默认为最新版本,并将自动继承次要版本更改,除非另有指定。

先决条件

  • 如果没有 Azure 帐户,请在开始前创建一个免费帐户
  • Azure PowerShell 或 Azure CLI
  • Visual Studio CodeAzure 资源管理器 (ARM) 工具
  • 必须在 Azure 订阅中重新注册 Microsoft.PolicyInsights。 要注册资源提供程序,必须具有注册资源提供程序的权限。 此权限包含在“参与者”和“所有者”角色中。
  • 具有至少一个不使用托管磁盘的虚拟机的资源组。

查看模板

ARM 模板将为资源组范围创建策略分配,并分配不使用托管磁盘的内置策略定义审核 VM

创建以下 ARM 模板作为 policy-assignment.json。

  1. 打开 Visual Studio Code 并选择“文件”>“新建文本文件”
  2. 将 ARM 模板复制并粘贴到 Visual Studio Code 中。
  3. 选择“文件”>“保存”,并使用文件名 policy-assignment.json
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "policyAssignmentName": {
      "type": "string",
      "defaultValue": "audit-vm-managed-disks",
      "metadata": {
        "description": "Policy assignment name used in assignment's resource ID"
      }
    },
    "policyDefinitionID": {
      "type": "string",
      "defaultValue": "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d",
      "metadata": {
        "description": "Policy definition ID"
      }
    },
    "policyDisplayName": {
      "type": "string",
      "defaultValue": "Audit VM managed disks",
      "metadata": {
        "description": "Display name for Azure portal"
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "apiVersion": "2023-04-01",
      "name": "[parameters('policyAssignmentName')]",
      "properties": {
        "policyDefinitionId": "[parameters('policyDefinitionID')]",
        "description": "Policy assignment to resource group scope created with ARM template",
        "displayName": "[parameters('policyDisplayName')]",
        "nonComplianceMessages": [
          {
            "message": "Virtual machines should use managed disks"
          }
        ]
      }
    }
  ],
  "outputs": {
    "assignmentId": {
      "type": "string",
      "value": "[resourceId('Microsoft.Authorization/policyAssignments', parameters('policyAssignmentName'))]"
    }
  }
}

ARM 模板中定义的资源类型为 Microsoft.Authorization/policyAssignments

该模板使用三个参数以部署策略分配:

  • policyAssignmentName 创建名为 audit-vm-managed-disks 的策略分配
  • policyDefinitionID 使用内置策略定义的 ID。 有关参考,用于获取 ID 的命令位于用于部署模板的部分中。
  • policyDisplayName 创建显示在 Azure 门户中的显示名称。

有关 ARM 模板文件的详细信息:

部署 ARM 模板

可以使用 Azure PowerShell 或 Azure CLI 部署 ARM 模板。

从 Visual Studio Code 终端会话连接到 Azure。 如果具有多个订阅,请运行命令以将上下文设置为你的订阅。 将 <subscriptionID> 替换为你的 Azure 订阅 ID。

Connect-AzAccount

# Run these commands if you have multiple subscriptions
Get-AzSubScription
Set-AzContext -Subscription <subscriptionID>

你可以验证是否已注册 Microsoft.PolicyInsights。 如果没有,运行以下命令,注册资源提供程序。

Get-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights' |
   Select-Object -Property ResourceTypes, RegistrationState

Register-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights'

有关详细信息,请转到 Get-AzResourceProviderRegister-AzResourceProvider

以下命令显示 policyDefinitionID 参数的值:

(Get-AzPolicyDefinition |
  Where-Object { $_.Properties.DisplayName -eq 'Audit VMs that do not use managed disks' }).ResourceId

以下命令可向资源组部署策略定义。 使用资源组名替换 <resourceGroupName>

$rg = Get-AzResourceGroup -Name '<resourceGroupName>'

$deployparms = @{
Name = 'PolicyDeployment'
ResourceGroupName = $rg.ResourceGroupName
TemplateFile = 'policy-assignment.json'
}

New-AzResourceGroupDeployment @deployparms

$rg 变量存储资源组的属性。 $deployparms 变量使用散点来创建参数值并提高可读性。 New-AzResourceGroupDeployment 命令使用 $deployparms 变量中定义的参数值。

  • Name 是资源组部署显示在输出和 Azure 中的部署名称。
  • ResourceGroupName 使用 $rg.ResourceGroupName 属性获取分配到策略的资源组名称。
  • TemplateFile 指定 ARM 模板名称及其在本地计算机上的位置。

你可以使用以下命令验证策略分配的部署:

该命令使用 $rg.ResourceId 属性来获取资源组的 ID。

Get-AzPolicyAssignment -Name 'audit-vm-managed-disks' -Scope $rg.ResourceId
Name               : audit-vm-managed-disks
ResourceId         : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks
ResourceName       : audit-vm-managed-disks
ResourceGroupName  : {resourceGroupName}
ResourceType       : Microsoft.Authorization/policyAssignments
SubscriptionId     : {subscriptionId}
PolicyAssignmentId : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks
Properties         : Microsoft.Azure.Commands.ResourceManager.Cmdlets.Implementation.Policy.PsPolicyAssignmentProperties

有关详细信息,请转到 Get-AzPolicyAssignment

识别不合规的资源

部署策略分配后,将会审核部署到资源组的虚拟机是否符合托管磁盘策略。

新策略分配的“符合性状态”需要几分钟才会变为活动状态并提供关于策略状态的结果。

$complianceparms = @{
ResourceGroupName = $rg.ResourceGroupName
PolicyAssignmentName = 'audit-vm-managed-disks'
Filter = 'IsCompliant eq false'
}

Get-AzPolicyState @complianceparms

$complianceparms 变量创建在 Get-AzPolicyState 命令中使用的参数值。

  • ResourceGroupName$rg.ResourceGroupName 属性获取资源组名称。
  • PolicyAssignmentName 指定创建策略分配时使用的名称。
  • Filter 使用表达式查找不符合策略分配的资源。

结果应如以下示例所示并且 ComplianceState 将显示 NonCompliant

Timestamp                : 2/26/2024 19:02:56
ResourceId               : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.compute/virtualmachines/{vmId}
PolicyAssignmentId       : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.authorization/policyassignments/audit-vm-managed-disks
PolicyDefinitionId       : /providers/microsoft.authorization/policydefinitions/06a78e20-9358-41c9-923c-fb736d382a4d
IsCompliant              : False
SubscriptionId           : {subscriptionId}
ResourceType             : Microsoft.Compute/virtualMachines
ResourceLocation         : {location}
ResourceGroup            : {resourceGroupName}
ResourceTags             : tbd
PolicyAssignmentName     : audit-vm-managed-disks
PolicyAssignmentOwner    : tbd
PolicyAssignmentScope    : /subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}
PolicyDefinitionName     : 06a78e20-9358-41c9-923c-fb736d382a4d
PolicyDefinitionAction   : audit
PolicyDefinitionCategory : tbd
ManagementGroupIds       : {managementGroupId}
ComplianceState          : NonCompliant
AdditionalProperties     : {[complianceReasonCode, ]}

有关详细信息,请转到 Get-AzPolicyState

清理资源

Remove-AzPolicyAssignment -Name 'audit-vm-managed-disks' -Scope $rg.ResourceId

若要退出登录 Azure PowerShell 会话,请执行以下操作:

Disconnect-AzAccount

后续步骤

本快速入门已分配一个策略定义用于识别 Azure 环境中的不合规资源。

若要详细了解如何分配验证资源合规性的策略,请继续学习以下教程。