我们希望建立一个更具体、更易于管理的安全组,我们提出的概念是通过:
- SG-公共组:允许全局 80/443
- SG-私人组:暂时只是一个标签
- sg-db 组:允许 sg-public-group 和 sg-private-group 使用 3306/tcp
- sg-访问组:允许每个没有公共 IP 地址的子网/私有组使用 22/tcp。
以及应用上述 SG 的 EC2 DB 实例。
以及尝试连接到数据库的 Web 应用程序的 EC2 实例。
我们的 AWS 使用子网作为基本安全性,并且我们的数据库不可公开访问,您需要先在主实例中访问,然后才能访问数据库服务器。
但测试后发现它不起作用。有什么办法可以让它起作用吗?
答案1
AWS 安全组的工作方式为白名单:每一行都是一条许可规则。任何不允许的内容都会被拒绝,而允许的内容则仍旧允许,您无法在任何其他规则中覆盖该规则。
大致来说,安全组可以允许来自以下来源的特定入站流量:
- 给定的 IP 地址或 IP 地址范围;
- 分配了特定安全组的所有实例。
不幸的是,您无法指定任何更复杂的内容,例如“允许从没有公共 IP 的任何实例进行访问” - 您只能指定源安全组。正如您正确假设的那样,Source
字段中列出的安全组可以视为标签。
因此,就您而言,配置应如下:
- 带有 Web 应用程序的 EC2 实例应该具有SG 公共组;
- 带有数据库的 EC2 实例应该具有sg-db-集团和SG 私人群组;
- 仅需要从内部子网通过 SSH 访问的 EC2 实例应该具有sg-访问组(但您仍然需要考虑如何访问您计划访问的那些实例)。
SG 访问自应设置为允许来自属于SG 私人群组。但是,您有责任确保属于SG 私人群组确实没有任何公共IP地址。
更多详细信息请查看AWS 安全组文档:
对于每条规则,您需要指定以下内容:
- 协议:允许的协议。最常用的协议是 6 (TCP)、17 (UDP) 和 1 (ICMP)。
- 端口范围:对于 TCP、UDP 或自定义协议,允许的端口范围。
- ICMP 类型和代码:对于 ICMP,为 ICMP 类型和代码。源或目标:流量的源(入站规则)或目标(出站规则)。指定以下选项之一:
- 单个 IPv4 地址。必须在 IPv4 地址后使用 /32 前缀;例如 203.0.113.1/32。
- (仅限 VPC)单个 IPv6 地址。您必须使用 /128 前缀长度;例如 2001:db8:1234:1a00::123/128。
- 以 CIDR 块表示法表示的 IPv4 地址范围,例如 203.0.113.0/24。
- (仅限 VPC)IPv6 地址范围,采用 CIDR 块表示法,例如 2001:db8:1234:1a00::/64。
- 另一个安全组。这允许与指定安全组关联的实例访问与此安全组关联的实例。这不会将源安全组的规则添加到此安全组。您可以指定以下安全组之一:
- 当前的安全组。
- EC2-Classic:同一区域中 EC2-Classic 的不同安全组。
- EC2-Classic:同一区域内另一个 AWS 账户的安全组(添加 AWS 账户 ID 作为前缀;例如,111122223333/sg-edcd9784)。
- EC2-VPC:针对同一个 VPC 或 VPC 对等连接中的对等 VPC 的不同安全组。