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

时间:2019-03-06 12:53:36

标签: amazon-web-services terraform infrastructure-as-a-code

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

据我了解,这是AWS user guide中提到的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"]
       }
}

此配置是出于文档目的还是出于技术原因?

1 个答案:

答案 0 :(得分:3)

documentation for the aws_security_group resource特别声明,默认情况下,他们有意删除了AWS的默认出口规则,并要求用户指定它以限制给用户带来惊喜:

  

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

egress {
  from_port   = 0
  to_port     = 0
  protocol    = "-1"
  cidr_blocks = ["0.0.0.0/0"]
}

这里还有一个技术/ UX原因,那就是使Terraform了解对安全组进行更改时是否应保留“允许所有出口”规则是很棘手的。除非指定了另一个出口规则,否则是否应该始终提供“允许所有出口”规则,然后删除默认规则? aws_security_group_rule resource的组合如何使用?

AWS已做出决定,允许所有出站出站的默认规则比没有 too 时没有它(让人们混淆其实例无法进行出站通信的原因)更好的用户体验。对安全性的影响很大(与入站的等效影响相比)。即使他们现在就从中受益,改变了主意,他们也将无法做到这一点,而又不会大量破坏AWS非常不愿意做的很多人的设置/工作流程。

另一方面,Terraform做出了相反的决定,该决定更适合该工具,并且略微改善了该工具的安全性,但代价是使人们在很多地方定义了重复的出口街区

如果您特别在意重复,并且您确实一直希望允许所有出口流量,那么您可能会发现使用自动包含允许所有出口规则的模块很有用。