AWS 和 Terraform - 安全组中的默认出口规则

Rtm*_*tmY 7 amazon-web-services terraform infrastructure-as-code

我在许多提供者是 AWS 的 Terraform 项目中看到了一个可重复的配置: 出站(出口)规则的配置以允许所有出站流量。

据我了解,这是AWS 用户指南中提到的AWS 中的默认行为:

默认情况下,安全组包含允许所有出站流量的出站规则。您可以删除规则并添加仅允许特定出站流量的出站规则。如果您的安全组没有出站规则,则不允许来自您的实例的出站流量。

安全组的常见 Terraform 设置示例 - 我的问题的重点是出口块:

 resource "aws_security_group" "my_sg" {
       name        = "my_sg"
       description = "Some description"
       vpc_id      = "${aws_vpc.my_vpc.id}"
       tags {
         Name = "my_sg_tag"
       }

       #Not redundant - Because a new security group has no inbound rules.
       ingress {
         from_port   = "80"
         to_port     = "80"
         protocol    = "TCP"
         cidr_blocks = ["0.0.0.0/0"]
       }

       #Isn't this redundant?    
       egress {
         from_port   = 0
         to_port     = 0
         protocol    = "-1"
         cidr_blocks = ["0.0.0.0/0"]
       }
}
Run Code Online (Sandbox Code Playgroud)

此配置是为文档而进行的还是有技术原因?

yda*_*coR 11

该资源的文档aws_security_group特别指出,他们在默认情况下有意删除了 AWS 的默认出口规则,并要求用户指定它以限制用户意外:

关于出口规则的注意事项:默认情况下,AWS 在 VPC 内创建新安全组时会创建 ALLOW ALL 出口规则。在 VPC 内创建新安全组时,Terraform 将删除此默认规则,如果您需要该规则,则要求您专门重新创建它。我们认为这会减少在控制出口规则方面的意外情况。如果您希望此规则到位,您可以使用此出口块:

egress {
  from_port   = 0
  to_port     = 0
  protocol    = "-1"
  cidr_blocks = ["0.0.0.0/0"]
}
Run Code Online (Sandbox Code Playgroud)

这里还有一个技术/用户体验原因,因为在对安全组进行更改时,让 Terraform 了解它是否应该保留允许所有出口规则会很棘手。除非指定了另一个出口规则,否则它是否应该始终提供允许所有出口规则,然后删除默认值?这将如何与aws_security_group_rule资源的组合一起工作?

AWS已经做出了决定,一个默认规则,允许所有出口出站比没有它(和混乱的人,为什么它们的实例是无法沟通出站)没有一个更好的用户体验过太多的安全的影响(相对于等效入站)。即使他们现在改变主意对此的好处,他们也无法在不大量破坏 AWS 非常不愿意做的很多人的设置/工作流程的情况下做到这一点。

另一方面,Terraform 以另一种方式做出了决定,这更适合该工具,并略微改善了工具的安全状况,代价是让人们在很多地方定义重复的出口块。

如果您特别关心重复并且您总是希望允许所有出口流量,那么您可能会发现使用自动包含允许所有出口规则的模块来代替很有用。