快速入门:使用 Bicep 文件创建策略分配以识别不合规的资源

在本快速入门中,你将使用 Bicep 文件创建一个策略分配来验证资源是否符合 Azure 策略。 策略分配给资源组,并对不使用托管磁盘的虚拟机进行审核。 创建策略分配后,可以识别不合规的虚拟机。

Bicep 是一种特定于域的语言 (DSL),使用声明性语法来部署 Azure 资源。 它提供简明的语法、可靠的类型安全性以及对代码重用的支持。 Bicep 会针对你的 Azure 基础结构即代码解决方案提供最佳创作体验。

先决条件

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

查阅 Bicep 文件

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

创建以下 Bicep 文件作为 policy-assignment.bicep

  1. 打开 Visual Studio Code 并选择“文件”>“新建文本文件”
  2. 将 Bicep 文件复制并粘贴到 Visual Studio Code 中。
  3. 选择“文件”>“保存”,并使用文件名 policy-assignment.bicep
param policyAssignmentName string = 'audit-vm-managed-disks'
param policyDefinitionID string = '/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d'
param policyDisplayName string = 'Audit VM managed disks'

resource assignment 'Microsoft.Authorization/policyAssignments@2023-04-01' = {
  name: policyAssignmentName
  scope: resourceGroup()
  properties: {
    policyDefinitionId: policyDefinitionID
    description: 'Policy assignment to resource group scope created with Bicep file'
    displayName: policyDisplayName
    nonComplianceMessages: [
      {
        message: 'Virtual machines should use managed disks'
      }
    ]
  }
}

output assignmentId string = assignment.id

Bicep 文件中定义的资源类型为 Microsoft.Authorization/policyAssignments

Bicep 文件使用三个参数以部署策略分配:

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

有关 Bicep 文件的详细信息:

部署 Bicep 文件

可以使用 Azure PowerShell 或 Azure CLI 部署 Bicep 文件。

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

Connect-AzAccount -Environment AzureChinaCloud

# 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.bicep'
}

New-AzResourceGroupDeployment @deployparms

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

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

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

该命令使用 $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/20/2024 18:55:45
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 环境中的不合规资源。

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