【Azure Policy】在Azure Policy的规则中实现数组对数组的规则校验

本文涉及的产品
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 本文介绍了如何使用 Azure Policy 对网络安全组(NSG)的 IP 地址和端口进行审计。具体包括两个要求:一是输入的 IP 地址只能是 192.168.1.1 和 167.220.0.0/16;二是端口输入中只要包含 22 或 3389 需要进行判断。

问题描述

在之前的博文 “ 【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]

 



当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!

相关文章
|
6月前
|
网络性能优化 调度 网络虚拟化
配置HQoS示例(基于ACL配置用户队列)
网络中有多个用户,每个用户都有语音,视频和数据三种不同的业务,其携带的802.1p优先级分别为6、5、2。现在需要优先保证语音业务的带宽,其次是视频业务,最后是数据业务。配置需求如表1和表2所述。 由于带宽有限,除了需要区分不同业务的优先级之外还需要针对不同的用户进行流量整形,为多个用户提供不同的带宽,配置需求如表3所述。
|
3月前
|
存储 安全 BI
【Azure Storage Account】使用Azure Policy来检查Storage Account中是否有开启匿名访问的Container
【Azure Storage Account】使用Azure Policy来检查Storage Account中是否有开启匿名访问的Container
【Azure Storage Account】使用Azure Policy来检查Storage Account中是否有开启匿名访问的Container
|
3月前
|
存储
【Azure Policy】使用Azure Policy来检查Azure资源名称是否满足正确要求(不满足就拒绝创建或标记为不合规non-compliance)
【Azure Policy】使用Azure Policy来检查Azure资源名称是否满足正确要求(不满足就拒绝创建或标记为不合规non-compliance)
|
3月前
|
JSON 安全 网络协议
【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允许3389/22端口访问
为了确保Azure虚拟机资源的安全管理,只有指定IP地址才能通过RDP/SSH远程访问。解决方案包括使用Azure Policy服务扫描所有网络安全组(NSG),检查入站规则中的3389和22端口,并验证源地址是否在允许的IP列表中。不符合条件的NSG规则将被标记为非合规。通过编写特定的Policy Rule并定义允许的IP地址参数,实现集中管控和合规性检查。
|
3月前
|
API Python
【Azure API 管理】API Management 访问限制策略[quota-by-key] 中参数 [renewal-period] 的实验和理解
【Azure API 管理】API Management 访问限制策略[quota-by-key] 中参数 [renewal-period] 的实验和理解
|
3月前
|
存储 安全 API
【Azure API Management】实现在API Management服务中使用MI(管理标识 Managed Identity)访问启用防火墙的Storage Account
【Azure API Management】实现在API Management服务中使用MI(管理标识 Managed Identity)访问启用防火墙的Storage Account
|
3月前
|
网络协议 API
【Azure APIM】列举几种在APIM 策略中的主动生产的错误语句
【Azure APIM】列举几种在APIM 策略中的主动生产的错误语句
|
3月前
|
存储 数据安全/隐私保护
【Azure 环境】Azure Key Vault (密钥保管库)中所保管的Keys, Secrets,Certificates是否可以实现数据粒度的权限控制呢?
【Azure 环境】Azure Key Vault (密钥保管库)中所保管的Keys, Secrets,Certificates是否可以实现数据粒度的权限控制呢?
|
3月前
|
存储 安全 Shell
【Azure 存储服务】关于Azure Storage Account(存储服务) 基于AAD用户的权限设定以及SAS key的管理问题
【Azure 存储服务】关于Azure Storage Account(存储服务) 基于AAD用户的权限设定以及SAS key的管理问题
麒麟安装增强功能失败(未解决):Could not downgrade policy file /etc/selinux/targeted/policy/policy.29
麒麟安装增强功能失败(未解决):Could not downgrade policy file /etc/selinux/targeted/policy/policy.29
198 0