使用 Azure PowerShell 创建策略分配以识别不符合的资源

若要了解 Azure 中的符合性,第一步是确定资源的状态。 在本快速入门中,我们将创建策略分配,以识别未使用托管磁盘的虚拟机。 完成后,我们可以使用该策略分配来识别不合规的虚拟机。

Azure PowerShell 模块用于从命令行或脚本创建和管理 Azure 资源。 本指南介绍如何使用 Az 来创建策略分配。 该策略可识别 Azure 环境中的不合规资源。

如果没有 Azure 订阅,请在开始前创建一个试用帐户

Note

本文最近进行了更新,以便使用新 Azure PowerShell Az 模块的命令。

先决条件

  • 安装 ARMClient(如果尚未安装)。 该工具可将 HTTP 请求发送到基于 Azure 资源管理器的 API。
  • 在开始之前,请确保安装 Azure PowerShell 的最新版本。 有关详细信息,请参阅安装 Azure PowerShell 模块
  • 将 AzureRM PowerShell 模块更新到最新版本。 如果需要进行安装或升级,请参阅安装 Azure PowerShell 模块
  • 使用 Azure PowerShell 注册 Policy Insights 资源提供程序。 注册此资源提供程序可确保订阅能够使用它。 要注册资源提供程序,必须具有注册资源提供程序操作的权限。 此操作包含在“参与者”和“所有者”角色中。 运行以下命令,注册资源提供程序:

    Register-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights'
    

    有关注册和查看资源提供程序的详细信息,请参阅资源提供程序和类型

创建策略分配

本快速入门将创建策略分配,并分配“审核未使用托管磁盘的虚拟机”定义。 此策略定义可识别不符合策略定义中设置的条件的资源。

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

$rg = Get-AzResourceGroup -Name '<resourceGroupName>'
$definition = Get-AzPolicyDefinition | Where-Object { $_.Properties.DisplayName -eq 'Audit VMs that do not use managed disks' }
New-AzPolicyAssignment -Name 'audit-vm-manageddisks' -DisplayName 'Audit VMs without managed disks Assignment' -Scope $rg.ResourceId -PolicyDefinition $definition

上述命令使用以下信息:

  • 名称 - 分配的实际名称。 对于此示例,使用 audit-vm-manageddisks
  • 显示名称 - 策略分配的显示名称。 本例使用了“审核未使用托管磁盘分配的虚拟机”。
  • 定义 - 策略定义,用作创建分配的依据。 在本例中,它为策略定义“审核未使用托管磁盘的 VM”的 ID。
  • 范围 - 范围确定在其中实施策略分配的资源或资源组。 它可以从订阅延伸至资源组。 请务必将 <scope> 替换为资源组的名称。

你现已准备好识别不合规的资源,了解环境的符合性状态。

识别不合规的资源

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

$policyAssignment = Get-AzPolicyAssignment | Where-Object { $_.Properties.DisplayName -eq 'Audit VMs without managed disks Assignment' }
$policyAssignment.PolicyAssignmentId

有关策略分配 ID 的详细信息,请参阅 Get-AzPolicyAssignment

接下来,运行以下命令,获取输出到 JSON 文件中的不合规资源的资源 ID:

armclient post "/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2017-12-12-preview&$filter=IsCompliant eq false and PolicyAssignmentId eq '<policyAssignmentID>'&$apply=groupby((ResourceId))" > <json file to direct the output with the resource IDs into>

结果应如以下示例所示:

{
    "@odata.context": "https://management.chinacloudapi.cn/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest",
    "@odata.count": 3,
    "value": [{
            "@odata.id": null,
            "@odata.context": "https://management.chinacloudapi.cn/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
            "ResourceId": "/subscriptions/<subscriptionId>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachineId>"
        },
        {
            "@odata.id": null,
            "@odata.context": "https://management.chinacloudapi.cn/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
            "ResourceId": "/subscriptions/<subscriptionId>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachine2Id>"
        },
        {
            "@odata.id": null,
            "@odata.context": "https://management.chinacloudapi.cn/subscriptions/<subscriptionId>/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
            "ResourceId": "/subscriptions/<subscriptionName>/resourcegroups/<rgname>/providers/microsoft.compute/virtualmachines/<virtualmachine3ID>"
        }

    ]
}

这些结果与 Azure 门户视图中“不合规资源”下通常所列的结果类似。

清理资源

要删除创建的分配,请使用以下命令:

Remove-AzPolicyAssignment -Name 'audit-vm-manageddisks' -Scope '/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>'

后续步骤

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

要了解有关分配策略以验证新资源是否符合要求的详细信息,请继续以下教程: