如何在Terraform中修改Active Directory关联安全组的自动规则?
AWS Active Directory自动生成安全组规则管控方案
问题背景
用Terraform部署AWS Active Directory时,服务会自动创建关联的安全组,可通过AD资源的security_group_id属性获取该组ID,也能通过data块引用后添加入站规则,但无法获取自动生成规则的ID,也没法通过Terraform直接删除/修改这些自动规则,需要收紧入站规则的权限。
1. 如何获取自动生成的安全组规则ID?
- 用AWS CLI直接查询:
返回结果里的aws ec2 describe-security-group-rules --filters Name=group-id,Values=<你的安全组ID>GroupRuleId就是每条规则的唯一ID,不管是自动生成还是手动添加的都能查到。 - 也可以在AWS控制台操作:打开目标安全组的详情页,点击任意一条入站规则的「编辑规则」,页面URL里会包含规则ID(格式为
sgr-xxxxxx)。
2. 能否删除自动入站规则后重新添加自定义规则?
Terraform本身管不了这些自动生成的规则(因为不在Terraform状态文件里),但可以用local-exec执行器在部署流程里调用AWS CLI删掉规则,再添加自定义规则:
示例代码:
# 引用AD自动生成的安全组 data "aws_security_group" "ad_sg" { id = aws_directory_service_directory.example.security_group_id } # 清理所有入站规则(可根据端口、CIDR等过滤,避免误删自定义规则) resource "null_resource" "clean_ad_sg_rules" { depends_on = [aws_directory_service_directory.example] provisioner "local-exec" { command = <<EOT aws ec2 describe-security-group-rules --filters Name=group-id,Values=${data.aws_security_group.ad_sg.id} Name=type,Values=ingress | jq -r '.SecurityGroupRules[] | .GroupRuleId' | while read rule_id; do aws ec2 revoke-security-group-ingress --group-id ${data.aws_security_group.ad_sg.id} --security-group-rule-ids $rule_id done EOT } } # 添加自定义严格入站规则 resource "aws_security_group_rule" "ad_restricted_ingress" { depends_on = [null_resource.clean_ad_sg_rules] type = "ingress" from_port = 3389 to_port = 3389 protocol = "tcp" cidr_blocks = ["192.168.1.0/24"] # 仅允许内网指定段访问 security_group_id = data.aws_security_group.ad_sg.id }
注意:本地环境要提前配置好AWS权限,还要安装jq工具;另外如果AD服务后续重启或更新,可能会重新生成默认规则,需要重新执行清理步骤。
3. 其他实现规则收紧的方法
- 安全组嵌套管控:创建一个自定义的严格安全组,让AD自动安全组仅允许来自这个自定义组的流量,所有访问AD的请求都必须经过自定义组的规则校验:
这种方式可以不用删除默认规则,但建议还是先清理默认的开放规则,避免出现权限绕过。# 创建自定义管控安全组 resource "aws_security_group" "ad_restrictor" { name = "ad-restrictor-sg" description = "管控AD安全组的访问权限" vpc_id = aws_vpc.example.id ingress { from_port = 3389 to_port = 3389 protocol = "tcp" cidr_blocks = ["192.168.1.0/24"] } } # 给AD安全组添加规则,仅允许来自自定义管控组的流量 resource "aws_security_group_rule" "ad_allow_restrictor" { type = "ingress" from_port = 0 to_port = 65535 protocol = "-1" source_security_group_id = aws_security_group.ad_restrictor.id security_group_id = aws_directory_service_directory.example.security_group_id } - 子网层面NACL管控:在AD所在的子网配置网络ACL,直接在子网层面对流量做过滤。即使安全组有开放规则,NACL也能拦截不符合要求的请求,属于更上层的权限管控。
内容的提问来源于stack exchange,提问作者Geer
相关产品推荐
相关产品推荐

