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

快速入门:使用 REST API 创建策略分配以识别不合规资源

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

本指南使用 REST API 创建策略分配,并识别 Azure 环境中的不合规资源。 本文中的示例使用 PowerShell 和 Azure CLI az rest 命令。 还可以从 Bash shell(如 Git Bash)运行 az rest 命令。

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

先决条件

  • 如果没有 Azure 帐户,请在开始前创建一个免费帐户
  • 最新版本的 PowerShell 或 Bash shell(如 Git Bash)。
  • 最新版本的 Azure CLI
  • Visual Studio Code
  • 具有至少一个不使用托管磁盘的虚拟机的资源组。

查看 REST API 语法

运行 REST API 命令需要两个元素:REST API URI 和请求正文。 有关详细信息,请转到策略分配 - 创建

以下示例演示用于创建策略定义的 REST API URI 语法。

PUT https://management.azure.com/{scope}/providers/Microsoft.Authorization/policyAssignments/{policyAssignmentName}?api-version=2023-04-01
  • scope:作用域可确定要对哪些资源或资源组强制实施策略分配。 它的范围可以从管理组到单个资源。 将 {scope} 替换为以下某个模式:
    • 管理组:/providers/Microsoft.Management/managementGroups/{managementGroup}
    • 订阅:/subscriptions/{subscriptionId}
    • 资源组:/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}
    • 资源:/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/[{parentResourcePath}/]{resourceType}/{resourceName}
  • policyAssignmentName:为分配创建策略分配名称。 该名称包含在策略分配的 policyAssignmentId 属性中。

以下示例是用于创建请求正文文件的 JSON。

{
  "properties": {
    "displayName": "",
    "description": "",
    "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/11111111-1111-1111-1111-111111111111",
    "nonComplianceMessages": [
      {
        "message": ""
      }
    ]
  }
}
  • displayName:策略分配的显示名称。
  • description:可用于添加有关策略分配的上下文。
  • policyDefinitionId:用于创建分配的策略定义 ID。
  • nonComplianceMessages:设置当资源评估为不合规时要使用的消息。 有关详细信息,请参阅“分配不合规”消息

连接到 Azure

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

az login

# Run these commands if you have multiple subscriptions
az account list --output table
az account set --subscription <subscriptionID>

即使使用的是 PowerShell,也请使用 az login,因为示例使用 Azure CLI az rest 命令。

创建策略分配

在以下示例中,你将创建一个策略分配,并分配审核未使用托管磁盘的 VM 定义。

创建分配需要请求正文。 将以下 JSON 保存在名为 request-body.json 的文件中

{
  "properties": {
    "displayName": "Audit VM managed disks",
    "description": "Policy assignment to resource group scope created with REST API",
    "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/06a78e20-9358-41c9-923c-fb736d382a4d",
    "nonComplianceMessages": [
      {
        "message": "Virtual machines should use managed disks"
      }
    ]
  }
}

若要在现有资源组作用域内创建策略分配,请将以下 REST API URI 与请求正文文件一起使用。 将 {subscriptionId}{resourceGroupName} 替换为自定义值。 该命令将在 shell 中显示 JSON 输出。

az rest --method put --uri https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks?api-version=2023-04-01 --body `@request-body.json

在 PowerShell 中,需要使用反引号 (`) 来转义 at sign (@) 以指定文件名。 在 Bash shell(如 Git Bash)中,省略反引号。

有关详细信息,请转到策略分配 - 创建

识别不合规的资源

新策略分配的“符合性状态”需要几分钟才会变为活动状态并提供关于策略状态的结果。 请使用 REST API 显示此策略分配的不合规资源,并且输出采用 JSON 格式。

若要标识不合规的资源,请运行以下命令。 将 {subscriptionId}{resourceGroupName} 替换为创建策略分配时使用的值。

az rest --method post --uri https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.PolicyInsights/policyStates/latest/queryResults?api-version=2019-10-01 --uri-parameters `$filter="complianceState eq 'NonCompliant' and PolicyAssignmentName eq 'audit-vm-managed-disks'"

资源的 filter 查询被评估为不符合你使用策略分配创建的名为 audit-vm-management-disks 的策略定义。 同样,请注意,反引号用于在筛选器中转义美元符号 ($)。 对于 Bash 客户端,反斜杠 (\) 是一个常用的转义字符。

结果应如以下示例所示:

{
  "@odata.context": "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest",
  "@odata.count": 1,
  "@odata.nextLink": null,
  "value": [
    {
      "@odata.context": "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.PolicyInsights/policyStates/$metadata#latest/$entity",
      "@odata.id": null,
      "complianceReasonCode": "",
      "complianceState": "NonCompliant",
      "effectiveParameters": "",
      "isCompliant": false,
      "managementGroupIds": "",
      "policyAssignmentId": "/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.authorization/policyassignments/audit-vm-managed-disks",
      "policyAssignmentName": "audit-vm-managed-disks",
      "policyAssignmentOwner": "tbd",
      "policyAssignmentParameters": "",
      "policyAssignmentScope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}",
      "policyAssignmentVersion": "",
      "policyDefinitionAction": "audit",
      "policyDefinitionCategory": "tbd",
      "policyDefinitionGroupNames": [
        ""
      ],
      "policyDefinitionId": "/providers/microsoft.authorization/policydefinitions/06a78e20-9358-41c9-923c-fb736d382a4d",
      "policyDefinitionName": "06a78e20-9358-41c9-923c-fb736d382a4d",
      "policyDefinitionReferenceId": "",
      "policyDefinitionVersion": "1.0.0",
      "policySetDefinitionCategory": "",
      "policySetDefinitionId": "",
      "policySetDefinitionName": "",
      "policySetDefinitionOwner": "",
      "policySetDefinitionParameters": "",
      "policySetDefinitionVersion": "",
      "resourceGroup": "{resourceGroupName}",
      "resourceId": "/subscriptions/{subscriptionId}/resourcegroups/{resourceGroupName}/providers/microsoft.compute/virtualmachines/{vmName}>",
      "resourceLocation": "westus3",
      "resourceTags": "tbd",
      "resourceType": "Microsoft.Compute/virtualMachines",
      "subscriptionId": "{subscriptionId}",
      "timestamp": "2024-03-26T02:19:28.3720191Z"
    }
  ]
}

有关详细信息,请参阅策略状态 - 列出资源组的查询结果

清理资源

若要删除策略分配,请使用以下命令。 将 {subscriptionId}{resourceGroupName} 替换为创建策略分配时使用的值。 该命令将在 shell 中显示 JSON 输出。

az rest --method delete --uri https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks?api-version=2023-04-01

你可以使用以下命令验证策略分配是否已删除。 shell 中会显示一条消息。

az rest --method get --uri https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Authorization/policyAssignments/audit-vm-managed-disks?api-version=2023-04-01
The policy assignment 'audit-vm-managed-disks' is not found.

有关详细信息,请参阅策略分配 - 删除策略分配 - 获取

后续步骤

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

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