Terraform中如何限制aws_directory_service_directory自动创建的安全组规则
修复方案
方案1:自定义安全组传入DS服务,禁用自动创建安全组(最稳妥,推荐)
aws_directory_service_directory 资源本身支持传入 security_group_id 参数,你可以提前自行定义符合CIS要求的安全组,把该安全组ID传给DS资源,这样AWS就不会自动创建默认的宽松安全组,规则完全可控。
示例代码如下:
# 预定义符合CIS合规的DS专用安全组 resource "aws_security_group" "ds_sg" { name = "directory-service-compliant-sg" description = "CIS compliant SG for AWS Directory Service" vpc_id = aws_vpc.your_vpc.id # 仅开放必要端口,禁止3389对公网开放,按需限制入站源 ingress { from_port = 53 to_port = 53 protocol = "udp" cidr_blocks = [aws_vpc.your_vpc.cidr_block] # 仅VPC内部访问DNS } ingress { from_port = 389 to_port = 389 protocol = "tcp" cidr_blocks = [aws_vpc.your_vpc.cidr_block] # 仅VPC内部访问LDAP } # 按需添加其他DS必需端口,3389端口不添加0.0.0.0/0规则 egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } tags = { Name = "directory-service-compliant-sg" } } # 目录服务资源,传入自定义安全组,避免自动生成宽松SG resource "aws_directory_service_directory" "main" { name = "your-domain.com" password = "your-admin-password" size = "Small" vpc_settings { vpc_id = aws_vpc.your_vpc.id subnet_ids = [aws_subnet.private1.id, aws_subnet.private2.id] security_group_id = aws_security_group.ds_sg.id # 显式指定自定义SG } }
该方案优势是所有安全规则都是显式定义,完全符合合规要求,没有隐式资源,Terraform状态管理一致性高。
方案2:修改自动生成的安全组规则(适合已部署DS不想重建的场景)
如果你已经部署了DS实例,不想重建,可以通过Terraform的aws_security_group_rule资源,直接引用DS资源返回的自动生成安全组ID,覆盖原有宽松规则,或添加优先级更高的拒绝规则。
示例代码如下:
# 删除原有默认的1024-65535对公网开放的入站规则 resource "aws_security_group_rule" "remove_default_wide_ingress" { type = "ingress" from_port = 1024 to_port = 65535 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] security_group_id = aws_directory_service_directory.main.security_group_id lifecycle { ignore_changes = [cidr_blocks, from_port, to_port] } } # 按需添加合规的入站规则,3389仅允许信任源访问 resource "aws_security_group_rule" "allow_rdp_from_trusted" { type = "ingress" from_port = 3389 to_port = 3389 protocol = "tcp" cidr_blocks = ["192.168.1.0/24"] # 替换为你的信任IP段 security_group_id = aws_directory_service_directory.main.security_group_id }
注意:如果原有默认规则和你定义的移除规则完全匹配,Terraform会执行删除操作,执行计划时会显示
destroy 1 security group rule,确认无误后再执行apply即可。
合规性验证
部署完成后可做如下检查:
- 到EC2控制台安全组页面,查看DS关联的安全组入站规则,确认无
0.0.0.0/0对3389端口的允许规则 - 触发Security Hub重新扫描,确认对应不合规项消失
内容的提问来源于stack exchange,提问作者170730350
相关产品推荐
相关产品推荐

