带你读《从基础到应用云上安全航行指南》——来上课!一文掌握守住ECS网络安全的最佳方法(1):https://developer.aliyun.com/article/1441583
三、控制网络流量
首先,学习一下什么是网络ACL,设想一个典型的场景,交换机A中ECS部署着重要的服务,不希望被其他交换机下的ECS访问到,这就引入了阿里云专有网络的产品能力,网络ACL,只需要给交换机A绑定一个网络ACL,同时设置网络ACL的规则,阻断其他交换机的访问,即可满足自己的需求。
再来介绍一下网络ACL的概念,网络ACL是专有网络中的网络放置、网络访问控制功能,网络ACL的作用范围是专有网络下的虚拟交换机上,您可以自定义设置网络ACL规则,并将网络ACL与交换机进行绑定,实现对交换机中云服务器ECS实例流量的访问控制。
网络ACL的几点特性:
∙ 第一是无状态,设置入方向规则的允许请求后,必须要同时设置出方向的规则,否则就可能导致请求出去了回不来,或者是能进来回不去。
∙ 第二点是网络ACL内没有任何规则时,会拒绝所有出入方向的访问,默认是拒绝所有访问的。
∙ 第三点也是需要注意的,从交换机下的ECS流量不受网络ACL的限制,左图中大概描述了网络ACL的作用原理,需要说明的是,本节只讲解网络ACL,没有考虑安全组的影响。整个图片分为两部分,左侧表示所有交换机没有绑定网络ACL的场景,在这种场景下,整个专有网络的ECS都不受网络ACL的限制,是可以互相访问的。图片的右侧,表示两个交换机都绑定了网络ACL,左侧交换机内的ECS可以彼此互相访问,不受网络AC的控制,右右侧交换机访问左侧交换机需要受到网络ACL规则的限制。
本节讲解了网络ACL的基本概念,下面深入学习一下网络ACL的规则。
ACL规则由以下要素构成,生效顺序、策略、协议类型、源地址、目的地址、目的端口范围等。生效顺序表示生效的优先级,值越小,规则的优先级越高。
系统从生效顺序为一的规则开始判断,只要有一条规则与流量匹配及应用该规则,并忽略其他规则。例如,交换机B中的IP为172.16.0.1的ECS。通过TCP协议访问交换机C中的ECS,再经过如表所示的ACL规则配置后,172.16.0.1的匹配生效顺序2和生效顺序3中规则的源地址。
由于生效顺序2的优先级高于生效顺序3,所以会根据生效顺序2的规则拒绝该请求。策略,针对特定流量选择允许或拒绝。协议类型,指定数据流的协议类型,阿里云的ACL协议支持ALL、ICMP、GRE、TCP、UDP五种。第一种是ALL,即所有协议,当选择所有协议类型时,端口的范围是没办法设置的,必须为-1/-1,表示不限制端口,ICMP协议,网络控制报文协议,当选择该协议类型时。
端口范围无法设置,为-1/-1,表示无限制端口,GRE通用路由封装协议,当选择该封装协议时,端口范围无法设置,为-1/-1,表示不限制端口,TCP传输控制协议,当选择该协议类时,端口范围为1~65535,设置格式可以为1/200或80/80,并且不能设置为-1/-1,UDP是用户数据报协议,当选择该协议类型时,端口范围为1~65535,设置格式为1/200或80/80,且不能设置为-1/-1。
源地址,是用于限制入方向的规则,数据流的源地址,目的地址,是用于限制出方向的规则,表示数据流的目的地址,目的端口的范围,是用于限制入方向规则作用的端口范围,这个就是ACL构成要素的一些详解。
通过网络ACL限制流量,主要分为三步:
∙ 第一步是创建网络ACL;
∙ 第二步是将创建的网络ACL关联到交换机;
∙ 第三是设置网络ACL的规则。
设置后所有的规则会自动对交换机下的ECS的生效,创建网络ACL是首先在的控制台专有网络ACL的页面点击创建网络ACL,也可以通过OpenAPI CreateNetworkAcl 创建ACL,第二步是关联交换机,可以在VPC的控制台、专有网络、网络ACL、网络ACL详情的页面点击关联交换机,也可以通过 OpenAPI AssociateNetworkAcl 绑定ACL到交换机。
第三是设置规则,在VPC的控制台,选择专有网络、网络ACL、网络ACL详情及出入方向的规则进行设置,也可以通过 OpenAPI UpdateNetworkAclEntries 更新网络ACL规则,注意第二步中的OpenAPI 是一个义务的操作,可以通过OpenAPI DescribeNetworkAclAttributes 查询网络ACL的规则的更新状态,更新结果,这就是要讲解的网络ACL详情,下面我们会重点讲解一下,阿里云ECS安全组。
什么是安全组,设想几个常见的安全场景:
∙ 有一个Mysql集群,并且只想对内网放开3306端口的访问
∙ 有一个web集群,只想放80/443端口的外部访问
∙ 有一个AB两个服务集群,彼此之间不希望他们进行通信
∙ 同交换机下的两台ECS不允许彼此访问
前三条都可以通过网络ACL实现,但是最后一个场景不行,只能用安全组实现,因为前文提到过,同交换机下的 ECS是不受网络ACL 的限制的。
安全组的概念:安全组是一种网卡粒度的虚拟防火墙,能够控制ECS实例的出入站流量。安全组的入方向规则控制ECS实力的入站流量,出方向规则控制ECS实力的出站流量。通俗的讲,就像是一个小区的门卫,只放行允许的访问,对于不允许访问会拒绝掉。
上个章节讲解了网络ACL,安全组和它有什么不同?
首先是作用范围,网络ACL的作用范围是交换机下的所有ECS,而安全组的生效范围是安全组中的所有ECS。
安全组是有状态的,网络ACL没有状态,举个例子,源端的ECS出方向的安全组规则允许访问目的端的ECS,即使源端入方向的不允许目地端的ECS放外,出方向的返回请求也不会被拦截。简单概括是安全组能出去就一定能回来,能进去也一定能回来。
需要注意的是,由目的端主动发起的对源端的访问会被拦截掉。而网络ACL则是无状态的,出入方向必须同时配置允许方向的规则才可以放行允许访问。
第三点是同交换机下的ECS受安全组规则的限制,但是不受网络ACL的限制。
第四点是同安组的ECS可以允许互相访问,也可以关闭互相访问的功能。第五是安全组支持组组授权,并且也支持跨账号的数据授权,这一点在功能上是非常强大的,下一节会重点介绍安全组的作用原理。
本节主要介绍安全组的作用原理,要想安全组生效,需要进行如下操作:
∙ 创建安全组;
∙ 根据自己的需求设置安全组的规则;
∙ 将ECS或者弹性网卡加入安全组。当一台ECS加入安全组后,该安全组的所有规则会自动对该ECS生效,流入或者流出ECS所有流量都要受到这些规则的限制。
例如,图中下方的ECS,加入一个安全组,该安全组配置了一条规则,允许来源IP为192.168.1.100的访问,访问22端口,对于来自于192.168.0.100的流量,就是不允许访问的,来自192.168.1.100的流量,对于22个端口的访问会被放行,这就是安全组的作用原理。下一节会重点讲解一下安全组ACL的一个规则。
首先是单条自定义的安全组规则由以下的组成元素,第一是协议类型,第二是端口范围,第三是授权对象,第四是授权策略,第五是优先级,第六是规则方向,第七是规则ID。
详细的介绍一下各个元素,首先是协议类型,匹配流量的协议类型,支持TCP、UDP、ICMP(IPv4)、ICMP(IPv6)和GRE,端口的范围,匹配流量的目的端口,对于TCP和UDP协议,可以指定一个斜线(/)分隔的端口范围,比如8000/9000,或22/22。对其他协议,该字段取值-1/-1表示所有端口。
授权对象:入方向规则中匹配流量的源地址,出方向规则中匹配流量的目的地址。支持CIDR地址块(或IP地址)、安全组、前缀列表三种类型。
具体如下,举个例子,IPv4地址:例如192.168.0.100,IPv4 CIDR地址块:例如192.168.0.0/24,掩码是24位的地段,IPV6地址和IPV6地址段就不再去详细的介绍,还有一个是安全组的ID。支持当前账号下的安全组,或者是跨账号的安全组,还有前缀列表的ID,前缀列表是一些网络前缀。比如CIDR地址块的一些集合,授权对象为前缀列表时,注意该条规则会占用安全组规则的配额数,该条规则占用安全组规则的配额数量,为前缀列表最大条目数,与前缀列表中已有条目数量无关。这一点是需要注意的,下一个是授权策略,可以是允许或者是拒绝,优先级后面会重点去介绍。
下一个是规则的方向,就是出方向或者是入方向,还有规则的ID是表示是唯一组件,安全组规则基于协议类型、端口范围、授权对象来匹配流量,并基于授权策略来允许或拒绝放通流量。对于一般的入方向规则,授权对象匹配流量的来源地址、端口范围、匹配流量的目的地址,对于一般的出方向规则,授权对象匹配流量的目的是端口范围,匹配流量的目的端口,这一点是需要好好的去理解一下。本节重点讲解了安全组ACL的一个构成。下一节会讲解规则的排序策略。
安全组规则的排序依据,可以归纳成两点,第一点是考虑规则的优先级,优先级数值越小的规则,优先级越高,而高优先级的规则总是排在低优先级规则的前面;第二是考虑授权的策略,遵循拒绝规则优先的原则,在两条规则优先级行同时,授权策略的不拒绝的规则是排在授权策略允许的规则之前。
来举一个例子,直观理解一下,上面的图中,是有一个ECS加入了安全组A和安全组B,安全组A和B分别有两条入方向的规则,安全组A和安全B的规则都对该ECS生效,所以访问ECS流量都会受到这些规则的约束,A和B的两个安全组的规则排序后的结果。
首先,是按照优先级进行排序,所以是优先级为1的规则,sgr-4排在最前面,优先级为100的规则,sgr-2排在最后面,由于sgr-2和sgr-3的优先级都是二,所以是按照策略进行排序,即拒绝优先,策略为拒绝的排在策略为允许的前面,由于sgr-3是拒绝,所以sgr-3它排在了sgr-2前面,100.0.0.0/8中100.0.1.0/24的顶端不允许访问该ECS的22端口,该断定的其他地址段可以访问该ECS的22端口,也就是右侧图中蓝色线条中这个橙色的部分不允许访问,不允许访问该ECS,其他的部分都是允许的,本节讲解了安全组规则的排序策略,下一节讲解安全组规则的授权对象前缀列表。
有一种特殊的需求场景,比如,您在线下的 IDC 有大量的物理机通过公网IP访问服务,左图,最左边框里代表一个线下 IDC 的服务集群,这里面可能有 100 多个公网 IP,他们通过官网访问云上的两个集群,这两个集群分别位于安全组 A 和安全组 B,安全组和 A 和 B 都需要放行这 100 多个公网 IP。
现在有两种方案,第一种方案,不使用前缀列表的方案,要做的操作是为安全组 A 和B,分别添加允许线下 100 多个公共 ID 访问的入方向规则,这种方案的缺点是,第一运维成本高,需要做IP数乘以安全组数的次操作,也就是100 乘以 2,200多次操作。第二个是每新增一个IP,需要维护每个安全组的规则,每新增一个IP需要有两次操作。
第二种方案,是使用前缀列表,使用前缀列表需要做如下操作:
∙ 创建前缀列表。
∙ 将线下IDC的100个IP加入到前缀列表中
∙ 为安全组A和B分别添加一条入方向允许访问的规则,规则的授权对象是在1中创建的集用列表
第二个方案极大的降低了运维成本,运维操作数就等于IP的数量,只需要去操作100次。并且攻击事件发生时,可以快速封禁恶意 IP。举个例子,假设线下IDC的这些公网IP是一些恶意的IP,对它进行封禁,发现一个恶意IP,只需要维护一下前缀列表就可以,它就会对所有的IP组都会生效,可以达到快速平定的目的。这就是使用安全组使用前缀列表的场景和介绍。
在云上的实践中,逐渐总结出来一套设置安全组规则的最佳实践,接下来会进行一下分享。
第一点规划,您可以为安全组设置名称描述,也可以设置安全组的标签资源组,便于进行分类运维,建议您合理设置这些信息,方便快速识别安全组用途,在管理较多安全组时,更加清晰。
第二点是以白名单的方式访问安全组,即默认拒绝所有访问,添加允许规则来放通指定的端口范围或者是授权对象。
第三是最小授权的原则,避免设置0.0.0.0的全通对象,第二是仅开放允许放开的IP段端口协议,开放 Linux 实例的 22 端口用于远程登录时,建议仅允许特定的 IP (如跳板机 IP)访问,而非所有IP(0.0.0.0/0),减少被非法侵入风险。按照用途将规则维护在多个安全组中,并将实例关联到这些安全组。单个安全组的规则数量越多,会增加管理的复杂度,
第四点做好隔离,不同类型应用的实例,加入到不同的安全组,分别维护安全组的规则,例如将允许公网访问的实例关联到同一个安全组,仅放通对外提供服务端口,例如80/443,默认拒绝其他的所有访问,避免在允许公网访问的实例上提供一些微信的服务。内部比如 MySQL、Redis 等,建议将这些内部的服务部署在不允许公网访问的实例上,并关联其他的安全组。
第五点避免直接修改线上环境使用的安全组,可以先克隆一个安全组在测试环境调试,能确保修改后流量是正常的,在对安全组的线上规则去进行变更。
第六点是利用组内互通,同一个安全组的ECS默认是可以互相访问的,可以将需要互相通信的ECS实例加入到同一个安全组,避免复杂的 ACL 维护。
第七点是利用组组授权,以安全组为授权对象添加规则,安全组规则中五元组中的来源和目的,都可以使用安全组,用户可以把部署相同服务的ECS统一放入到同一个安全组A中,将安全组A作为另外一个安全组规则B的来源并设置放行,安全组A中的ECS都可以访问B中的ECS,这样可以非常便捷的做好服务的隔离。
第八是使用前缀列表,正如上一节提到的,安全组规则,元素来源和目的都可以使用前缀列表,这样能够极大的降低运维成本,当攻击来临时,运维的越快,风险和损失就越小,讲解完原理和建议,接下来是一个实践环节。
可以通过控制台管理安全组的规则和成员:
第一是管理安全组规则,在ECS控制台安全组列表页选择具体的安全组,点击安全组详情,设置安全组的规则;
第二是管理安全组内的ECS或者弹性网卡。在ECS控制台,安全组列表页,选择具体的安全组,在实际列表页或者是网卡列表tab页面上管理安全组页的成员;
第三是更换ECS安全组,可以在ECS控制台实例列表页面选择具体的实例,有一个安全组的tab,点击修改安全组就可以更换ECS安全组,也可以使用OpenAPI管理安全组的规则和成员,下一节会讲解。
阿里云提供了管理安全组规则合成的六个核心API,他们可以添加安全组入方规则,添加安全组出方向规则,删除安全组入方规则,删除安全组出发规则,ECS或弹性网卡加入到安全组中,ECS或弹性网卡点击开安全组,右侧是一个请求的实例,可以通过common request或者是阿里云提供的SDK,对这些API进行调用,这就是流量控制的完整内容。
带你读《从基础到应用云上安全航行指南》——来上课!一文掌握守住ECS网络安全的最佳方法(3):