网络安全组(NSG)简介

韩源,资深工程师,存储和灾备专家。

Azure 网络安全解析

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

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

NSG的定义

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

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

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

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

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

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

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

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

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

下边就结合具体操作简单讲解NSG如

何配置及产生作用。

Azure 网络安全解析

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

环境准备

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

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

子网创建:

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

虚机创建

两台基于 win

dows server 的 vm:vm01 和 vm02:

vm01 创建时 NSG 选择无:

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

两台 vm 都连接到子网 NSGDemoSunnet。

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

虚机网络接口公网 ip私网 IP
vm01vm01234139.217.2.16210.5.0.4
vm02vm02549139.217.2.19810.5.0.5

NSG 创建:

创建名为 NSGDemo 的 NSG:

NSG 比较

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

NSGDemo:

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

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

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

1.从 vnet 到 vnet 所有

入站网络可通(Allow)

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

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

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

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

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

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

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

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

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

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


vm02-nsg:

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

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

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

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

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

测试通过:

再测试vm01:

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

验证 NSG 作用

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

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

本地浏览器访问 vm01:

本地浏览器访问 vm02:

说明:

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

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

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

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

网络接口的 NSG 配置管理:

点击 NSGDemo-网络接口:

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

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

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

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

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

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

 

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

其中:

  • 名称:该规则的名字,无影响,建议取一个能体现规则含义的简称,例如 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 连接,可按如下制定规则:

    名称优先级协议源端口范围目标目标端口范围操作
    DenyAll4000AnyTCP*Any*拒绝
    vm01_http300AnyTCP*Any80允许

制定好的规则如下:

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

子网的 NSG 管理配置:

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

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

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

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

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

名称 优先级 源 协议 源端口

范围 目标 目标端口范围 操作

vm_http 300 Any TCP * Any 80 允许

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

关于 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,其他保持不变,如下图:

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

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

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

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

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

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

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

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

名称优先级协议源端口范围目标目标端口范围操作
vm_http300AnyTCP*Any80允许
vm_http300AnyTCP*10.5.0.480允许
vm_http300AnyTCP*139.217.2.16280允许

当目标为 Any 时:

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

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

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

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

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

出站规则的管理配置:

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

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

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

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

Tips:

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

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

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

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

现在 NSG01 配置允许 http 访问:

访问 http 依然无法打开。

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

再次访问 http 也无法打开。

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

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

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

总结

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

立即访问http://market.azure.cn

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值