NSG简介

Azure网络安全解析

作为公有云最重要环节之一,网络安全一直是Azure的重中之重。在Azure中,多种安全技术共同构成了立体的网络保护:

mark

其中,最常和用户打交道的就是NSG(网络安全组),vm和网络的连接、不同子网间的连接等都可以用NSG来做限制和保护。

NSG的定义

顾名思义,NSG(网络安全组)是由一些列规则(rule)形成的组合。这些规则不关心具体的传输内容(这些在WAF、IPS等解决),而是通过从哪里来(源)、到哪里去(目标)、经过哪个门洞(源端口、目标端口)、传输的什么东西(UDP or TCP)来决定采取什么措施(允许还是拒绝),如下图所示:

mark

那么,在同一个NSG的多条规则是如何同时生效呢?可见如下流程:

mark

简单描述,就是首先根据数据走向决定采用入站规则还是出站规则,然后根据条件(源地址、目标地址、源端口、目标端口、协议类型等)按优先级顺序匹配规则,按照第一个符合条件的规则处理数据流(允许还是拒绝),完成NSG操作;需要注意的是,如果同时符合多个规则的条件,也只执行第一个规则。如果所有规则都不满足,该数据流被丢弃(实际是由最后一条默认规则决定)。

举个例子,给一台网站服务器配置NSG,要求只能访问http服务(80端口),其他端口访问均禁止,制订了如下两条规则:

​ 1. 允许所有地址都可以访问80端口(rule1)

​ 2. 拒绝所有地址访问任意端口(rule2)

当rule1优先级高时,访问http服务首先满足了rule1,可以访问80端口,不再执行rule2;而访问其他端口的行为不满足rule1,则继续执行rule2,拒绝访问。

当rule2优先级高时,则无论访问哪个端口(包含80)都首先满足rule2,拒绝访问,不再继续执行rule1,所以http的访问也会被禁止。

由此可见,规则的顺序非常重要。

下边就结合具体操作简单讲解NSG如何配置及产生作用。

NSG的配置管理——环境准备

环境准备

NSG的创建一般可以在两个地方进行:创建虚机的同时创建NSG;或者单独创建NSG。

本次测试中(所有配置都在资源组HyNSGDemoRG中进行):

子网创建:

创建名为NSGDemoVnet的虚拟网络,并在其下创建名为NSGDemoSunnet的子网:

mark

虚机创建

两台基于windows server的vm:vm01和vm02:

vm01创建时NSG选择无:

mark

vm02选择默认NSG(vm02-nsg);

mark

两台vm都连接到子网NSGDemoSunnet。

检查两台vm的网络配置,汇总如下:

虚机 网络接口 公网ip 私网IP
vm01 vm01234 139.217.2.162 10.5.0.4
vm02 vm02549 139.217.2.198 10.5.0.5

NSG创建:

创建名为NSGDemo的NSG:

mark

NSG比较

检查资源组里的资源,可以看到有两个NSG:单独创建的NSGDemo和随vm02创建的vm-nsg:

mark

NSGDemo:

首先查看NSGDemo,进入NSGDemo,从概述里可以发现,由于是新建NSG,所以出站入站的规则都是空的:

mark

再点击入站安全规则,进入后点击默认规则,这时候会显示如下默认规则:

mark

这是优先级最低的三条规则,如果一个入站数据流所有自定义规则都不满足,就会最终执行这三条规则中的一条。三条规则按顺序分别定义了:

1.从vnet到vnet所有入站网络可通(Allow)

2.从Azure的LB到所有入站网络可通(Allow)

3.从任意网络到任意网络如站不通(Deny)

在没有添加自定义规则的情况下,如果需要访问该NSG后端的网络与设备:

1.如果源和目标都是vnet,满足65000可以访问

2.如果源是Azure的LB,无论目标是什么,都满足65001,都可以访问

3.其他情况,满足65500,网络不通

同样查看出站安全规则的默认规则,也可看到三条默认规则:

mark

按顺序定义了:vnet到vnet所有出站可通;所有源到internet出站可通(所有设备可访问internet),其它情况出站都不通。

默认规则不能删除、修改以及调整优先级。

再检查该NSG管理的网络接口和子网,由于是新建,所以没有任何设备:

mark

mark

vm02-nsg:

检查vm02-nsg,发现与NSGDemo不同之处在于:

已经添加了vm02的网络接口vm02549:

mark

默认建立了一个入站规则default-allow-rdp:

mark

这条规则有什么作用?查看其属性:

mark

其含义是:此规则优先级1000,允许任意源地址访问该规则下所以设备(目前只有vm02)的rpd端口3389。即任意一台联网的电脑可通过远程桌面访问vm02。

测试通过:

mark

mark

再测试vm01:

mark

mark

可以看到因为vm01没有任何NSG的安全限制,可以认为是直接暴露在公网,所以也可以远程桌面访问。

验证NSG作用

做进一步的测试确认NSG的作用。

分别在两台vm启用IIS服务,并确认本机浏览器访问127.0.0.1可打开默认界面:

mark

本地浏览器访问vm01:

mark

本地浏览器访问vm02:

mark

说明:

  • vm01没有NSG保护,任意端口(rdp3389、http80等)都可以访问
    • vm02有NSG保护,除了rdp3389以外,从internet到其他端口的访问均被拒绝,提升了相应安全性

NSG的配置管理——NSG规则配置测试

查看NSG的信息可知,NSG可关联两种类型的设备:网络接口和子网:

mark

下边分别对这两种设备进行NSG的配置管理和测试:

网络接口的NSG配置管理:

点击NSGDemo-网络接口:

mark

点击关联为NSGDemo增加关联的网络接口:

mark

可以看到NSG可以关联到同一个订阅里所有的网络接口,但是已被关联到其他NSG的网络接口无法再被关联,除非取消与其他NSG的关联。

将vm01的网络接口vm01234关联到NSGDemo:

mark

vm01的公共IP和专用IP都被加入了NSG。

完成后可以继续关联其它网络端口,所以网络端口与NSG的关系是多对一。

再通过远程桌面和http去连接vm01,发现已无法连接:

mark

mark

点击NSGDemo-入站安全规则-添加-高级,可看到每条规则需要如下元素:

mark

其中:

  • 名称:该规则的名字,无影响,建议取一个能体现规则含义的简称,例如vm01_http

  • 优先级:纯数字,非常重要,决定了规则的执行顺序(以下用rule+优先级代表规则,例如rule300代表优先级为300的规则)。

    Tips:

    • 优先级的范围是100——4096
    • 不要将规则指定为100和4096,避免需要添加更高优先级或更低优先级时需要编辑rule100和rule4096
    • 优先级不要连续排列,最好中间有一定间隔,例如200、300、400、500,便于以后插入优先级
    • 建议首先创建名为DenyAll的rule4000,拒绝所有未经允许的连接;这条规则其实与最后一条默认入站规则rule65500一样,为什么还要单独创建?因为在Azure中对规则不能单独enable和disable,所以如果要临时禁用一条规则只能删除。如果创建了DenyAll的rule4000,需要临时禁用的规则可以将优先级调整到4000以后,这样勿需删除,重新启用时将优先级调整至合适的数字即可
  • 源:数据流的来源,可定义为Any(所有来源,不限制)、CIDR block、Tag

    Tips:

    • CIDR block:以CIDR的方式描述一个IP段,例如192.168.1.0/24,或者一个确定的IP地址如192.168.1.5
    • Tag:Azure内部对某个类型的网络的标记,一般包含:Internet(外网)、VirtualNetwork(vnet)、AzureLoadBalancer(Azure的LB)
  • 协议:TCP还是UDP,或者两者都包含

  • 源端口范围:1-65536,从源的哪个端口来,可以指定的一个端口(例如80)、或一个端口范围(例如80-1000)、或所有端口(*)

  • 目标:要访问的设备,同样可定义为Any(所有来源,不限制)、CIDR block、Tag

    Tips:

    ​ 如果将目标设置为NSG没有的成员,没有任何意义。

  • 目标端口范围:1-65536,到目标的哪个端口,制定方法同源端口范围

  • 操作:拒绝或允许

现在为vm01在NSGDemo添加规则,允许任何主机http访问,但是不允许rdp连接,可按如下制定规则:

名称 优先级 协议 源端口范围 目标 目标端口范围 操作
DenyAll 4000 Any TCP * Any * 拒绝
vm01_http 300 Any TCP * Any 80 允许

制定好的规则如下:

mark

再次验证,发现rdp仍然无法连通,但http已可以访问:

mark

mark

子网的NSG管理配置:

为了避免干扰,先进入vm01和vm02,取消所有NSG关联。具体做法点击相应vm-网络接口-选择网络接口-网络安全组-编辑-选择无并保存:

mark

进入NSGDemo,删除rule4000以外所有的自建规则:

mark

现在点击子网,关联NSGDemoVnet下的子网NSGDemoSunnet:

mark

现在分别访问vm01和vm02的http,都无法访问,因为vm01和vm都连接到NSGDemoSunnet,而NSGDemo的规则禁止了对NSGDemoSunnet的所有入站访问(此测试在浏览器隐身模式下进行,避免缓存影响):

mark

现在新建一个规则rule300如下:

名称 优先级 协议 源端口范围 目标 目标端口范围 操作
vm_http 300 Any TCP * Any 80 允许

mark

现在可以看到两台vm的http均可访问:

mark

关于NSG目标的进一步探讨:

在NSGDemo里,关联了一个子网NSGDemoSunnet,而NSGDemoSunnet连接了vm01和vm02的网卡。如果希望做进一步的限制,只允许访问vm01的http,而不允许访问vm02,应该如何设置?这时候就需要通过规则的目标来限制了。

查询到vm01和vm02连接到NSGDemoSunnet的网络Tag都是VirtualNet,没办法通过Tag来区分,但是两台vm的IP地址不一样,所以只能用CIDR来限制。

修改之前的rule300,将目标从Any改为CIDR block,内容为10.5.0.4,其他保持不变,如下图:

mark

再分别访问两台vm的http,可以看到vm01的http可以访问,而vm02的则被拒绝了:

mark

再将rule300做一下修改,目标改为vm01的公网IP:

mark

测试vm01的http连接,发现无法打开:

mark

因为NSG关联的子网NSGDemoSunnet连接的vm的专用IP,所以vm01的公网IP并不是NSGDemo的成员,所以连接需求不满足rule300的条件,不执行该规则,直接执行rule4000,禁止所有入站连接。

如果NSG关联的是网络接口,其中成员既包含公网IP也包含专用IP,目标分别设置为公网IP和专用IP,会有什么区别?

重新对NSGDemo进行配置,取消对子网的关联,增加对vm01的网络接口vm01234的关联。

mark

可以看到,NSGDemo关联到两个IP(139.217.2.162和10.5.0.4)。

分三次配置rule300如下,并检查vm01的http访问情况

名称 优先级 协议 源端口范围 目标 目标端口范围 操作
vm_http 300 Any TCP * Any 80 允许
vm_http 300 Any TCP * 10.5.0.4 80 允许
vm_http 300 Any TCP * 139.217.2.162 80 允许

当目标为Any时:

mark

当目标为专用IP(10.5.0.4)时:

mark

当目标为公网IP(139.217.2.162)时:

mark

比较这三种情况,可以发现对公网IP设置的规则是不生效的。

远程桌面到一台vm,运行ipconfig检查IP配置:

mark

可以发现,Azure的vm实际是没有公网IP的,在Azure中给vm分配的公网IP实际是通过类似NAT的方式付给vm,而NSG是直接针对vm的网络接口生效,看不到前段的NAT设备,所以在vm的NSG里配置对公网IP是没意义的,无法生效。

出站规则的管理配置:

以上的配置都是针对入站规则,那么出站规则如何生效?

默认情况下,出站规则允许所有的对外访问。一般情况下,出站的端口是随机挑选,所以很难通过源端口对出站进行操作(允许或拒绝),除非程序很明确有固定的出战端口。而NSG不同于OS的防火墙,对程序无感知,也无法通过对程序进行判断来进行操作(允许或拒绝)。而目标的端口相对来说比较固定,可以通过对目标端口的判断来进行操作(允许或拒绝)。

例如如下出站规则禁止了NSG中所有设备对http(80)的访问:

mark

但是,如果外网的http服务使用了其它端口(例如81),这条规则就无法生效。

Tips:

  • 在严格安全管理的企业网络里,出站也应该严格禁止,所以一般的配置方式是制定一个优先级低的拒绝所有出站的规则,再逐步添加对某一个条件允许的规则

多NSG的管理配置:

之前的描述中,提到可以对子网也可以对vm的网络接口配置NSG,如果子网和vm的网络接口分别有NSG,即同时有多个NSG对一个设备有效时,优先级怎么判断?下边通过测试来检验。

先将所有NSG删除,再建立连个NSG:NSG01关联到子网NSGDemoSunnet,NSG02关联到vm01的网络接口vm01234。

此时两个NSG的默认入站规则拒绝了所有入站,所以http无法打开:

mark

现在NSG01配置允许http访问:

mark

访问http依然无法打开。

删除NSG01建立的入站规则,在NSG02配置允许http访问:

mark

再次访问http也无法打开。

可以看出,多个NSG时,彼此间没有顺序,而是采用拒绝优先的方式。即:当每个NSG都匹配到首个满足的规则时,如果其中一个规则是拒绝,则采用拒绝的规则。

在如上的测试中,每次都只给一个NSG配置了允许http的规则,会满足另一个NSG的默认规则rule65500,拒绝入站,由于拒绝优先,所以导致http无法访问。

现在两个NSG中都配置允许http访问的规则,现在访问vm01的http正常了:

mark

总结

NSG的配置在Azure的配置并不难,关键是弄清楚相关的逻辑关系,合理的规划规则以及规则顺序,结合其他技术,就可以为Azure提供良好的安全保护。