多个EC2安全组 – 允许或限制?

将多个安全组分配给实例会发生什么? 如果任何一个安全组织允许,允许stream量,这是否宽容? 或者是在每个安全组必须允许stream量进入的意义上是限制性的?

例如,假设我有一类实例只会与同一个帐户中的其他实例进行通信。 我也有一类实例,只接受通过HTTP(端口80)的stream量。

是否可以通过创build和应用两个安全组来限制对内部实例的访问,并且只能通过HTTP进行访问:

  1. 一个“内部”安全组织。 允许所有传输(TCP,UDP,ICMP)的所有端口上来自该安全组的其他成员的所有stream量
  2. 创build一个“http”安全组。 通过任何来源的TCP允许所有stream量进入端口80。

或者我不得不创build一个单一的安全组,允许来自源端口80的stream量?

如果一个实例具有多个安全组,则它具有各个组中所有规则的总和。

例如,假设我有一类实例只会与同一个帐户中的其他实例进行通信。 我也有一类只能通过http(端口80)接受stream量的实例。

这对AWS Virtual Private Cloud来说是一个完美的情况。 将内部实例置于私有子网中,将公用子网中的公用实例置于公共子网中。

宽容。

根据AWS在这里: http : //docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#security-group-rules

“如果特定端口有多个规则,我们将应用最宽松的规则,例如,如果您有一个允许从IP地址203.0.113.1访问TCP端口22(SSH)的规则,并且允许访问另一个规则到每个人的TCP端口22,每个人都可以访问TCP端口22。

以下是AWS文档支持的回复。 他们说他们会更新文件:

我发现了几个讨论论坛post,这些post解决了一个或多个安全组中的冲突规则的类似问题:

https://forums.aws.amazon.com/thread.jspa?messageID=221768

https://forums.aws.amazon.com/thread.jspa?messageID=349244&#349244

将多个安全组应用于实例时,会聚合这些规则以创build一大组规则。 在EC2中,安全组规则只是宽容的,换句话说,您不能添加任何DENY规则。 这意味着最宽松的规则将始终适用。 例如,如果您有一个安全组允许从IP地址10.10.10.10访问端口22,另一个安全组允许从每个人访问端口22,则每个人都可以访问实例上的端口22。

当您将安全组指定为规则的源或目标时,该规则会影响与该安全组关联的所有实例。 根据与源安全组关联的实例的私有IP地址(而不是公有IP或弹性IP地址)允许传入stream量。 有关IP地址的更多信息,请参阅Amazon EC2实例IP地址。 如果您的安全组规则引用了对等VPC中的安全组,并且删除了引用的安全组或VPC对等连接,则该规则将被标记为陈旧。 有关更多信息,请参阅Amazon VPC对等指南中的使用陈旧安全组规则。

如果某个特定港口有多个规则,我们将采用最宽松的规则。 例如,如果您有一个允许从IP地址203.0.113.1访问TCP端口22(SSH)的规则,并且允许从每个人访问TCP端口22的另一个规则,则每个人都可以访问TCP端口22。

将多个安全组与实例相关联时,来自每个安全组的规则将被有效地聚合,以创build一组规则。 我们使用这组规则来决定是否允许访问。

警告由于您可以将多个安全组分配给一个实例,因此一个实例可以应用数百个规则。 访问实例时可能会导致问题。 因此,我们build议您尽可能地浓缩您的规则。