我有以下用例:我想要 Azure 策略,要求有两个强制标签:资源组的环境和项目强>。如果没有这两个标签,则不可能创建新的资源组,并且已创建的没有这两个标签的资源组应显示为不合规。到目前为止,这听起来像是一个简单的场景,但我没有得到预期的结果,而且越来越难保持理智,所以请指教。
我已经查看了 Stack Overflow 中的多个线程,以及这篇 Microsoft 文章:How to build an audit Azure Policy with multiple parameters .
我使用以下代码:
{
"mode": "All",
"policyRule": {
"if": {
"allOf": [
{
"field": "type",
"equals": "Microsoft.Resources/subscriptions/resourceGroups"
},
{
"field": "tags['Environment']",
"exists": "false"
},
{
"field": "tags['Project']",
"exists": "false"
}
]
},
"then": {
"effect": "deny"
}
},
"parameters": {}
}
注意:我在故障排除过程中删除了参数,并用值替换它们以简化操作。使用参数而不是显式值时,结果是相同的。
我的理解是,allOf应该充当逻辑AND,并且应该要求所有条件都到位 - 成为资源组,具有标签环境并具有标签项目。
那么结果是什么呢?创建新资源组时,如果不提供环境和项目标签,验证将不允许您继续:
注意:您可能会发现标签要求有相同的策略名称,并且这是唯一的策略分配...到处都是!这是我的个人测试租户,因此不可能存在我不知道的其他策略分配。
问题是,它允许我仅使用提供的一个标签来继续:
- 仅环境
- 唯一的项目
如果我们查看合规状态,您可能会看到资源组被策略标记为合规:
但它只有一个单个标签 - 项目,没有标签环境...并且仍然标记为合规。
因此,经过漫长的探索后,我的问题是 - 如何强制使用这两个标签 - 环境和项目。可能还有其他标签,但这两个标签应该是必需的,并且不允许在不提供它们的情况下创建新资源组,并且如果两者都缺失,则不允许将旧资源组标记为不合规。
我错过了什么,它不能像预期的那样工作?
我还使用了文章中的代码... 1:1 ...复制-粘贴,我再次只能使用单个标签继续。
请支持。
我遵循了 Stack Overflow 中的其他示例,如 Microsoft 官方文章。即使是 Microsoft 文章中建议的示例也没有按预期工作,或者至少没有按照我的预期工作。
最佳答案
此处的 AllOf 条件指示策略引擎在满足所有条件的情况下检测不合规资源。意思是:
- 您当前正在扫描 RG
- 当前 RG 没有环境标签
- 当前 RG 没有项目标签
我们可以将其表达为:“如果这是一个没有环境并且没有标签项目的 RG,那么我的项目是不合规的”。
如果满足任一条件(例如存在一个标记),则该资源会被标记为合规,因为它不符合您的总体条件。
您想要在此处添加 AnyOf 条件,以确保在一个或另一个标记不存在时它会中断。可以这样表达:“如果这是一个没有环境或没有标签项目的 RG,那么我的项目是不合规的”。
代码:
{
"mode": "All",
"policyRule": {
"if": {
"allOf": [
{
"field": "type",
"equals": "Microsoft.Resources/subscriptions/resourceGroups"
},
{
"anyOf": [
{
"field": "tags['Environment']",
"exists": "false"
},
{
"field": "tags['Project']",
"exists": "false"
}
]
}
]
},
"then": {
"effect": "deny"
}
},
"parameters": {}
}
关于azure - Azure 资源组需要多个标签名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75445305/