本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
为满足您在网站提供Web服务、管理远程连接访问等常见场景下的网络流量管理需求,本文介绍如何利用安全组的特性来配置相应的安全组规则,保障云资源网络流量的安全性和可靠性。
安全组应用指导
1、明确业务需求,规划不同的安全组
您需要明确您的业务特性以及对安全性的具体要求。例如哪些服务对外公开,哪些服务仅限内部使用。
公网服务和内网服务的服务器尽量属于不同的安全组
开放多余的业务端口可能会导致自己的应用被公网访问造成业务不安全,所以云服务器所属的安全组规则要采用最严格的规则,建议优先拒绝,默认情况下应当关闭所有的端口和协议,仅暴露对外提供需要服务的端口。
对外提供服务器的安全组职责应该比较清晰和简单,避免在同一服务器上对外提供其他的服务。例如MySQL、Redis等,建议将这些服务安装在没有公网访问权限的云服务器上,然后通过配置安全组规则的授权对象为另一个安全组实现访问权限。
不同的应用使用不同的安全组
在生产环境中,不同的操作系统大多数情况下不会属于同一个应用分组来提供负载均衡服务。提供不同的服务意味着需要暴露的端口和拒绝的端口是不同的,建议不同的操作系统尽量归属于不同的安全组。
例如,对于Linux操作系统,可能需要暴露TCP(22)端口来实现SSH,对Windows可能需要开通TCP(3389)远程桌面连接。
除了不同的操作系统归属不同的安全组,即便同一个镜像类型,提供不同的服务,如果之间不需要通过内网进行访问,建议也划归不同的安全组。这样方便解耦,并对未来的安全组规则进行变更,做到职责单一。
在规划和新增应用时,除了考虑划分不同的虚拟交换机配置子网外,同时也应该合理地规划安全组。使用“网段+安全组”约束自己作为服务提供者和消费者的边界。
生产环境和测试环境使用不同的安全组
为了更好地进行系统的隔离,在实际开发过程中,您可能会构建多套的测试环境和一套线上环境。为了更合理地进行网络隔离,您需要对不同的环境配置使用不同的安全策略,避免因为测试环境的变更刷新到线上,从而影响线上的稳定性。
通过创建不同的安全组,限制应用的访问域,避免生产环境和测试环境连通。同时也可以对不同的测试环境分配不同的安全组,避免多套测试环境之间互相干扰,提升开发效率。
不需要公网访问的资源不分配公网IP
如果需要连接ECS实例,可以使用不需要公网IP的方式,如Workbench、会话管理工具,或者搭建跳板机,尽可能减少公网暴露。如果想要直接访问无公网或者私网环境中部署的服务,可以采用端口转发功能,请参见通过会话管理CLI的端口转发访问无公网实例。
在分布式应用中,大多数应用都有不同的分层和分组,对于不提供公网访问的云服务器尽量不提供公网IP,如果有多台服务器提供公网访问,建议您配置公网流量分发的负载均衡服务来提供公网服务,提升系统的可用性,避免单点故障。详情请参见负载均衡服务。
在专有网络架构下,当您的云服务器需要访问公网的时候,优先建议您使用NAT网关,用于为VPC内无公网IP的ECS实例提供访问互联网的代理服务,您只需要配置相应的SNAT规则即可为具体的CIDR网段或者子网提供公网访问能力,避免因为只需要访问公网的能力而在分配了公网IP(EIP)之后也向公网暴露了服务。具体配置,请参见创建和管理SNAT条目。
以白名单的方式使用安全组
安全组应该作为白名单方式使用,安全组默认拒绝所有访问,您可以添加允许规则来放通指定的端口范围和授权对象。建议尽可能少地开放和暴露端口,以及分配公网IP。若想访问线上机器进行任务日志或错误排查时直接分配公网IP,挂载EIP虽然简便,但是会将整个机器暴露在公网之上。
2、配置安全组规则
安全组是一种虚拟防火墙,用于控制ECS实例入站和出站流量。应该只允许必要的通信端口开放,并尽可能限制源IP地址范围。
普通安全组和企业级安全组默认策略有差异
普通安全组和企业级安全组默认拒绝所有入方向访问。普通安全组默认允许所有出方向访问;企业级安全组默认拒绝所有出方向访问。
不同安全组及不同类型安全组的内网互通性有差异
即使是同一个账户下的ECS实例,如果分属不同安全组,内网网络也是隔离的。普通安全组默认组内内网互通;企业级安全组默认组内内网隔离。
不同网络架构的安全组规则的管控对象有差异
在VPC网络架构下,一条安全组规则可以同时适用于公网和内网访问控制。即通过配置一条规则,您可以限制或允许来自公网和内网的流量访问。
在经典网络架构下,由于经典网络中公网和内网使用相同的IP地址空间,为了控制公网和内网访问,需要分别创建不同的安全组规则。
遵循最小授权原则添加安全组规则
例如,开放Linux实例的22端口用于远程登录时,建议仅允许特定的IP访问。
警告授权对象为0.0.0.0/0,表示允许所有IP访问实例,意味着所有的端口都对外暴露了访问权限。这是非常不安全的。正确的做法是,先拒绝所有的端口对外开放。例如,如果您需要暴露Web服务,默认情况下可以只开放80、8080和443等常用TCP端口,其它的端口都应关闭。
请您根据实际业务需求,按照最小范围开放原则配置安全组规则,尽量避免全开(慎用::/0或者0.0.0.0/0)以免引发安全问题。关于安全组支持的授权对象类型,请参见安全组规则。
遵循最小权限原则设置组内隔离
在不需要普通安全组内ECS实例互相内网互通时,将普通安全组的组内连通策略设置为组内隔离。
尽量保持单个安全组内规则用途统一
按照用途将规则维护在多个安全组中,并将实例关联到这些安全组。单个安全组的规则数量过多,会增加管理复杂度。
谨慎选择安全组规则的授权对象
安全组规则的授权对象可以是IP地址、安全组或者CIDR网段。
如果您想实现在不同安全组的资源之间的网络互通,您应使用安全组方式授权。例如,如果是分布式应用,您会区分不同的安全组,但是不同的安全组可能网络不通,此时,您不应该直接授权IP或者CIDR网段,而是直接授权另外一个安全组ID的所有资源都可以直接访问。例如,您的应用对Web、Database分别创建了不同的安全组:
sg-web
和sg-database
。在sg-database
中,您可以添加如下规则,授权所有的sg-web
安全组的资源访问MySQL(3306)端口。对于内网访问,您应使用源安全组授权,而不是CIDR网段授权。
对于经典网络类型的ECS实例,阿里云默认不开启任何内网的入方向规则。为了安全考虑,不建议开启任何基于CIDR网段的授权。
典型的应用通常使用默认的端口提供服务
这些应用会通过服务器的特定端口与外部进行通信,详情请参见常用端口。
说明如果您需要检测ECS常用端口是否被安全组规则放行,或者检测安全组规则是否允许特定IP与ECS网卡单向访问,您可以在自助问题排查下的安全组规则检测页签完成操作。具体操作,请参见安全组规则检测。
3、持续优化调整
随着业务的发展变化,原有的安全组和安全组规则也可能不再适用。因此,需要定期回顾现有的架构设计,并根据最新的安全态势做出相应调整。建议您修改安全组时,克隆一个安全组在测试环境调试,确保修改后实例流量正常,再对线上环境的安全组规则进行修改,避免误修改线上环境使用的安全组引发业务中断。
安全组应用案例
管控ECS实例的入站流量
即外部资源访问ECS实例的流量,您可以通过设置安全组入方向规则,允许指定的用户访问部署在ECS实例上的业务。安全组入方向规则默认全部拒绝,您只需要配置允许的安全组规则即可。相关案例包含:
管控ECS实例的出站流量
即ECS实例访问外部资源的流量,您可以设置安全组出方向规则,拒绝ECS实例访问指定的外部资源。安全组出方向规则默认全部允许,您只需要配置拒绝的安全组规则即可。相关案例包含:
案例1:部署在ECS实例的网站业务提供Web服务
某个网站业务部署在阿里云ECS实例上,这个网站可以被任何公网用户访问,需要配置的安全组规则,只允许来自任何源的TCP端口80(HTTP)和443(HTTPS)的入站流量,确保网站可以被外部访问,但限制了对服务器上其他服务的直接访问,保障服务器安全。
安全组规则的配置示例如下表所示:
规则方向 | 授权策略 | 优先级 | 协议类型 | 端口范围 | 授权对象 |
入方向 | 允许 | 1 | 自定义TCP | 服务的开放端口:
| 源:0.0.0.0/0 |
如果添加安全组规则后仍无法访问网站,请检查服务的开放端口是否正常工作。具体操作,请参见无法访问ECS实例中的服务的排查方法。
案例2:特定用户需要远程访问ECS实例
当您需要将业务部署在阿里云ECS实例上,为了能够远程连接ECS实例,需要配置的安全组规则,通常需要开放TCP端口22(SSH)或自定义的SSH端口,将允许访问实际远程端口的授权对象限定为特定用户(如管理员)或特定服务器的IP,以减少被恶意攻击的风险。
安全组规则的配置示例如下表所示:
规则方向 | 授权策略 | 优先级 | 协议类型 | 端口范围 | 授权对象 |
入方向 | 允许 | 1 | 自定义TCP |
| 源:192.168.XX.XX 说明 特定用户或特定服务器的IP地址,根据是公网连接还是私网连接输入公网IP或者私网IP。 您可以访问IP地址查询等网站,获取本地网络对应的公网IP地址。 |
使用阿里云Workbench远程连接实例时,只需允许特定的授权对象即可,安全组入方向规则示例如下表所示。
授权策略 | 优先级 | 协议类型 | 端口范围 | 授权对象 |
允许 | 1 | 自定义TCP |
|
|
关于使用Workbench连接经典网络实例的安全组规则说明,请参见使用Workbench连接经典网络实例时相关安全组设置。
案例3:数据库服务部署在ECS的安全策略
数据库服务通常需要更严格的安全策略。您可以通过配置安全组,仅允许来自特定IP地址或安全组(例如应用服务器所在的安全组)的对应端口的入站连接,确保数据库访问的私密性和安全性。
如果您当前使用的入方向规则已经包含了0.0.0.0/0,您需要重新审视自己的应用需要对外暴露的端口和服务。如果确定不想让某些端口直接对外提供服务,您可以添加一条拒绝的规则。例如,如果您的服务器上安装了MySQL数据库服务,默认情况下您不应该将3306端口暴露到公网,此时,您可以添加一条拒绝规则,如下所示,并将其优先级设为100,即优先级最低。
以下是一些常见数据库在默认端口下的安全组规则配置:
数据库类型 | 规则方向 | 授权策略 | 优先级 | 协议类型 | 端口范围 | 授权对象 |
MySQL | 入方向 | 允许 | 1 | 自定义TCP | 目的:3306/3306 | 源:172.16.XX.XX |
Oracle | 入方向 | 允许 | 1 | 自定义TCP | 目的:1521/1521 | 源:192.168.XX.XX |
MS SQL | 入方向 | 允许 | 1 | 自定义TCP | 目的:1433/1433 | 源:192.168.XX.XX/16 |
PostgreSQL | 入方向 | 允许 | 1 | 自定义TCP | 目的:5432/5432 | 源:sg-bp1hv6wvmegs036**** |
Redis | 入方向 | 允许 | 1 | 自定义TCP | 目的:6379/6379 | 源:160998252992****/sg-bp174yoe2ib1sqj5**** |
请根据实际情况替换IP地址、CIDR地址块、阿里云账号ID和安全组ID。
案例4:只允许特定协议的业务访问
根据业务需求,可能需要限制特定的网络协议,例如只允许TCP或UDP的某些端口通信。ICMP协议主要用于在IP主机、路由器之间传递控制消息。在进行一些测试操作之前,需要允许基于ICMP协议的访问。例如,在客户端执行ping
命令来测试网络连通性时,就需要允许ICMP协议的访问。安全组规则的配置示例如下表所示:
规则方向 | 授权策略 | 优先级 | 协议类型 | 端口范围 | 授权对象 |
入方向 | 允许 | 1 |
| 目的:-1/-1 | 客户端IP地址 说明 根据网络环境不同,输入IPv4地址或者IPv6地址。 |
如果添加安全组规则后,仍然无法从客户端ping
通实例,请查阅Linux系统的ECS中没有禁ping却ping不通的解决方法文档进行排查。
案例5:不同安全组的实例实现内网互通
在同一个专有网络中,如果需要在实例之间进行数据共享等操作,例如安全组A的实例需要通过FTP访问安全组B的实例中的共享文件,您可以通过授权安全组的方式实现内网互通。相比于授权单个IP地址或CIDR地址块,授权安全组能够更加便捷地实现多个实例之间的访问。您可以轻松地允许一组实例访问另一组实例,而无需逐个配置每个实例的访问权限。
如果实例分别属于不同的专有网络,则不能通过安全组实现内网互通。您可以使用云企业网连接不同专有网络之间的实例,更多信息,请参见云企业网快速入门。
情况一:
安全组A和安全组B属于同一账号时,授权对象填写安全组ID即可,安全组规则的配置示例如下表所示。
规则方向
授权策略
优先级
协议类型
端口范围
授权对象
入方向
允许
1
自定义TCP
目的:21/21
源:sg-bp1hv6wvmegs036****
说明请根据实际情况替换安全组ID。
情况二:
安全组A和安全组B属于不同账号时,授权对象需要填写阿里云账号ID和安全组ID,安全组规则的配置示例如下表所示。
规则方向
授权策略
优先级
协议类型
端口范围
授权对象
入方向
允许
1
自定义TCP
目的:21/21
源:160998252992****/sg-bp174yoe2ib1sqj5****
说明请根据实际情况替换阿里云账号ID和安全组ID。
案例6:限制ECS实例访问外部网站
如果您需要限制实例只能访问指定网站,可以将安全组作为白名单使用,设置默认拒绝所有出方向访问,然后仅允许访问指定网站的IP。
设置安全组规则时您需要注意:
系统基于协议、端口、授权对象匹配到多条安全组规则后,会继续通过优先级和授权策略来判定最终生效的安全组规则,最终结果为允许访问时才建立会话。
安全组规则优先级的数值越小,代表优先级越高。在相同优先级的情况下,如果两条安全组规则只有授权策略不同,则拒绝策略的安全组规则生效。因此,拒绝策略的优先级应低于允许策略的优先级,这样允许策略的安全组规则才能生效,以实现实例仅对指定网站的出方向访问。
安全组规则的配置示例如下表所示:
规则方向 | 授权策略 | 优先级 | 协议类型 | 端口范围 | 授权对象 |
出方向 | 拒绝 | 2 | 全部 | 目的:-1/-1 | 目的:0.0.0.0/0 |
出方向 | 允许 | 1 | 自定义TCP | 目的:80/80 | 目的:47.96.XX.XX |
出方向 | 允许 | 1 | 自定义TCP | 目的:443/443 | 目的:121.199.XX.XX |
以上规则表示:允许安全组内实例访问47.96.XX.XX上80端口的HTTP服务和访问121.199.XX.XX上443端口的HTTPS服务,除此之外其他出方向的访问均不允许。