你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure Policy 分配结构
策略分配定义策略定义或计划将评估哪些资源。 此外,策略分配可以确定分配时该组资源的参数值,因此,可以重复使用能够处理相同资源属性并满足不同合规性需求的策略定义。
使用 JavaScript 对象表示法 (JSON) 创建策略分配。 策略分配包含以下各项的元素:
例如,以下 JSON 显示包含以下参数,且处于 DoNotEnforce 模式的示例策略分配请求:
{
"properties": {
"displayName": "Enforce resource naming rules",
"description": "Force resource names to begin with DeptA and end with -LC",
"definitionVersion": "1.*.*",
"metadata": {
"assignedBy": "Cloud Center of Excellence"
},
"enforcementMode": "DoNotEnforce",
"notScopes": [],
"policyDefinitionId": "/subscriptions/{mySubscriptionID}/providers/Microsoft.Authorization/policyDefinitions/ResourceNaming",
"nonComplianceMessages": [
{
"message": "Resource names must start with 'DeptA' and end with '-LC'."
}
],
"parameters": {
"prefix": {
"value": "DeptA"
},
"suffix": {
"value": "-LC"
}
},
"identity": {
"type": "SystemAssigned"
},
"resourceSelectors": [],
"overrides": []
}
}
范围
用于分配资源创建时间的范围是资源适用性的主要驱动因素。 有关分配范围的详细信息,请参阅了解 Azure Policy 中的范围。
策略定义 ID 和版本(预览版)
此字段必须是策略定义或计划定义的完整路径名称。 policyDefinitionId
是字符串,而不是数组。 每次评估策略分配时,都将检索已分配的策略定义或计划的最新内容。 如果经常要一起分配多个策略,我们建议改用计划。
对于内置定义和计划,可以使用具体 definitionVersion
来评估这些定义和计划。 默认情况下,版本会设置为最新的主版本,并自动引入次要版本和修补程序更改。
- 若要自动引入定义的任何次要更改,版本号将为
#.*.*
。 通配符表示自动引入更新。 - 若要固定到次要版本路径,版本格式将为
#.#.*
。 - 出于安全目的,必须自动引入所有修补程序更改。 修补更改仅限于文本更改和不可挽回的方案。
显示名称和说明
使用 displayName
和 description
来标识策略分配,并提供它与特定资源集配合使用时的上下文。 displayName
的最大长度为 128 个字符,description
的最大长度为 512 个字符。
元数据
metadata
可选属性用于存储关于策略分配的信息。 客户可在 metadata
中定义对其组织有用的任何属性和值。 但是,Azure Policy 使用一些常见属性。 每个 metadata
属性有 1024 个字符的限制。
常见元数据属性
assignedBy
(字符串):创建分配的安全主体的友好名称。createdBy
(字符串):创建分配的安全主体的 GUID。createdOn
(字符串):分配创建时间的通用 ISO 8601 日期时间格式。updatedBy
(字符串):更新分配的安全主体的友好名称(如果有)。updatedOn
(字符串):分配更新时间的通用 ISO 8601 日期时间格式(如果有)。
特定于方案的元数据属性
parameterScopes
(对象):键值对的集合,其中密钥与 strongType 配置的参数名称匹配,值定义门户中使用的资源范围,以通过匹配 strongType 提供来可用资源的列表。 如果范围不同于分配范围,门户将设置此值。 如果已设置,则在门户中编辑策略分配后,会自动将参数的作用域设置为此值。 但是,该作用域不会锁定到值,并且可以更改为其他作用域。下面的示例
parameterScopes
是针对名为backupPolicyId
的 strongType 参数,用于在门户中编辑分配时设置资源选择的范围。"metadata": { "parameterScopes": { "backupPolicyId": "/subscriptions/{SubscriptionID}/resourcegroups/{ResourceGroupName}" } }
evidenceStorages
(对象):建议的默认存储帐户,该帐户应该用于保存证明具有manual
效果的策略分配的证据。displayName
属性是存储帐户的名称。evidenceStorageAccountID
属性是存储帐户的资源 ID。evidenceBlobContainer
属性是计划在其中存储证据的 Blob 容器名称。{ "properties": { "displayName": "A contingency plan should be in place to ensure operational continuity for each Azure subscription.", "policyDefinitionId": "/providers/Microsoft.Authorization/policyDefinitions/{definitionId}", "metadata": { "evidenceStorages": [ { "displayName": "Default evidence storage", "evidenceStorageAccountId": "/subscriptions/{subscriptionId}/resourceGroups/{rg-name}/providers/Microsoft.Storage/storageAccounts/{storage-account-name}", "evidenceBlobContainer": "evidence-container" } ] } } }
资源选择器
可选的 resourceSelectors
属性使你能够根据资源位置、资源类型或资源是否具有位置等因素逐步推出策略分配,从而推进安全部署做法 (SDP)。 使用资源选择器时,Azure Policy 仅评估适用于资源选择器中制定的规范的资源。 还可以利用资源选择器以相同的方式缩小豁免范围。
在以下示例场景中,仅当资源的位置为美国东部或美国西部时,才会评估新策略分配。
{
"properties": {
"policyDefinitionId": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyDefinitions/ResourceLimit",
"definitionVersion": "1.1.*",
"resourceSelectors": [
{
"name": "SDPRegions",
"selectors": [
{
"kind": "resourceLocation",
"in": [
"eastus",
"westus"
]
}
]
}
]
},
"systemData": { ...
},
"id": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyAssignments/ResourceLimit",
"type": "Microsoft.Authorization/policyAssignments",
"name": "ResourceLimit"
}
准备好扩展策略的评估范围时,只需更新分配。 以下示例显示了我们的策略分配,其中另外两个 Azure 区域已添加到 SDPRegions 选择器。 注意,在此示例中,SDP 表示“安全部署做法”:
{
"properties": {
"policyDefinitionId": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyDefinitions/ResourceLimit",
"definitionVersion": "1.1.*",
"resourceSelectors": [
{
"name": "SDPRegions",
"selectors": [
{
"kind": "resourceLocation",
"in": [
"eastus",
"westus",
"centralus",
"southcentralus"
]
}
]
}
]
},
"systemData": { ...
},
"id": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyAssignments/ResourceLimit",
"type": "Microsoft.Authorization/policyAssignments",
"name": "ResourceLimit"
}
资源选择器具有以下属性:
name
:资源选择器的名称。selectors
:(可选)用于确定哪部分资源适用于策略分配的因素应进行合规性评估。kind
:选择器的属性,用于描述哪些特征将缩小评估的资源集。 每种只能在一个资源选择器中使用一次。 允许值包括:resourceLocation
:此属性用于根据资源类型选择资源。 不能在同一资源选择器中作为resourceWithoutLocation
使用。resourceType
:此属性用于根据资源类型选择资源。resourceWithoutLocation
:此属性用于选择没有位置的订阅级资源。 当前仅支持subscriptionLevelResources
。 不能在同一资源选择器中作为resourceLocation
使用。
in
:特定kind
的允许值列表。 无法与notIn
一起使用。 最多可包含 50 个值。notIn
:不允许的特定kind
值列表。 无法与in
一起使用。 最多可包含 50 个值。
资源选择器可以包含多个 selectors
。 若要适用于资源选择器,资源必须满足其所有选择器指定的要求。 此外,最多可在一个分配中指定 10 个 resourceSelectors
。 当范围内的资源满足其中任一资源选择器时,将对其进行评估。
覆盖
可选的 overrides
属性可以更改策略定义的效果,而无需修改基础策略定义或在策略定义中使用参数化效果。
效果替代的最常见用例是具有大量关联策略定义的策略计划。 在这种情况下,管理多个策略效果可能耗费大量管理精力,尤其是在需要不时更新效果的情况下。 替代可用于同时更新计划内多个策略定义的效果。
我们分析一个示例。 假设你有一个名为 CostManagement 的策略计划,其中包含 policyDefinitionReferenceId
corpVMSizePolicy 的自定义策略定义和一个 audit
效果。 假设你想要分配 CostManagement 计划,但还不想查看此针对此策略报告的合规情况。 此策略的“audit
”效果可通过计划分配上的替代替换为“disabled
”,如以下示例所示:
{
"properties": {
"policyDefinitionId": "/subscriptions/{subId}/providers/Microsoft.Authorization/policySetDefinitions/CostManagement",
"overrides": [
{
"kind": "policyEffect",
"value": "disabled",
"selectors": [
{
"kind": "policyDefinitionReferenceId",
"in": [
"corpVMSizePolicy"
]
}
]
}
]
},
"systemData": { ...
},
"id": "/subscriptions/{subId}/providers/Microsoft.Authorization/policyAssignments/CostManagement",
"type": "Microsoft.Authorization/policyAssignments",
"name": "CostManagement"
}
替代的另一个常见用例是推出新版本的定义。 有关安全更新分配版本的建议步骤,请参阅“策略安全部署”。
替代值具有以下属性:
kind
:分配替代的属性。 支持的种类是policyEffect
和policyVersion
。value
:替代现有值的新值。 对于kind: policyEffect
,支持的值为效果。 对于kind: policyVersion
,支持的版本号必须大于或等于分配中指定的definitionVersion
。selectors
: (可选)用于确定替代适用的策略分配范围的属性。kind
:选择器的属性,用于描述哪些特征将缩小替代的范围。kind: policyEffect
允许的值:policyDefinitionReferenceId
:该属性指定计划分配中的哪些策略定义适用于效果替代。resourceLocation
:此属性用于根据资源类型选择资源。 不能在同一资源选择器中作为resourceWithoutLocation
使用。
kind: policyVersion
允许的值:resourceLocation
:此属性用于根据资源类型选择资源。 不能在同一资源选择器中作为resourceWithoutLocation
使用。
in
:特定kind
的允许值列表。 无法与notIn
一起使用。 最多可包含 50 个值。notIn
:不允许的特定kind
值列表。 无法与in
一起使用。 最多可包含 50 个值。
通过在 policyDefinitionReferenceId
数组中指定多个值,一个替代可以替换多个策略的效果。 一个替代可用于最多 50 个 policyDefinitionReferenceId
,一次策略分配最多可以包含 10 个替代,它们按指定顺序进行评估。 创建分配之前,将根据策略规则和参数允许值列表验证替代中选择的效果(如果效果已参数化)。
强制模式
enforcementMode
属性使客户能够测试对现有资源应用某个策略后的结果,而无需启动策略效果,或触发 Azure 活动日志中的条目。
此方案通常称为“what if”,与安全部署做法相符。 enforcementMode
不同于 Disabled 效果,后者会彻底阻止资源评估的发生。
此属性具有以下值:
Mode | JSON 值 | 类型 | 手动修正 | 活动日志条目 | 说明 |
---|---|---|---|---|---|
Enabled | 默认 | string | 是 | 是 | 在创建或更新资源期间强制实施策略效果。 |
已禁用 | DoNotEnforce | string | 是 | 否 | 在创建或更新资源期间不强制实施策略效果。 |
如果未在策略或计划定义中指定 enforcementMode
,则使用值 Default。 即使 enforcementMode
设置为 DoNotEnforce,也可以针对 deployIfNotExists 策略启动修正任务。
排除的范围
分配的范围包括所有子资源容器和子资源。 如果子资源容器或子资源不应应用定义,则可以通过设置 notScopes
将每个项从计算中排除。 此属性是一个数组,用于从计算中排除一个或多个资源容器或资源。 notScopes
可以在创建初始分配后添加或更新。
注意
排除的资源与免除的资源不同。 有关详细信息,请参阅了解 Azure Policy 中的范围。
不符合性消息
若要设置描述资源为何不符合策略或计划定义的自定义消息,请在分配定义中设置 nonComplianceMessages
。 此节点是一个 message
条目的数组。 此自定义消息是对不符合性默认错误消息的补充,并且是可选的。
重要
只有使用资源管理器模式定义的定义或计划才支持针对不合规的自定义消息。
"nonComplianceMessages": [
{
"message": "Default message"
}
]
如果分配是针对某个计划的,则可以为该计划中的每个策略定义配置不同的消息。 消息使用在计划定义中配置的 policyDefinitionReferenceId
值。 有关详细信息,请参阅策略定义属性。
"nonComplianceMessages": [
{
"message": "Default message"
},
{
"message": "Message for just this policy definition by reference ID",
"policyDefinitionReferenceId": "10420126870854049575"
}
]
参数
此策略分配段为策略定义或计划定义中定义的参数提供值。 通过这种设计,可对不同的资源重复使用某个策略或计划定义,但需要检查不同的业务价值或成果。
"parameters": {
"prefix": {
"value": "DeptA"
},
"suffix": {
"value": "-LC"
}
}
在此示例中,事先在策略定义中定义的参数为 prefix
和 suffix
。 此特定策略分配将 prefix
设置为 DeptA,将 suffix
设置为 -LC。 可对不同部门的一组不同参数重复使用同一个策略定义,以降低策略定义的重复性和复杂性,同时提供灵活性。
标识
对于效果设置为 deployIfNotExists
或 modify
的策略分配,需要具有标识属性才能对不合规的资源进行修正。 若分配时使用标识,用户还必须指定分配的位置。
注意
单个策略分配只能与一个由系统或由用户分配的托管标识相关联。 但是,如有必要,可为该标识分配多个角色。
# System-assigned identity
"identity": {
"type": "SystemAssigned"
}
# User-assigned identity
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/SubscriptionID/resourceGroups/{rgName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/test-identity": {}
}
},
后续步骤
- 了解策略定义结构。
- 了解如何以编程方式创建策略。
- 了解如何获取符合性数据。
- 了解如何修正不符合的资源。
- 参阅使用 Azure 管理组来组织资源,了解什么是管理组。