我在提供程序是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"]
}
}
此配置是出于文档目的还是出于技术原因?
答案 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做出了相反的决定,该决定更适合该工具,并且略微改善了该工具的安全性,但代价是使人们在很多地方定义了重复的出口街区如果您特别在意重复,并且您确实一直希望允许所有出口流量,那么您可能会发现使用自动包含允许所有出口规则的模块很有用。