在安全组的使用过程中,通常会将所有的云服务器放置在同一个安全组中,从而可以减少初期配置的工作量。但从长远来看,业务系统网络的交互将变得复杂和不可控。在执行安全组变更时,您将无法明确添加和删除规则的影响范围。

背景信息

合理规划和区分不同的安全组将使您的系统更加便于调整,梳理应用提供的服务并对不同应用进行分层。这里推荐您对不同的业务规划不同的安全组,并设置不同的安全组规则。

区分不同的安全组

  • 公网服务的云服务器和内网服务器尽量属于不同的安全组

    是否对外提供公网服务,包括主动暴露某些端口对外访问(例如80、443 等),被动地提供端口转发规则(例如云服务器具有公网IP、EIP、NAT端口转发规则等),都会导致自己的应用可能被公网访问到。

    2种场景的云服务器所属的安全组规则要采用最严格的规则,建议拒绝优先,默认情况下应当关闭所有的端口和协议,仅仅暴露对外提供需要服务的端口,例如80、443。由于仅对属于对外公网访问的服务器编组,调整安全组规则时也比较容易控制。

    对于对外提供服务器编组的职责应该比较清晰和简单,避免在同样的服务器上对外提供其它的服务。例如MySQL、Redis等,建议将这些服务安装在没有公网访问权限的云服务器上,然后通过安全组的组组授权来访问。

    如果当前有公网云服务器已经和其它的应用在同一个安全组SG_CURRENT。您可以通过下面的方法来进行变更。
    1. 梳理当前提供的公网服务暴露的端口和协议,例如80、443。
    2. 创建一个安全组,例如SG_WEB, 然后添加相应的端口和规则。具体操作,请参见创建安全组
      • 授权策略:允许
      • 协议类型:ALL
      • 端口:80/80和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添加到新的安全组中。
      1. 登录ECS管理控制台
      2. 在左侧导航栏,选择网络与安全 > 安全组
      3. 找到安全组SG_WEB,在操作列下单击管理实例
      4. 单击添加实例
      5. 在弹出的对话框中,选择实例ECS_WEB_1加入到新的安全组SG_WEB中,并单击确定。确认ECS_WEB_1实例的流量和网络工作正常。
    5. 将ECS_WEB_1从原来的安全组中移出。
      1. 登录ECS管理控制台
      2. 在左侧导航栏,选择网络与安全 > 安全组
      3. 找到安全组SG_CURRENT,在操作列下单击管理实例
      4. 选中需要移出安全组的实例ECS_WEB_1,单击移出安全组
      5. 在弹出的对话框中,单击确定
      6. 测试网络连通性,确认流量和网络工作正常。

        如果工作不正常,将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网段或者子网提供公网访问能力,避免因为只需要访问公网的能力而在分配了公网IP(EIP)之后也向公网暴露了服务。具体配置,请参见创建SNAT实现访问公网服务

最小原则

安全组应该是白名单性质的,所以需尽量开放和暴露最少的端口,同时尽可能少地分配公网IP。若想访问线上机器进行任务日志或错误排查的时候直接分配公网IP,挂载EIP虽然简便,但是会将整个机器暴露在公网之上,更安全的策略是通过跳板机来管理。

使用跳板机

跳板机由于其自身的权限巨大,除了通过工具做好审计记录。在专有网络中,建议将跳板机分配在专有的虚拟交换机之中,对其提供相应的EIP或者NAT端口转发表。

首先创建专有的安全组SG_BRIDGE,例如开放相应的端口,例如 Linux TCP(22)或者Windows RDP(3389)。为了限制安全组的入网规则,可以限制能登录的授权对象为企业的公网出口范围,减少被登录和扫描的概率。

然后将作为跳板机的云服务器加入到该安全组中。为了让该机器能访问相应的云服务器,可以配置相应的组授权。例如在SG_CURRENT添加一条规则允许SG_BRIDGE访问某些端口和协议。

使用跳板机SSH时,建议您优先使用SSH密钥对登录。详情请参见SSH密钥对

总之,合理的安全组规划使您在扩容应用时更加游刃有余,同时让您的系统更加安全。