通过设置安全组提升云服务器ECS的安全性
安全组应用指导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、持续优化调整随着业务的发展变化,原有的安全组和安全组规则也可能不再适用。因此,需要定期回顾现有的架构设计,并根据最新的安全态势做出相应调整。建议您修改安全组时,克隆一个安全组在测试环境调试,确保修改后实例流量正常,再对线上环境的安全组规则进行修改,避免误修改线上环境使用的安全组引发业务中断。