Azure Policy为密钥设置有效期时DeployIfNotExists返回ResourceNotFound错误
问题根因分析
- 部署模板中没有指定
Microsoft.KeyVault/vaults/keys资源的name属性,Azure无法定位到要修改的具体密钥资源,因此返回ResourceNotFound错误 exp属性配置存在两处错误:一是层级错误,有效期需要放在properties.attributes节点下,原代码直接放在properties下不符合规范;二是格式错误,该字段为Unix时间戳格式的整数,你填写的字符串格式"10000"不符合要求,且10000对应的是1970年的时间,配置后密钥会直接过期- DeployIfNotExists配置缺少
existenceCondition校验,可能导致重复触发部署 - 绑定的Owner角色权限过大,不符合最小权限原则,使用密钥管理员角色即可满足配置密钥属性的需求
修正后的完整策略代码
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.KeyVault/vaults/keys" }, { "field": "Microsoft.KeyVault/vaults/keys/attributes.exp", "exists": false } ] }, "then": { "effect": "deployIfNotExists", "details": { "type": "Microsoft.KeyVault/vaults/keys", "existenceCondition": { "field": "Microsoft.KeyVault/vaults/keys/attributes.exp", "exists": true }, "roleDefinitionIds": [ "/providers/Microsoft.Authorization/roleDefinitions/00482a7b-0240-4938-90d3-f668b8a8f16a" ], "deployment": { "properties": { "mode": "incremental", "template": { "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "keyName": { "type": "string" } }, "resources": [ { "type": "Microsoft.KeyVault/vaults/keys", "apiVersion": "2021-06-01-preview", "name": "[parameters('keyName')]", "properties": { "attributes": { "exp": "[add(dateTimeToEpoch(utcNow()), 63072000)]" } } } ] }, "parameters": { "keyName": { "value": "[field('name')]" } } } } } } }, "parameters": {} }
关键修改说明
- 通过Azure Policy的
field('name')函数获取当前匹配到的密钥的完整名称(包含密钥保管库名),传入部署模板的参数,明确指定要修改的资源 - 使用
dateTimeToEpoch(utcNow())获取当前Unix时间戳,加63072000秒等价于设置2年有效期,可根据业务需求调整时长 - 新增
existenceCondition校验,已经配置有效期的密钥不会重复触发部署 - 替换角色为密钥管理员角色,缩小权限范围
内容的提问来源于stack exchange,提问作者user1876202
相关产品推荐
相关产品推荐

