在 AWS VPC 中配置相互依赖的安全组

Configure interdependent security groups in AWS VPC

在 AWS VPC 中,我为数据库访问添加了一个安全组,允许来自端口 3306 上的特定 CIDR IP 的任何请求。此 CIDR IP 包括私有子网以及 public 子网。允许 public 子网,以便数据库可以使用堡垒主机显式连接到开发人员机器(在 VPC 的 public 子网上配置的 EC2 实例,并从亚马逊的 public IP 池中分配一个 IP)。

理想情况下,私有子网上的服务应该能够连接到数据库。

  1. 不是在一个安全组中定义允许连接的网络掩码,而是有任何优雅的方法来做到这一点(可能通过创建两个安全组,如此 AWS document 中定义)?
  2. 数据库应仅连接到 3306 端口,但应允许服务使用任何端口访问数据库。如何配置安全组来实现这一点?比如一个安全组只允许3306端口请求(这个安全组可以挂在数据库上)。并且,另一种允许连接到所有端口的安全性(该安全组可以附加到微服务实例)。这个微服务安全组应该以某种方式映射到数据库安全组,无论请求来自哪个端口,它都应该依次调用 3306 端口上的数据库安全组。这能做到吗?

沿着这条线尝试了一些东西:

DBConnectableSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: ...
      GroupDescription: Allows for connection to the DB cluster.

ServerlessDBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: ...
     GroupDescription: Defines rules for connecting to the DB cluster. 

OutboundRule:
    Type: AWS::EC2::SecurityGroupEgress
    Properties:
      IpProtocol: tcp
      FromPort: 0
      ToPort: 65535
      DestinationSecurityGroupId: !GetAtt ServerlessDBSecurityGroup.GroupId
      GroupId: !GetAtt DBConnectableSecurityGroup.GroupId

InboundRule:
    Type: AWS::EC2::SecurityGroupIngress
    Properties:
      IpProtocol: tcp
      FromPort: 3306
      ToPort: 3306
      SourceSecurityGroupId: !GetAtt DBConnectableSecurityGroup.GroupId
      GroupId: !GetAtt ServerlessDBSecurityGroup.GroupId

App-SG -- 入站规则

DB-SG -- 入站规则(源指向 App-SG)

App-SG 和 DB-SG -- 出站规则

现在我将 App-SG 与应用程序相关联。此应用程序可以成功连接到端口 3306 上的数据库(与 DB-SG 的入站规则中配置的相同)。

我将 App-SG 与另一个应用程序相关联。此应用程序使用不同的端口连接到数据库,端口 3310。由于 App-SG 允许所有端口,我希望它能连接到数据库,但这不起作用并且连接被拒绝。

首选配置是:

  • 应用程序资源 (App-SG) 上的安全组,具有使用该应用程序的适当入站权限,以及默认的所有出站权限
  • 数据库 (DB-SG) 上的安全组,允许来自 App-SG 和所有出站
  • 的数据库端口上的入站连接

也就是说,DB-SG在其入站规则中特别引用了App-SG。这样,与 App-SG 关联的任何资源都将被允许与数据库通信。此方法无需指定 IP 地址和 CIDR 范围,任何使用 App-SG 的新资源都将自动获得对数据库的访问权限。