【Azure Policy】在Azure Policy的规则中实现数组对数组的规则校验
问题描述
在之前的博文 “ 【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允许3389/22端口访问 ” 中,介绍了对固定IP地址,端口的审计规则。
只是在实际使用中,发现端口和IP都可以输入多个值,并且以“,”号分割,最终在Azure的NSG资源中,显示为数组格式值,如下:
为了实现数组队对应数组的验证,需要重新编写Policy Rule, 如何来实现如下 两个要求呢?
要求一:输入的IP地址只能是 192.168.1.1 和167.220.0.0/16, 可以是其中的一个,但是不能有这两个值之外的其它值。
要求二:端口输入中,只要包含了22,3389的输入,都需要进行判断
问题解答
要求一 : “输入的IP地址只能是 192.168.1.1 和167.220.0.0/16, 可以是其中的一个,但是不能有这两个值之外的其它值。”
根据要求,做出了下表中的示例:
所以,最开始考虑的是使用 In 或者是 notIn 来进行判断,根据Copilot的回答:
问:Azure Policy中的,如果policy rule中field是array , 同另一个array 进行notin 判断, 它在什么情况下是true, 什么情况下是false呢?
答:在Azure Policy中,如果policy rule中的field是一个array,并且需要与另一个array进行
notIn
判断,以下是判断条件为true或false的情况:True:当field中的所有元素都不在另一个array中时,
notIn
判断为true。例如,如果field是["A", "B", "C"]
,而另一个array是["D", "E", "F"]
,则判断为true,因为field中的所有元素都不在另一个array中。False:当field中的任何一个元素存在于另一个array中时,
notIn
判断为false。例如,如果field是["A", "B", "C"]
,而另一个array是["B", "E", "F"]
,则判断为false,因为field中的元素B
存在于另一个array中。
继续追问:
问:Azure Policy中的,如果policy rule中field是array , 同另一个array 进行in 判断, 它在什么情况下是true, 什么情况下是false呢?
答:在Azure Policy中,如果policy rule中的field是一个array,并且需要与另一个array进行
in
判断,以下是判断条件为true或false的情况:True:当field中的任何一个元素存在于另一个array中时,
in
判断为true。例如,如果field是["A", "B", "C"]
,而另一个array是["B", "E", "F"]
,则判断为true,因为field中的元素B
存在于另一个array中[1][2].False:当field中的所有元素都不在另一个array中时,
in
判断为false。例如,如果field是["A", "B", "C"]
,而另一个array是["D", "E", "F"]
,则判断为false,因为field中的所有元素都不在另一个array中[1][2].希望这个解释对你有帮助!如果你有其他问题,欢迎随时提问。
References
[1] Details of the policy definition structure policy rules - Azure Policy | Microsoft Learn
[2] Details of Azure Policy definition structure basics - Azure Policy | Microsoft Learn
但是在实际的多次验证后,发现使用 In / notIn 在 Policy Deny的策略中,并没有达到理想的效果。最后,在 in的基础上进行了count操作,才能正常判断输入2个及2个以上的值是否满足条件:
而关于条件二,则要简单一些,因为输入的值,只要包含 22, 3389 ,则这条语句就返回 True, 当值只有一个时,使用equals,当有多个时,用not + notIn来进行判断。
PS: notIn 的判断规则时,只要全部输入值都不包含22,3389的时候,才返回True, 然后通过Not 反转为 False,表示只要输入值没有22,3389,就不用审计。
{ "anyOf": [ { "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange", "equals": "3389" }, { "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange", "equals": "22" }, { "not": { "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRanges[*]", "notIn": [ "3389", "22" ] } } ] }
以上两个条件的执行效果如下:
完整的Policy参考如下:
{ "mode": "All", "policyRule": { "if": { "allOf": [ { "field": "type", "equals": "Microsoft.Network/networkSecurityGroups/securityRules" }, { "field": "Microsoft.Network/networkSecurityGroups/securityRules/direction", "equals": "Inbound" }, { "anyOf": [ { "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange", "equals": "3389" }, { "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange", "equals": "22" }, { "not": { "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRanges[*]", "notIn": [ "3389", "22" ] } } ] }, { "anyOf": [ { "allOf": [ { "count": { "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefixes[*]" }, "greater": 1 }, { "not": { "allOf": [ { "count": { "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefixes[*]", "where": { "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefixes[*]", "In": "[parameters('allowedIPs')]" } }, "equals": 2 }, { "count": { "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefixes[*]" }, "equals": 2 } ] } } ] }, { "allOf": [ { "count": { "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefixes[*]" }, "equals": 0 }, { "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefix", "notIn": "[parameters('allowedIPs')]" } ] } ] } ] }, "then": { "effect": "deny" } }, "parameters": { "allowedIPs": { "type": "Array", "metadata": { "displayName": "Allowed IPs", "description": "The list of allowed IPs for resources." }, "defaultValue": [ "192.168.1.1" ] } } }
[END]
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2022-09-24 【Azure 云服务】当Windows系统发布新的安全漏洞后,如何查看Azure云服务(Cloud Service)的实例是否也更新了安全补丁呢?
2021-09-24 【Azure 应用服务】App Service For Linux 部署PHP Laravel 项目,如何修改首页路径为 wwwroot\public\index.php
2021-09-24 【Azure Spring Cloud】Java Spring Cloud 应用部署到Azure上后,发现大量的 java.lang.NullPointerException: null at io.lettuce.core.protocol.CommandHandler.writeSingleCommand(CommandHandler.java:426) at ... 异常
2020-09-24 【API管理 APIM】如何查看APIM中的Request与Response详细信息,如Header,Body中的参数内容
2020-09-24 【事件中心 Azure Event Hub】在Linux环境中(Ubuntu)安装Logstash的简易步骤及配置连接到Event Hub