首页 > 其他分享 >【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允许3389/22端口访问

【Azure Policy】添加策略用于审计Azure 网络安全组(NSG)规则 -- 只能特定的IP地址允许3389/22端口访问

时间:2024-08-29 21:03:31浏览次数:8  
标签:Network 22 -- securityRules Microsoft Policy Azure 3389 networkSecurityGroups

问题描述

对Azure上的虚拟机资源,需要进行安全管理。只有指定的IP地址才能够通过RDP/SSH远程到虚拟机上, 有如下几点考虑:

1) 使用Azure Policy服务,扫描订阅中全部的网络安全组(NSG: Network Security Group) 资源

2) 判断入站规则,判断是否是3389, 22端口

3) 判断源地址是否是被允许的IP

4) 对不满足条件的 NSG规则进行审计。提示不合规( Non-compliant )

 需要满足以上要求的规则,如何来编写呢?

 

问题解答

使用Azure Policy可以完成对Azure资源的集中管制,以满足合规需求。为满足以上需求:

第一步:检查NSG资源,查看Inbound , port, source 值对应的属性名

在NSG的Overview页面,点击右上角的“JSON View”链接,查看资源的JSON内容,其中securityRules的内容为:

{
    "name": "RDP",
    "id": "/subscriptions/x-x-x-x/resourceGroups/xxxx/providers/Microsoft.Network/networkSecurityGroups/xxxx-xxx/securityRules/RDP",
    "etag": "W/\"xxxxxxx\"",
    "type": "Microsoft.Network/networkSecurityGroups/securityRules",
    "properties": {
        "provisioningState": "Succeeded",
        "protocol": "TCP",
        "sourcePortRange": "*",
        "destinationPortRange": "3389",
        "sourceAddressPrefix": "167.220.0.0/16",
        "destinationAddressPrefix": "*",
        "access": "Allow",
        "priority": 300,
        "direction": "Inbound",
        "sourcePortRanges": [],
        "destinationPortRanges": [],
        "sourceAddressPrefixes": [],
        "destinationAddressPrefixes": []
    }
}

其中:

  1. 资源类型为 type = Microsoft.Network/networkSecurityGroups/securityRules
  2. inbound的属性名为 direction
  3. 3389端口的属性名为destinationPortRange
  4. 而IP地址属性名为sourceAddressPrefix

它们,就是组成Policy Rule的内容

 

第二步:编写 Policy Rule 

Policy的总体框架是:

{
  "mode": "All",
  "policyRule": {
    "if": {
       // 需要进行审计的条件
       //1: 资源的类型是 Microsoft.Network/networkSecurityGroups/securityRules 
       //2: 入站规则 Inbound
       //3: 端口是3389 或 22
       //4: 如果不在允许的IP地址列表里,则需要审计
    },
    "then": {
      "effect": "audit"
    }
  },
  "parameters": {
     //输入参数,本例中是允许的IP地址列表
  }
}

第一个条件:扫描资源的类型为网络安全组的安全规则 

"type": "Microsoft.Network/networkSecurityGroups/securityRules"

转换为Policy语句:

{
  "field": "type",
  "equals": "Microsoft.Network/networkSecurityGroups/securityRules"
}

第二个条件:判断规则的方向为入站方向 

"direction": "Inbound"

转换为Policy语句:

     {
            "field": "Microsoft.Network/networkSecurityGroups/securityRules/direction",
            "equals": "Inbound"
     }

第三个条件:判断端口为3389 或 22

"destinationPortRange": "3389"  或 "destinationPortRange": "22"

转换为Policy语句:

        {
          "anyOf": [
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange",
              "equals": "22"
            },
            {
              "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange",
              "equals": "3389"
            }
          ]
        }

第四个条件:判断IP地址,是否不在允许的列表中

"sourceAddressPrefix": "167.220.0.0/16"

转换为Policy语句:

{
   "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefix",
    "notIn": "[parameters('allowedIPs')]"
 }

 

第三步:准备参数(允许的IP地址作为输入参数)

因为被允许的IP地址应该是多个,所以准备为一个Array对象, 参数名称为:allowedIPs。

结构如下:

    "parameters": {
      "allowedIPs": {
        "type": "Array",
        "metadata": {
          "displayName": "Allowed IPs",
          "description": "The list of allowed IPs for resources."
        },
        "defaultValue": [
          "192.168.1.1","x.x.x.x"
        ]
      }
    }

完整的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": "22"
                        },
                        {
                            "field": "Microsoft.Network/networkSecurityGroups/securityRules/destinationPortRange",
                            "equals": "3389"
                        }
                    ]
                },
                {
                    "field": "Microsoft.Network/networkSecurityGroups/securityRules/sourceAddressPrefix",
                    "notIn": "[parameters('allowedIPs')]"
                }
            ]
        },
        "then": {
            "effect": "audit"
        }
    },
    "parameters": {
        "allowedIPs": {
            "type": "Array",
            "metadata": {
                "displayName": "Allowed IPs",
                "description": "The list of allowed IPs for resources."
            },
            "defaultValue": [
                "192.168.1.1","x.x.x.x"
            ]
        }
    }
}

最终效果:

 

 

参考资料

Using arrays in conditions: https://learn.microsoft.com/en-us/azure/governance/policy/how-to/author-policies-for-arrays#using-arrays-in-conditions
deny-nsg-inbound-allow-all: https://github.com/Azure/azure-policy/blob/master/samples/Network/deny-nsg-inbound-allow-all/azurepolicy.json
Azure Policy definitions audit effect: https://learn.microsoft.com/en-us/azure/governance/policy/concepts/effect-audit

 

标签:Network,22,--,securityRules,Microsoft,Policy,Azure,3389,networkSecurityGroups
From: https://www.cnblogs.com/lulight/p/18387553

相关文章

  • 动态规划——数字三角形模型
    数字三角形模型母题:数字三角形思路​ 集合f[i][j]表示所有从起点走到(i,j)的路径​ 属性f[i][j]存的数是集合中所有路径和的最大值​ 状态计算:对于每一条从起点到(i,j)的路径,其要么是从左上方来的,要么是从右上方来的。#include<bits/stdc++.h>#define......
  • Python的requests库详细介绍
    Pythonrequests库是一个用于发送HTTP请求的简单而强大的库,它可以让你轻松地在Python中处理HTTP请求。这个库是Python中处理HTTP请求的标准工具,因其简洁的API和强大的功能而广受欢迎。1.安装requestspipinstallrequests2.基本用法2.1导入库importr......
  • 五种IO模型的介绍
    前言本文将介绍五种常见的IO模型:阻塞、非阻塞、信号驱动IO、多路复用、异步IO文章的重点在于非阻塞与多路复用。而多路复用IO又有三种常见的方式。后续将会详细介绍。这里就先熟悉一下IO模型、以及认识一下非阻塞IO的编写。建立一个认识IO分为:等+拷贝。比如往磁盘中写数......
  • Comsol&Matlab 扩张式消声器理论解及仿真解
    简单扩张式消声器是工业中广泛采用的一类抗性消声器。扩张式消声器是一种常见的声学装置,用于减少噪音和消除声音的回声。它通常由一系列管道和腔体组成,通过利用声波的传播特性来实现消声效果。扩张式消声器的工作原理基于声波的干涉和相消干涉。当声波进入消声器的管道时,管道......
  • Comsol&Matlab 两级串联扩张式消声器仿真解与解析解
        消声器的声学性能通常要求消声器在工作频率范围内有较大的消声量以及较宽的消声频带。常用的消声器声学性能评价指标通常有传递损失、插入损失、减噪量三种。其中插入损失只能反映整个系统在安装消声器前后声学特性的变化,并不能直接反映消声器本身单独具有的属性。减......
  • 欧联杯:沙姆洛克流浪还有希望?
    蔚山最终在2-1领先的情况下,90分钟丢球被追平,凭借首回合的1球优势晋级足总杯决赛。想想皇马,恩德里克的进球时间比光州还晚,可能这就是足球里的运气守恒定律,当然如果上次选皇马,这次选光州的话,那属于短期运气爆棚,后面还得还回去,在所难免。从比赛内容而言,光州在比赛中派出大量替补反......
  • 2024年高频Java面试题
    1、java反射的作用与原理1、定义:反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象,都能够调用它的任意一个方法。在java中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。这种动态获取的信息以及动态调用对象的方法的功能称为Ja......
  • 原神角色数据列表:数据更新到5.0版本,更换品质排序背景颜色,列表可以显示攻略
    <!DOCTYPEhtml><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>原神角色数据列表</title>......
  • 盘点一个Pycharm汉化过程中的一个坑
    大家好,我是Python进阶者。一、前言前几天在Python最强白银交流群【生产队的驴都是不歇的】问了一个Python汉化的问题,问题如下:要把我弄疯了,汉化不成功,想重新安装,又不给出卸载选项,通过硬盘安装插件又提示异常。去插件文件夹删除所有插件文件,再重新安装pycharm,还是这屌样,重新安装5......
  • Linux学习(15)-网络编程:滑动窗口、拥塞控制、udp
    本节学习内容1.滑动窗口(1.滑动窗口的作用2.如果如果接收端填充的接收窗口为0,发送端接下来怎么处理3.糊涂窗口综合征4.tcp中nagle算法是什么)2.拥塞控制3.udp协议特点及编程流程本节可能会用到的指令ifconfig查看自己的ip地址ping+ip地址验证通信是否连接netstat-natp显......