以编程方式创建策略

本文逐步讲解如何以编程方式创建和管理策略。 Azure Policy 定义对资源强制实施不同的规则和效果。 强制实施可确保资源始终符合企业标准和服务级别协议。

有关符合性的信息,请参阅获取符合性数据

先决条件

在开始之前,请确保满足以下先决条件:

  1. 安装 ARMClient(如果尚未安装)。 该工具可将 HTTP 请求发送到基于 Azure 资源管理器的 API。

  2. 将 Azure PowerShell 模块更新到最新版本。 有关详细信息,请参阅安装 Azure PowerShell 模块。 有关最新版本的详细信息,请参阅 Azure PowerShell

  3. 使用 Azure PowerShell 注册 Azure Policy Insights 资源提供程序,以确认订阅可使用资源提供程序正常工作。 若要注册资源提供程序,必须具有为资源提供程序运行注册操作所需的权限。 此操作包含在“参与者”和“所有者”角色中。 运行以下命令,注册资源提供程序:

    Register-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights'
    

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

  4. 安装 Azure CLI(如果尚未安装)。 可以通过在 Windows 上安装 Azure CLI 获取最新版本。

创建并分配策略定义

更清晰地洞察资源的第一步是针对资源创建并分配策略。 下一步是了解如何以编程方式创建和分配策略。 示例策略使用 PowerShell、Azure CLI 和 HTTP 请求来审核向所有公共网络开放的存储帐户。

使用 PowerShell 创建并分配策略定义

  1. 使用以下 JSON 代码片段创建名为 AuditStorageAccounts.json 的 JSON 文件。

    {
       "if": {
           "allOf": [{
                   "field": "type",
                   "equals": "Microsoft.Storage/storageAccounts"
               },
               {
                   "field": "Microsoft.Storage/storageAccounts/networkAcls.defaultAction",
                   "equals": "Allow"
               }
           ]
       },
       "then": {
           "effect": "audit"
       }
    }
    

    有关编写策略定义的详细信息,请参阅 Azure Policy 定义结构

  2. 运行以下命令,使用 AuditStorageAccounts.json 文件创建策略定义。

    New-AzPolicyDefinition -Name 'AuditStorageAccounts' -DisplayName 'Audit Storage Accounts Open to Public Networks' -Policy 'AuditStorageAccounts.json'
    

    该命令创建名为 Audit Storage Accounts Open to Public Networks 的策略定义。 有关可用的其他参数的详细信息,请参阅 New-AzPolicyDefinition

    在没有位置参数的情况下调用时,New-AzPolicyDefinition 默认将策略定义保存在会话上下文的选定订阅中。 若要将定义保存到其他位置,请使用以下参数:

    • SubscriptionId - 保存到其他订阅。 需要 GUID 值。
    • ManagementGroupName - 保存到管理组。 需要 字符串 值。
  3. 创建策略定义后,可运行以下命令创建策略分配:

    $rg = Get-AzResourceGroup -Name 'ContosoRG'
    $Policy = Get-AzPolicyDefinition -Name 'AuditStorageAccounts'
    New-AzPolicyAssignment -Name 'AuditStorageAccounts' -PolicyDefinition $Policy -Scope $rg.ResourceId
    

    ContosoRG 替换为所需资源组的名称。

    New-AzPolicyAssignment 的 Scope 参数适用于管理组、订阅、资源组或单个资源。 该参数使用完整资源路径,它将返回 Get-AzResourceGroupResourceId 属性。 每个容器的 范围 模式如下所示。 将 {rName}{rgName}{subId}{mgName} 分别替换为你的资源名称、资源组名称、订阅 ID 和管理组名称。 {rType} 将替换为资源的 资源类型,例如 VM 的 Microsoft.Compute/virtualMachines

    • 资源 - /subscriptions/{subID}/resourceGroups/{rgName}/providers/{rType}/{rName}
    • 资源组 - /subscriptions/{subId}/resourceGroups/{rgName}
    • 订阅 - /subscriptions/{subId}
    • 管理组 - /providers/Microsoft.Management/managementGroups/{mgName}

有关使用资源管理器 PowerShell 模块管理资源策略的详细信息,请参阅 Az.Resources

使用 ARMClient 创建并分配策略定义

使用以下过程创建策略定义。

  1. 复制以下 JSON 代码片段以创建 JSON 文件。 在下一步骤中将会调用该文件。

    "properties": {
       "displayName": "Audit Storage Accounts Open to Public Networks",
       "policyType": "Custom",
       "mode": "Indexed",
       "description": "This policy ensures that storage accounts with exposure to Public Networks are audited.",
       "parameters": {},
       "policyRule": {
           "if": {
               "allOf": [{
                       "field": "type",
                       "equals": "Microsoft.Storage/storageAccounts"
                   },
                   {
                       "field": "Microsoft.Storage/storageAccounts/networkAcls.defaultAction",
                       "equals": "Allow"
                   }
               ]
           },
           "then": {
               "effect": "audit"
           }
       }
    }
    
  2. 使用以下调用之一创建策略定义:

    # For defining a policy in a subscription
    armclient PUT "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyDefinitions/AuditStorageAccounts?api-version=2019-09-01" @<path to policy definition JSON file>
    
    # For defining a policy in a management group
    armclient PUT "/providers/Microsoft.Management/managementgroups/{managementGroupId}/providers/Microsoft.Authorization/policyDefinitions/AuditStorageAccounts?api-version=2019-09-01" @<path to policy definition JSON file>
    

    将前面的 {subscriptionId} 替换为你的订阅的 ID,或将 {managementGroupId} 替换为你的管理组的 ID。

    有关查询结构的详细信息,请参阅 Azure Policy 定义 - 创建或更新策略定义 - 在管理组中创建或更新

使用以下过程创建策略分配,并在资源组级别分配策略定义。

  1. 复制以下 JSON 代码片段以创建 JSON 策略分配文件。 请将 <> 符号中的示例信息替换为自己的值。

    {
       "properties": {
           "description": "This policy assignment makes sure that storage accounts with exposure to Public Networks are audited.",
           "displayName": "Audit Storage Accounts Open to Public Networks Assignment",
           "parameters": {},
           "policyDefinitionId": "/subscriptions/<subscriptionId>/providers/Microsoft.Authorization/policyDefinitions/Audit Storage Accounts Open to Public Networks",
           "scope": "/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>"
       }
    }
    
  2. 使用以下调用创建策略分配:

    armclient PUT "/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.Authorization/policyAssignments/Audit Storage Accounts Open to Public Networks?api-version=2019-09-01" @<path to Assignment JSON file>
    

    请将 <> 符号中的示例信息替换为自己的值。

    有关向 REST API 发出 HTTP 调用的详细信息,请参阅 Azure REST API 资源

使用 Azure CLI 创建并分配策略定义

若要创建策略定义,请使用以下过程:

  1. 复制以下 JSON 代码片段以创建 JSON 策略分配文件。

    {
       "if": {
           "allOf": [{
                   "field": "type",
                   "equals": "Microsoft.Storage/storageAccounts"
               },
               {
                   "field": "Microsoft.Storage/storageAccounts/networkAcls.defaultAction",
                   "equals": "Allow"
               }
           ]
       },
       "then": {
           "effect": "audit"
       }
    }
    

    有关编写策略定义的详细信息,请参阅 Azure Policy 定义结构

  2. 运行以下命令创建策略定义:

    az policy definition create --name 'audit-storage-accounts-open-to-public-networks' --display-name 'Audit Storage Accounts Open to Public Networks' --description 'This policy ensures that storage accounts with exposures to public networks are audited.' --rules '<path to json file>' --mode All
    

    该命令创建名为 Audit Storage Accounts Open to Public Networks 的策略定义。 有关其他可用的参数的详细信息,请参阅 az policy definition create

    在没有位置参数的情况下调用时,az policy definition creation 默认将策略定义保存在会话上下文的选定订阅中。 若要将定义保存到其他位置,请使用以下参数:

    • subscription - 保存到其他订阅。 订阅 ID 需要 GUID 值,订阅名称需要 字符串 值。
    • management-group - 保存到管理组。 需要 字符串 值。
  3. 使用以下命令创建策略分配。 请将 <> 符号中的示例信息替换为自己的值。

    az policy assignment create --name '<name>' --scope '<scope>' --policy '<policy definition ID>'
    

    az policy assignment create 的 scope 参数适用于管理组、订阅、资源组或单个资源。 该参数使用完整资源路径。 每个容器的 scope 模式如下所示。 将 {rName}{rgName}{subId}{mgName} 分别替换为你的资源名称、资源组名称、订阅 ID 和管理组名称。 {rType} 将替换为资源的 资源类型,例如 VM 的 Microsoft.Compute/virtualMachines

    • 资源 - /subscriptions/{subID}/resourceGroups/{rgName}/providers/{rType}/{rName}
    • 资源组 - /subscriptions/{subID}/resourceGroups/{rgName}
    • 订阅 - /subscriptions/{subID}
    • 管理组 - /providers/Microsoft.Management/managementGroups/{mgName}

可以在 PowerShell 中使用以下命令获取 Azure Policy 定义 ID:

az policy definition show --name 'Audit Storage Accounts with Open Public Networks'

创建的策略定义的策略定义 ID 应如以下示例所示:

"/subscription/<subscriptionId>/providers/Microsoft.Authorization/policyDefinitions/Audit Storage Accounts Open to Public Networks"

有关如何使用 Azure CLI 管理资源策略的详细信息,请参阅 Azure CLI 资源策略

后续步骤

查看以下文章,详细了解本文中所示的命令和查询。