Terraform创建AWS VPC后默认安全组配置的疑问与最佳实践咨询
问题解答
1. 新建安全组还是使用默认安全组?最佳实践是什么?
最佳实践是新建独立的安全组,原因如下:
- 默认安全组初始规则(允许同组内所有入站、全量出站)过于宽松,直接修改容易因配置失误引入安全风险;而且默认组会自动关联到所有未指定安全组的新资源,可能导致意外的权限开放。
- 新建安全组可以实现规则的粒度化管理:针对不同业务场景(如Web服务、数据库、管理节点)创建专属安全组,规则清晰,便于后续维护、审计和权限隔离。
- 避免默认安全组的全局特性带来的配置冲突:后续其他资源误关联默认组时,不会继承你自定义的规则,减少故障影响范围。
2. 使用默认安全组时,如何通过Terraform修改规则?
你现有脚本存在VPC ID引用错误、CIDR格式错误、不必要的安全组关联字段等问题,以下是修正后的实现方式,可直接移除默认入站规则并添加两条自定义规则:
# 接管并修改VPC的默认安全组 resource "aws_default_security_group" "default" { vpc_id = aws_vpc.my_vpc.id # 自定义两条入站规则(默认入站规则会被自动移除) ingress = [ # 规则1:允许指定IP段的SSH访问 { cidr_blocks = ["192.168.1.0/24"] # 替换为你需要允许的实际IP段 description = "Allow SSH from trusted network" from_port = 22 ipv6_cidr_blocks = [] prefix_list_ids = [] protocol = "tcp" self = false to_port = 22 }, # 规则2:允许指定IP段的HTTP访问 { cidr_blocks = ["0.0.0.0/0"] # 根据实际需求调整,比如仅允许公司公网IP description = "Allow HTTP traffic" from_port = 80 ipv6_cidr_blocks = [] prefix_list_ids = [] protocol = "tcp" self = false to_port = 80 } ] # 保留默认全量出站规则(若不需要修改可保留,否则自定义出站规则) egress = [ { cidr_blocks = ["0.0.0.0/0"] description = "Allow all outbound traffic" from_port = 0 ipv6_cidr_blocks = [] prefix_list_ids = [] protocol = "all" self = false to_port = 0 } ] tags = { Name = "default-sg-${var.environment}" } }
关键说明:
- 使用
aws_default_security_group资源时,Terraform会完全接管该安全组的规则配置,所有未在ingress/egress块中定义的原有规则都会被移除,刚好满足你移除默认入站规则的需求。 - 每条入站规则需作为
ingress数组的独立对象,确保两条规则都能生效。 - 若不需要修改出站规则,必须显式保留默认出站规则块,否则Terraform会清空所有出站规则。
内容的提问来源于stack exchange,提问作者snowcoder
相关产品推荐
相关产品推荐

