问题描述
在使用Azure的日常工作中,很可能面临这样的情况。
为了避免资源的随意创建或是从成本考虑,只能对已有资源进行修改,不允许创建新的资源。
在Azure上,是否有方案可以实现这一需求呢?
第一时间想到的方案是使用Azure Policy。但是,在经过分析后,发现使用Policy的Deny策略,它会一锅端。任何符合要求的操作(新建,修改,删除) 都会被Deny,无法实现以上需求。
基于AI时代解决问题的新思路,问题先问大模型。得到回答如下:
Azure Policy本身是一个治理工具,它通过定义策略来控制资源的创建和配置,但它的能力有一些限制:
能否区分“新建”和“修改”?
- Azure Policy主要在资源创建或更新时触发,但它无法直接判断操作是“新建”还是“修改”,因为在技术上,两者都是 PUT 请求。
- Policy的effect(如 deny,audit )会在资源属性不符合策略时生效,而不是基于操作类型。
是否可以实现“拒绝新建,允许修改”?
直接实现:不行,因为Policy无法区分首次创建和后续更新。
既然直接实现不可以,那么本文就介绍一种代替方案。
思路如下:
第一步:创建一个Audit Policy,分配到对于的资源上,然后触发策略评估
第二步:为扫描后不合规的资源添加豁免(exemption)
第三步:修改 Audit Policy 为 Deny Policy
已存在的资源就会被豁免不进行策略评估,而新建资源因为不在豁免列表中,所以会被Deny策略拒绝
操作步骤
第一步:创建一个Audit Policy
Audit Policy的范围是针对指定的区域不允许新建资源,比如中国东部二区数据中心( China East 2)
策略内容如下
{ "mode": "All", "policyRule": { "if": { "field": "location", "In": "[parameters('disAllowedLocations')]" }, "then": { "effect": "Audit" } }, "parameters": { "disAllowedLocations": { "type": "Array", "metadata": { "displayName": "Disallowed locations", "description": "The list of allowed locations for resources.", "strongType": "location" } } } }
创建后分配,并查看Compliance结果。
PS: 为避免等待,可以使用 az policy state trigger-scan --resource-group "your resource group name" 来触发策略评估
第二步:再分配中添加豁免
这里需要一个资源一个资源的添加,或者是通过一个资源选择器来添加有相同点的资源
说明:Exemption category有两个值 Waiver 和 Mitigated
Waiver 的含义 表示该资源或范围完全豁免策略评估,即策略不再对它进行合规性检查。
效果:策略不会再标记该资源为“不合规”,不会触发
deny或audit。Mitigated的含义 表示该资源仍然不符合策略要求,但由于有补偿措施(Mitigation),所以不再视为风险。
效果:策略仍会评估,但在合规报告中标记为“已缓解”(Mitigated),不会影响整体合规评分。
第三步:把第一步中的 Audit Policy修改为Deny
回到第一步中创建的这个Policy Definition,点击"Edit Definition"。把
{ "effect": "Audit" }
修改为
{ "effect": "Deny" }
即可!
第四步:测试新建资源
当创建新资源的时候,会提示创建失败,因为没有通过策略评估
Deployment validation failed.
Additional details from the underlying API that might be helpful: The template deployment failed because of policy violation.
Please see details for more information.
第五步:测试修改被豁免的资源
对第二步中豁免的Redis资源进行修改,可以成功!
经过第四步和第五步的验证,成功的通过Azure Policy实现了对新添加资源的拒绝,并且不影响对已经存在资源的修改操作。
问题一:是否可以在第三步修改Policy为Deny后,在去添加豁免呢?
不可以,因为这个添加也是对资源的修改。如果没有提前豁免,就会被Deny策略所阻止,得到 Resource was disallowed by policy 错误提示。
参考资料
Azure Policy 豁免结构 : https://docs.azure.cn/zh-cn/governance/policy/concepts/exemption-structure
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!