在 AWS VPC 中配置相互依赖的安全组
Configure interdependent security groups in AWS VPC
在 AWS VPC 中,我为数据库访问添加了一个安全组,允许来自端口 3306 上的特定 CIDR IP 的任何请求。此 CIDR IP 包括私有子网以及 public 子网。允许 public 子网,以便数据库可以使用堡垒主机显式连接到开发人员机器(在 VPC 的 public 子网上配置的 EC2 实例,并从亚马逊的 public IP 池中分配一个 IP)。
理想情况下,私有子网上的服务应该能够连接到数据库。
- 不是在一个安全组中定义允许连接的网络掩码,而是有任何优雅的方法来做到这一点(可能通过创建两个安全组,如此 AWS document 中定义)?
- 数据库应仅连接到 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
的新资源都将自动获得对数据库的访问权限。
在 AWS VPC 中,我为数据库访问添加了一个安全组,允许来自端口 3306 上的特定 CIDR IP 的任何请求。此 CIDR IP 包括私有子网以及 public 子网。允许 public 子网,以便数据库可以使用堡垒主机显式连接到开发人员机器(在 VPC 的 public 子网上配置的 EC2 实例,并从亚马逊的 public IP 池中分配一个 IP)。
理想情况下,私有子网上的服务应该能够连接到数据库。
- 不是在一个安全组中定义允许连接的网络掩码,而是有任何优雅的方法来做到这一点(可能通过创建两个安全组,如此 AWS document 中定义)?
- 数据库应仅连接到 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
的新资源都将自动获得对数据库的访问权限。