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

简介: 为了确保Azure虚拟机资源的安全管理,只有指定IP地址才能通过RDP/SSH远程访问。解决方案包括使用Azure Policy服务扫描所有网络安全组(NSG),检查入站规则中的3389和22端口,并验证源地址是否在允许的IP列表中。不符合条件的NSG规则将被标记为非合规。通过编写特定的Policy Rule并定义允许的IP地址参数,实现集中管控和合规性检查。

问题描述

对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

 



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

相关文章
|
29天前
|
Java 应用服务中间件
多项目分接口:在同一Tomcat下使用不同的端口号访问不同的项目。
总而言之,要在同一Tomcat服务器下使用不同端口访问不同项目,关键是通过对server.xml文件的配置创建多个 `<Service>`实例和相应的虚拟主机。这种方法既实现了项目隔离,也有助于优化资源利用率。通过遵循本文的详细说明,很容易地就能满足需求实现多项目分接口。
92 38
|
1月前
|
人工智能 文件存储 开发者
通过Infortress 端口穿透功能访问内网电脑部署的HTTP服务
在远程办公或跨地域协作中,访问内网HTTP服务是技术工程师的常见需求。借助Infortress的端口穿透功能,无需复杂配置即可实现外网访问。本文以Mac电脑为例,通过Python搭建简单HTTP服务,并使用Infortress完成端口穿透配置。具体步骤包括检查Python版本、启动HTTP服务、安装并配置Infortress客户端、获取代理信息及测试外网访问。同时提醒注意安全性与网络稳定性,确保端口合理设置和及时关闭。Infortress简化了内网穿透流程,适合开发者与IT管理员高效协作。
|
2月前
|
域名解析 API PHP
VM虚拟机全版本网盘+免费本地网络穿透端口映射实时同步动态家庭IP教程
本文介绍了如何通过网络穿透技术让公网直接访问家庭电脑,充分发挥本地硬件性能。相比第三方服务受限于转发带宽,此方法利用自家宽带实现更高效率。文章详细讲解了端口映射教程,包括不同网络环境(仅光猫、光猫+路由器)下的设置步骤,并提供实时同步动态IP的两种方案:自建服务器或使用三方API接口。最后附上VM虚拟机全版本下载链接,便于用户在穿透后将服务运行于虚拟环境中,提升安全性与适用性。
|
5月前
|
安全 网络协议 网络安全
【Azure APIM】APIM服务配置网络之后出现3443端口不通,Management Endpoint不健康状态
如果没有关联的网络安全组,则阻止所有网络流量通过子网和网络接口。
133 30
|
4月前
|
人工智能 安全 算法
IP地址、SSL与DeepSeek:现代网络安全的三角防线
在数字化浪潮中,IP地址、SSL协议与AI大模型DeepSeek分别作为网络通信的标识、加密护盾和智能防御核心,共同重塑网络安全范式。本文从技术原理、实践挑战与防御策略三个维度解析其融合价值与未来趋势。IP地址是设备的唯一标识,但易被攻击者利用;SSL通过加密确保数据安全;DeepSeek则通过AI实现智能威胁检测。三者的协同作用,为网络安全提供了全新的解决方案。未来将面临量子计算、AI对抗升级等挑战,需加速技术创新与安全意识提升,构建“协议可信+地址可控+AI赋能”的三维防线,以应对日益复杂的网络安全环境。
|
5月前
|
监控 安全 网络协议
计算机端口:网络通信的桥梁
计算机端口是网络通信的逻辑通道,支持数据传输和服务识别。本文介绍端口定义、分类(知名、注册、动态端口)、作用及管理方法,涵盖常用知名端口如HTTP(80)、HTTPS(443)等,并强调端口安全配置的重要性,帮助读者全面理解这一关键组件。
265 6
|
7月前
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
172 6
|
7月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
175 6
|
6月前
|
SQL 安全 网络安全
网络安全与信息安全:知识分享####
【10月更文挑战第21天】 随着数字化时代的快速发展,网络安全和信息安全已成为个人和企业不可忽视的关键问题。本文将探讨网络安全漏洞、加密技术以及安全意识的重要性,并提供一些实用的建议,帮助读者提高自身的网络安全防护能力。 ####
159 17
|
6月前
|
SQL 安全 网络安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将从网络安全漏洞、加密技术和安全意识三个方面进行探讨,旨在提高读者对网络安全的认识和防范能力。通过分析常见的网络安全漏洞,介绍加密技术的基本原理和应用,以及强调安全意识的重要性,帮助读者更好地保护自己的网络信息安全。
123 10

热门文章

最新文章