首页 > 解决方案 > AWS 和 Terraform - 安全组中的默认出口规则

问题描述

我在许多提供者是 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"]
       }
}

这个配置是为了文档还是有技术原因?

标签: amazon-web-servicesterraforminfrastructure-as-code

解决方案


资源的文档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"]
}

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

AWS 已决定允许所有出口出站的默认规则比没有它的用​​户体验更好(并且使人们对他们的实例无法出站通信感到困惑)而不会产生太大的安全影响(与等效规则相比)入站)。即使他们现在改变主意,他们也将无法做到这一点,而不会大规模破坏 AWS 非常不愿意这样做的很多人的设置/工作流程。

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

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


推荐阅读