首页 > 其他分享 >【Azure Policy】在Azure Policy的规则中实现数组对数组的规则校验

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

时间:2024-09-24 20:24:52浏览次数:9  
标签:Network field securityRules Azure 数组 Policy array Microsoft

问题描述

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

 

标签:Network,field,securityRules,Azure,数组,Policy,array,Microsoft
From: https://www.cnblogs.com/lulight/p/18429933

相关文章

  • java_day4_数组、方法
    一、数组一维数组数组:是一块连续固定大小的内存空间,有着索引的概念定义数组的语句格式:数据类型[]数组名;【推荐】数据类型数组名[];如果只是定义一个数组的话,没有给初始化值,相当于一个变量没有值,是不能够直接使用的如何对一个数组进行初始化?1、动态初始化......
  • 信息学奥赛复赛复习02-CSP-J2019-02-结构体、无构造函数、有构造函数、初始化列表构造
    PDF文档公众号回复关键字:2024092412019CSP-J题目2公交换乘[题目描述]著名旅游城市B市为了鼓励大家采用公共交通方式出行,推出了一种地铁换乘公交车的优惠方案在搭乘一次地铁后可以获得一张优惠票,有效期为45分钟,在有效期内可以消耗这张优惠票,免费搭乘一次票价不超过......
  • python中多维数组的cumsum的逆
    我想知道如何在Python中对多维数组进行累积和的逆运算。例如,我们可以通过PMy获得给定二维数组的累积数组T问题是,我如何从importnumpyasnpT=np.array([[1,3,2],[5,5,6],[1,8,3]])P=np.cumsum(np.cumsum(T,axis=0),axis=1)print(P)#Pisthe......
  • useEffect为函数组件添加“副作用”
    最近在学习React,用了Hooks了,Hooks虽然好用,但是对于刚上手Hooks的小伙伴来说,可能不太理解useEffec和类组件中生命周期方法之间的关系,所以决定总结一下。如有不对,请多多指正!什么是副作用副作用是相对于主作用来说的,一个函数除了主作用,其他的作用就是副作用。对于React组件来说,主作......
  • 5.2 C# 数组声明与初始化全解
    文章目录5.2.1C#数组声明5.2.1C#数组声明1.声明数组的语法格式2.声明一维数组的语法格式格式1:声明但不初始化格式2:声明并初始化方式1:使用`new`关键字方式2:省略`new`关键字总结5.2.2C#数组的初始化5.2.2C#数组的初始化1.声明并初始化数组1.1使用`new......
  • 日新月异 PyTorch - numpy 基础: numpy 数组的添加和删除,以及常用函数
    源码https://github.com/webabcd/PytorchDemo作者webabcd日新月异PyTorch-numpy基础:numpy数组的添加和删除,以及常用函数示例如下:numpy\demo5.pyimportnumpyasnp#数组的添加和删除defsample1():a=np.array([[1,2,3],[4,5,6]])print(a)'......
  • 2024-09-18:用go语言,给定一个从 0 开始的长度为 n 的正整数数组 nums 和一个二维操作数
    2024-09-18:用go语言,给定一个从0开始的长度为n的正整数数组nums和一个二维操作数组queries,每个操作由一个下标值indexi和一个数值ki组成。开始时,数组中的所有元素都是未标记的。依次执行m次操作,每次操作的过程如下:1.如果下标indexi对应的元素还未标记,则标记这个元素......
  • 2024-09-14:用go语言,给定一个正整数数组 nums,定义一个加密函数 encrypt(x),其将一个整数
    2024-09-14:用go语言,给定一个正整数数组nums,定义一个加密函数encrypt(x),其将一个整数x的每一位数字都替换为x中的最大数字,然后返回加密后的数字。例如,encrypt(523)会返回555,encrypt(213)会返回333。现在需要计算数组中所有元素加密后的和,然后返回这个和。输入:nums=[10,2......
  • Java 数据库存储数组的方法
    在现代软件开发中,数组是常用的数据结构之一。然而,在关系数据库中直接存储数组并不是一个简单的任务。关系数据库通常擅长存储简单的数据类型如整数、字符串和日期等,但对于复杂的数据类型如数组、列表或对象,通常需要采用特殊的方法进行处理。本文将详细介绍几种在Java中将数组存储到......
  • go基础-4.数组、切片、map
    数组数组(Array)是一种非常常见的数据类型,几乎所有的计算机编程语言中都会用到它数组里的元素必须全部为同一类型,要嘛全部是字符串,要嘛全部是整数声明数组时,必须指定其长度或者大小packagemainimport"fmt"funcmain(){vararray[3]int=[3]int{1,2,3}fmt.Pr......