快速入门:使用 Azure PowerShell 创建策略分配以识别不符合的资源

若要了解 Azure 中的符合性,第一步是确定资源的状态。 本快速入门介绍如何使用 Azure PowerShell 创建策略分配以识别不合规的资源。 策略分配给资源组,并对不使用托管磁盘的虚拟机进行审核。 创建策略分配后,可以识别不合规的虚拟机。

Azure PowerShell 模块可用于从命令行或通过脚本管理 Azure 资源。 本文介绍如何使用 Azure PowerShell 来创建策略分配。

先决条件

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

连接到 Azure

从 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>

注册资源提供程序

注册资源提供程序后,可在 Azure 订阅中使用。

若要验证是否已注册 Microsoft.PolicyInsights,请运行 Get-AzResourceProvider。 资源提供程序包含多个资源类型。 如果结果为 NotRegistered,则运行 Register-AzResourceProvider

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

Register-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights'

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

创建策略分配

运行以下命令,为资源组创建新的策略分配。 此示例使用的现有资源组包含不带托管磁盘的虚拟机。 该资源组属于策略分配范围。 本示例使用内置策略定义“审核不使用托管磁盘的 VM”。

运行以下命令并将 <resourceGroupName> 替换为资源组名称:

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

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

$rg 变量存储资源组的属性,$definition 变量存储策略定义的属性。 后续命令中会用到这些属性。

运行以下命令创建策略分配:

$policyparms = @{
Name = 'audit-vm-managed-disks'
DisplayName = 'Audit VM managed disks'
Scope = $rg.ResourceId
PolicyDefinition = $definition
Description = 'Az PowerShell policy assignment to resource group'
}

New-AzPolicyAssignment @policyparms

$policyparms 变量使用散点来创建参数值并提高可读性。 New-AzPolicyAssignment 命令使用 $policyparms 变量中定义的参数值。

  • Name 创建分配的 ResourceId 中使用的策略分配名称。
  • DisplayName 是策略分配的名称,在 Azure 门户中可见。
  • Scope 使用 $rg.ResourceId 属性将策略分配给资源组。
  • PolicyDefinition 分配存储在 $definition 变量中的策略定义。
  • Description 可用于添加有关策略分配的上下文。

策略分配的结果类似于以下示例:

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

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

若要重新显示策略分配信息,请运行以下命令:

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

识别不合规的资源

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

使用以下命令来识别不符合所创建的策略分配的资源:

$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/14/2024 18:25:37
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 环境中的不合规资源。

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