amazon-web-services - 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"]
}
}
这个配置是为了文档还是有技术原因?
解决方案
该资源的文档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 以另一种方式做出了决定,这更适合该工具,并略微改善了该工具的安全状况,但代价是让人们在很多地方定义一个重复的出口块。
如果您特别关心重复并且您确实希望允许所有出口流量,那么您可能会发现使用自动包含允许所有出口规则的模块很有用。
推荐阅读
- python - 每次Django重新启动时如何调用一个函数?
- flutter - 如何创建处理选择项目等的父列表视图?
- css - 如何修复组件的样式
- java - 斯卡拉火花引起:java.lang.NoSuchMethodError:net.jpountz.lz4.LZ4BlockInputStream。
(Ljava/io/InputStream;Z)V - r - 切换R中的一些向量
- google-bigquery - 使用 BigQuery 公共数据集作为源时权限被拒绝
- javascript - 使用 JavaScript 编写前端和 Java 编写后端的 Android 应用是否算作原生应用?
- angular - 在 Typescript 中仅获取逗号分隔字符串中的动态 JSON 值
- sql - 将基数为 10 的整数转换为基数 3,加上基数为 3 的数字,并将结果转换回基数为 10
- bash - 提取与模式匹配的单词并打印字符长度