You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:53:15