【阿里云】ECS安全组实践(三)
在安全组的使用过程中,通常会将所有的云服务器放置在同一个安全组中,从而可以减少初期配置的工作量。但从长远来看,业务系统网络的交互将变得复杂和不可控。在执行安全组变更时,您将无法明确添加和删除规则的影响范围。
合理规划和区分不同的安全组将使得您的系统更加便于调整,梳理应用提供的服务并对不同应用进行分层。这里推荐您对不同的业务规划不同的安全组,设置不同的安全组规则。
区分不同的安全组
公网服务的云服务器和内网服务器尽量属于不同的安全组
是否对外提供公网服务,包括主动暴露某些端口对外访问(例如 80、443 等),被动地提供(例如云服务器具有公网 IP、EIP、NAT 端口转发规则等)端口转发规则,都会导致自己的应用可能被公网访问到。
2 种场景的云服务器所属的安全组规则要采用最严格的规则,建议拒绝优先,默认情况下应当关闭所有的端口和协议,仅仅暴露对外提供需要服务的端口,例如 80、443。由于仅对属于对外公网访问的服务器编组,调整安全组规则时也比较容易控制。
对于对外提供服务器编组的职责应该比较明晰和简单,避免在同样的服务器上对外提供其它的服务。例如 MySQL、Redis 等,建议将这些服务安装在没有公网访问权限的云服务器上,然后通过安全组的组组授权来访问。
如果当前有公网云服务器已经和其它的应用在同一个安全组 SG_CURRENT。您可以通过下面的方法来进行变更。
1.梳理当前提供的公网服务暴露的端口和协议,例如 80、443。
2.新创建一个安全组,例如 SG_WEB, 然后添加相应的端口和规则。
说明:授权策略:允许,协议类型:ALL, 端口: 80/80,授权对象: 0.0.0.0/0, 授权策略:允许,协议类型:ALL,端口: 443/443 授权对象: 0.0.0.0/0。
3.选择安全组 SG_CURRENT, 然后添加一条安全组规则,组组授权,允许 SG_WEB 中的资源访问SG_CURRENT。
说明:授权策略:允许,协议类型:ALL,端口:-1/-1,授权对象:SG_WEB,优先级:按照实际情况自定义[1-100]。
4.将一台需要切换安全组的实例 ECS_WEB_1 添加到新的安全组中。
在 ECS 控制台中,选择 安全组管理。
选择 SG_WEB > 管理实例 > 添加实例,选择实例 ECS_WEB_1 加入到新的安全组 SG_WEB 中,确认 ECS_WEB_1 实例的流量和网络工作正常。
5.将 ECS_WEB_1 从原来的安全组中移出。
在 ECS 控制台中,选择 安全组管理。
选择 SG_CURRENT > 管理实例 > 移出实例,选择 ECS_WEB_1 ,从 SG_CURRENT 移除,测试网络连通性,确认流量和网络工作正常。
如果工作不正常,将 ECS_WEB_1 仍然加回到安全组 SG_CURRENT 中,检查设置的 SG_WEB 暴露的端口是否符合预期,然后继续变更。
6.执行其它的服务器安全组变更。
不同的应用使用不同的安全组
在生产环境中,不同的操作系统大多情况下不会属于同一个应用分组来提供负载均衡服务。提供不同的服务意味着需要暴露的端口和拒绝的端口是不同的,建议不同的操作系统尽量归属于不同的安全组。
例如,对于 Linux 操作系统,可能需要暴露 TCP(22)端口来实现 SSH,对 Windows 可能需要开通 TCP(3389) 远程桌面连接。
除了不同的操作系统归属不同的安全组,即便同一个镜像类型,提供不同的服务,如果之间不需要通过内网进行访问的话,最好也划归不同的安全组。这样方便解耦,并对未来的安全组规则进行变更,做到职责单一。
在规划和新增应用时,除了考虑划分不同的虚拟交换机配置子网,也应该同时合理的规划安全组。使用网段+安全组约束自己作为服务提供者和消费者的边界。
具体的变更流程参见上面的操作步骤。
生产环境和测试环境使用不同的安全组
为了更好的做系统的隔离,在实际开发过程中,您可能会构建多套的测试环境和一套线上环境。为了更合理的做网络隔离,您需要对不同的环境配置使用不通的安全策略,避免因为测试环境的变更刷新到了线上影响线上的稳定性。
通过创建不同的安全组,限制应用的访问域,避免生产环境和测试环境联通。同时也可以对不同的测试环境分配不同的安全组,避免多套测试环境之间互相干扰,提升开发效率。
仅对需要公网访问子网或者云服务器分配公网 IP
不论是经典网络还是专有网络 (VPC) 中,合理的分配公网 IP 可以让系统更加方便地进行公网管理,同时减少系统受攻击的风险。在专有网络的场景下,创建虚拟交换机时,建议您尽量将需要公网访问的服务区的 IP 区间放在固定的几个交换机(子网 CIDR)中,方便审计和区分,避免不小心暴露公网访问。
在分布式应用中,大多数应用都有不同的分层和分组,对于不提供公网访问的云服务器尽量不提供公网IP,如果是有多台服务器提供公网访问,建议您配置公网流量分发的负载均衡服务来公网服务,提升系统的可用性,避免单点。
对于不需要公网访问的云服务器尽量不要分配公网 IP。专有网络中当您的云服务器需要访问公网的时候,优先建议您使用 NAT 网关,用于为 VPC 内无公网 IP 的 ECS 实例提供访问互联网的代理服务,您只需要配置相应的 SNAT 规则即可为具体的 CIDR 网段或者子网提供公网访问能力,具体配置参见 SNAT。避免因为只需要访问公网的能力而在分配了公网 IP(EIP) 之后也向公网暴露了服务。
最小原则
安全组应该是白名单性质的,所以需尽量开放和暴露最少的端口,同时尽可能少地分配公网 IP。若想访问线上机器进行任务日志或错误排查的时候直接分配公网 IP 或者挂载 EIP 虽然简便,但是毕竟会将整个机器暴露在公网之上,更安全的策略是建议通过跳板机来管理。
使用跳板机
跳板机由于其自身的权限巨大,除了通过工具做好审计记录。在专有网络中,建议将跳板机分配在专有的虚拟交换机之中,对其提供相应的 EIP 或者 NAT 端口转发表。
首先创建专有的安全组 SG_BRIDGE,例如开放相应的端口,例如 Linux TCP(22) 或者 Windows RDP(3389)。为了限制安全组的入网规则,可以限制可以登录的授权对象为企业的公网出口范围,减少被登录和扫描的概率。
然后将作为跳板机的云服务器加入到该安全组中。为了让该机器能访问相应的云服务器,可以配置相应的组授权。例如在 SG_CURRENT 添加一条规则允许 SG_BRIDGE 访问某些端口和协议。
使用跳板机 SSH 时,建议您优先使用 SSH 密钥对而不是密码登录。
总之,合理的安全组规划使您在扩容应用时更加游刃有余,同时让您的系统更加安全。