你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
以编程方式创建策略
本文逐步讲解如何以编程方式创建和管理策略。 Azure Policy 定义对资源强制实施不同的规则和效果。 强制实施可确保资源始终符合企业标准和服务级别协议。
有关符合性的信息,请参阅获取符合性数据。
先决条件
在开始之前,请确保满足以下先决条件:
安装 ARMClient(如果尚未安装)。 该工具可将 HTTP 请求发送到基于 Azure 资源管理器的 API。
将 Azure PowerShell 模块更新到最新版本。 有关详细信息,请参阅安装 Azure PowerShell 模块。 有关最新版本的详细信息,请参阅 Azure PowerShell。
使用 Azure PowerShell 注册 Azure Policy Insights 资源提供程序,以确认订阅可使用资源提供程序正常工作。 若要注册资源提供程序,必须具有为资源提供程序运行注册操作所需的权限。 此操作包含在“参与者”和“所有者”角色中。 运行以下命令,注册资源提供程序:
Register-AzResourceProvider -ProviderNamespace 'Microsoft.PolicyInsights'
有关注册和查看资源提供程序的详细信息,请参阅资源提供程序和类型。
安装 Azure CLI(如果尚未安装)。 可以通过在 Windows 上安装 Azure CLI 获取最新版本。
创建并分配策略定义
更清晰地洞察资源的第一步是针对资源创建并分配策略。 下一步是了解如何以编程方式创建和分配策略。 示例策略使用 PowerShell、Azure CLI 和 HTTP 请求来审核向所有公共网络开放的存储帐户。
使用 PowerShell 创建并分配策略定义
使用以下 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 定义结构。
运行以下命令,使用 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 - 保存到管理组。 需要字符串值。
创建策略定义后,可运行以下命令创建策略分配:
$rg = Get-AzResourceGroup -Name 'ContosoRG' $Policy = Get-AzPolicyDefinition -Name 'AuditStorageAccounts' New-AzPolicyAssignment -Name 'AuditStorageAccounts' -PolicyDefinition $Policy -Scope $rg.ResourceId
将 ContosoRG 替换为所需资源组的名称。
New-AzPolicyAssignment
的Scope
参数适用于管理组、订阅、资源组或单个资源。 该参数使用完整资源路径,它将返回Get-AzResourceGroup
的ResourceId
属性。 每个容器的Scope
的模式如下所示。 将{rName}
、{rgName}
、{subId}
和{mgName}
分别替换为你的资源名称、资源组名称、订阅 ID 和管理组名称。{rType}
将替换为资源的资源类型,例如虚拟机的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 创建并分配策略定义
使用以下过程创建策略定义。
复制以下 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" } } }
使用以下调用之一创建策略定义:
# For defining a policy in a subscription armclient PUT "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyDefinitions/AuditStorageAccounts?api-version=2021-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=2021-09-01" @<path to policy definition JSON file>
将前面的
{subscriptionId}
替换为你的订阅的 ID,或将{managementGroupId}
替换为你的管理组的 ID。有关查询结构的详细信息,请参阅 Azure Policy 定义 - 创建或更新和策略定义 - 在管理组中创建或更新。
使用以下过程创建策略分配,并在资源组级别分配策略定义。
复制以下 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>" } }
使用以下调用创建策略分配:
armclient PUT "/subscriptions/<subscriptionID>/resourceGroups/<resourceGroupName>/providers/Microsoft.Authorization/policyAssignments/Audit Storage Accounts Open to Public Networks?api-version=2021-09-01" @<path to Assignment JSON file>
请将 <> 符号中的示例信息替换为自己的值。
有关向 REST API 发出 HTTP 调用的详细信息,请参阅 Azure REST API 资源。
使用 Azure CLI 创建并分配策略定义
若要创建策略定义,请使用以下过程:
复制以下 JSON 代码片段以创建 JSON 策略分配文件。
{ "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Storage/storageAccounts" }, { "field": "Microsoft.Storage/storageAccounts/networkAcls.defaultAction", "equals": "Allow" } ] }, "then": { "effect": "audit" } }
有关编写策略定义的详细信息,请参阅 Azure Policy 定义结构。
运行以下命令创建策略定义:
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 - 保存到管理组。 需要字符串值。
使用以下命令创建策略分配。 请将尖括号
< >
中的示例信息替换为自己的值。az policy assignment create --name '<name>' --scope '<scope>' --policy '<policy definition ID>'
az policy assignment create
的scope
参数适用于管理组、订阅、资源组或单个资源。 该参数使用完整资源路径。 每个容器的scope
的模式如下所示。 将{rName}
、{rgName}
、{subId}
和{mgName}
分别替换为你的资源名称、资源组名称、订阅 ID 和管理组名称。{rType}
将替换为资源的资源类型,例如虚拟机的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 资源策略。
后续步骤
查看以下文章,详细了解本文中所示的命令和查询。