AWS 企业级多账号治理:Landing Zone 架构下的 VPC、IAM、CloudWatch、IaC 与 WAF 五维统一管控

📅 · 企业出海多云架构实战 - ChengziCloud

一句话结论

当企业从单账号 AWS 环境迈向多账号架构时,网络隔离、权限边界、监控聚合、基础设施编排和安全防护这五个维度的治理复杂度会指数级增长。

本文要点
  • 前言
  • VPC 多账号网络架构:从"各自为政"到"中心辐射"
  • IAM 多账号权限管理:从 SCP 到 Permission Set 的四层防线
  • CloudWatch 多账号统一监控:从"告警孤岛"到"集中可观测"
  • CloudFormation 与 Terraform 多账号 IaC 自动化
  • WAF 与 Shield 集中化安全防护:防火墙即服务
  • 五维统一管控的自动化编排

前言

当企业从单账号 AWS 环境迈向多账号架构时,网络隔离、权限边界、监控聚合、基础设施编排和安全防护这五个维度的治理复杂度会指数级增长。AWS 官方的 Landing Zone 方案(基于 Control Tower 或自定义 Organizations 架构)为多账号治理提供了骨架,但真正落地的关键在于:如何在这五个维度上实现统一且灵活的管控,既不让安全成为业务敏捷性的瓶颈,也不让多账号的自由度演变为"配置漂移"的温床。

本文从实战角度出发,系统拆解多账号场景下 VPC 网络架构、IAM 权限管理、CloudWatch 统一监控、CloudFormation/Terraform 基础设施即代码自动化、以及 WAF/Shield 集中安全防护的最佳实践。全文围绕"统一管控"这一核心主线展开,适用于已经或计划采用 AWS Organizations 的企业架构师和平台工程团队。


一、VPC 多账号网络架构:从"各自为政"到"中心辐射"

1.1 多账号 VPC 的三种经典拓扑

在多账号 AWS 环境中,VPC 网络架构的选择直接影响安全边界、运维成本和跨团队协作效率。以下是三种主流拓扑的对比分析:

维度独立 VPC(Per-Account)VPC Peering 全网状Transit Gateway 中心辐射
网络隔离度⭐⭐⭐⭐⭐ 最高⭐⭐⭐ 中等⭐⭐⭐⭐ 高(路由表可控)
管理复杂度⭐⭐ 低(各自管理)⭐⭐⭐⭐⭐ 极高(N×(N-1)/2 连接)⭐⭐⭐ 中等(集中路由管理)
跨 VPC 延迟天然隔离,无跨 VPC 通信<1ms(同 Region)<1ms(同 Region)
成本模型无成本(不通信)数据传出费用 × 连接数TGW 小时费 + 数据传出费
适用规模2-5 个账号3-8 个账号(上限)10+ 账号、百级 VPC
审计与控制分散,难以统一审计分散,Peering 连接散落各账号集中,TGW Route Table 统一管控

推荐方案:对于大多数中大型企业,Transit Gateway (TGW) + Resource Access Manager (RAM) 共享子网是当前 AWS 的最佳实践。核心思路是:

  • Network Hub 账号:集中管理 TGW、Direct Connect、VPN、NAT Gateway 等共享网络资源
  • Spoke 账号:通过 RAM 接收共享子网,或将自有 VPC 挂载到中心 TGW
  • Inspection VPC:在 Network Hub 账号中部署集中化的安全检查和流量审计

1.2 实战:Terraform 编排多账号 TGW 挂载

以下 Terraform 代码展示了如何使用 aws_ec2_transit_gateway_vpc_attachment_accepter 实现跨账号 VPC 挂载的自动化接受——这是多账号 VPC 编排中最容易被忽略但最关键的一步:


# ===== Network Hub 账号(接受方) =====
resource "aws_ec2_transit_gateway" "main" {
  description                     = "Enterprise TGW - Hub"
  amazon_side_asn                 = 64512
  auto_accept_shared_attachments  = "enable"
  default_route_table_association = "disable"
  default_route_table_propagation = "disable"

  tags = {
    Name = "enterprise-tgw"
    Environment = "production"
  }
}

# 自动接受来自 Spoke 账号的 VPC Attachment
resource "aws_ec2_transit_gateway_vpc_attachment_accepter" "spoke" {
  for_each                            = var.spoke_vpc_attachments
  transit_gateway_attachment_id       = each.value.attachment_id
  transit_gateway_default_route_table_association = false
  transit_gateway_default_route_table_propagation = false

  lifecycle {
    ignore_changes = [transit_gateway_attachment_id]
  }
}

# ===== Spoke 账号(发起方) =====
resource "aws_ec2_transit_gateway_vpc_attachment" "spoke" {
  subnet_ids         = aws_subnet.tgw[*].id
  transit_gateway_id = data.aws_ec2_transit_gateway.hub.id
  vpc_id             = aws_vpc.spoke.id

  transit_gateway_default_route_table_association = false
  transit_gateway_default_route_table_propagation = false

  tags = {
    Name = "spoke-${var.account_name}-attachment"
  }
}

关键设计决策:auto_accept_shared_attachments = "enable" 配合 aws_ec2_transit_gateway_vpc_attachment_accepter 可实现零人工介入的跨账号 VPC 挂载。同时,将 default_route_table_association 和 default_route_table_propagation 都设为 disable,再手动分配路由表,可以精确控制哪些 Spoke 之间可以互相通信——这是实现"零信任"网络架构的基础。


二、IAM 多账号权限管理:从 SCP 到 Permission Set 的四层防线

2.1 多账号 IAM 治理的四层模型

在多账号架构中,IAM 权限治理需要从"单账号策略"升级为"层级化权限边界"。以下是四层防御模型的对比:

层级机制作用范围典型场景
L1: SCP(Service Control Policy)Organizations 级别整个 OU 或账号禁止删除 CloudTrail、禁止关闭 Config
L2: Permission BoundaryIAM 实体级别单个 IAM Role/User限制开发者在沙箱内的最大权限边界
L3: Identity-Based PolicyIAM 实体级别单个 IAM Role/User具体允许的操作(如 s3:GetObject)
L4: Resource-Based Policy资源级别单个 AWS 资源S3 Bucket Policy 允许跨账号访问

SCP 是"否定式"控制(Deny 优先),即使下层的 identity policy 显式 Allow,只要 SCP 未包含该服务,操作仍会被拒绝。这种层级关系可以用以下公式表达:

有效权限 = (SCP ∩ Permission Boundary ∩ Identity Policy) ∪ Resource Policy

2.2 实战:SCP 禁止删除核心安全资源


{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyCloudTrailDeletion",
      "Effect": "Deny",
      "Action": [
        "cloudtrail:DeleteTrail",
        "cloudtrail:StopLogging",
        "cloudtrail:UpdateTrail"
      ],
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:PrincipalArn": "arn:aws:iam::${audit_account_id}:role/OrganizationAdminRole"
        }
      }
    },
    {
      "Sid": "DenyConfigDeletion",
      "Effect": "Deny",
      "Action": [
        "config:DeleteConfigRule",
        "config:DeleteConfigurationRecorder",
        "config:DeleteDeliveryChannel"
      ],
      "Resource": "*"
    },
    {
      "Sid": "DenyGuardDutyDisable",
      "Effect": "Deny",
      "Action": [
        "guardduty:DeleteDetector",
        "guardduty:DisassociateFromMasterAccount",
        "guardduty:DisassociateMembers"
      ],
      "Resource": "*"
    }
  ]
}

2.3 IAM Identity Center(原 AWS SSO)+ Permission Set

AWS IAM Identity Center 是多账号权限管理的核心枢纽。它解决了"每个账号单独创建 IAM 用户"的历史痛点,通过以下机制实现统一身份治理:

  • Permission Set:可复用的权限模板,一对一或一对多分配给不同账号
  • ABAC(Attribute-Based Access Control):基于用户属性(部门、职级)动态分配权限
  • 与外部 IdP 集成:支持 Okta、Azure AD、Ping Identity 等企业 SSO

Terraform 管理 Permission Set 示例:


# 创建 Permission Set:开发者只读权限
resource "aws_ssoadmin_permission_set" "developer_readonly" {
  name         = "Developer-ReadOnly"
  instance_arn = data.aws_ssoadmin_instances.main.arns[0]
  description  = "只读权限,用于开发环境排障"
  session_duration = "PT4H"
}

# 附加 AWS 托管策略
resource "aws_ssoadmin_managed_policy_attachment" "readonly" {
  instance_arn       = data.aws_ssoadmin_instances.main.arns[0]
  managed_policy_arn = "arn:aws:iam::aws:policy/ReadOnlyAccess"
  permission_set_arn = aws_ssoadmin_permission_set.developer_readonly.arn
}

# 分配到开发账号
resource "aws_ssoadmin_account_assignment" "dev_readonly" {
  for_each           = toset(var.dev_account_ids)
  instance_arn       = data.aws_ssoadmin_instances.main.arns[0]
  permission_set_arn = aws_ssoadmin_permission_set.developer_readonly.arn
  principal_id       = data.aws_identitystore_group.developers.group_id
  principal_type     = "GROUP"
  target_id          = each.key
  target_type        = "AWS_ACCOUNT"
}

三、CloudWatch 多账号统一监控:从"告警孤岛"到"集中可观测"

3.1 多账号监控的三种聚合模式

模式机制延迟成本适用场景
CloudWatch Cross-Account源账号共享到监控账号实时(原生)低(无数据传出费)首选方案,2022年 GA
EventBridge + Lambda跨账号事件转发秒级中(Lambda 调用费)告警汇聚、自动化响应
S3 + Athena 批量分析CloudTrail/Config 日志集中存储分钟-小时级低(S3 存储费)合规审计、长期趋势分析

3.2 实战:CloudWatch 跨账号可观测性

从 2022 年起,AWS CloudWatch 原生支持跨账号(Cross-Account Observability),无需手动复制指标。这是多账号监控领域最被低估的能力升级:

监控账号侧配置:


# 1. 创建 Monitoring Sink
aws oam create-sink --name "Enterprise-Central-Monitoring"

# 2. 创建 Sink Policy(允许 OU 内所有账号写入)
aws oam put-sink-policy \
  --sink-identifier "arn:aws:oam:us-east-1:111111111111:sink/xxx" \
  --policy '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":"*","Action":"oam:PutLink","Resource":"arn:aws:oam:us-east-1:111111111111:sink/xxx","Condition":{"ForAnyValue:StringEquals":{"oam:AWSOrganizationsPath":"o-xxx/r-xxx/ou-xxx-*"}}}]}'

源账号侧配置:


# 将本账号指标共享到监控账号
aws oam create-link \
  --sink-identifier "arn:aws:oam:us-east-1:111111111111:sink/xxx" \
  --label "production-account-metrics" \
  --resource-types "AWS::CloudWatch::Metric" "AWS::Logs::LogGroup"

配置完成后,在监控账号的 CloudWatch 控制台中可以无缝查看所有已关联账号的指标、告警和日志——无需跨账号切换。

3.3 多账号告警聚合 Pipeline

对于需要统一告警治理的场景,可以使用 EventBridge + SNS + Lambda 构建集中告警管道:


Spoke 账号                     Hub 监控账号
┌─────────────┐              ┌──────────────────┐
│ CloudWatch  │──EventBridge─▶│ EventBridge Rule │
│ Alarm       │  (跨账号)    │                  │
└─────────────┘              │  Lambda          │──▶ SNS (钉钉/Slack/飞书)
                             │  (格式化+去重)   │
                             │                  │──▶ DynamoDB (告警历史)
                             └──────────────────┘

四、CloudFormation 与 Terraform 多账号 IaC 自动化

4.1 多账号 IaC 工具链选型

在多账号环境中,IaC 工具的选择不再是"用 Terraform 还是 CloudFormation"的二元问题,而是如何在合适的位置使用合适的工具:

场景推荐工具理由
Organizations 级别(SCP、OU 结构)CloudFormation StackSets原生支持 Organizations,自动部署到新账号
账号内基础设施(VPC、ECS、RDS)Terraform模块化、多云兼容、状态管理成熟
AWS 原生服务配置(Config、Security Hub)CloudFormation服务团队优先支持 CFn,Terraform 有滞后
第三方/多云资源(Datadog、Cloudflare)TerraformCFn 仅限 AWS 资源

4.2 CloudFormation StackSets:一键部署到整个 OU

StackSets 是多账号 IaC 的核武器级能力。只需编写一次模板,即可自动部署到 Organizations 内的所有账号(包括未来新增账号):


# 强制所有账号启用 AWS Config 的模板
AWSTemplateFormatVersion: "2010-09-09"
Description: "Baseline - Enable AWS Config in all accounts"

Parameters:
  LogsBucketName:
    Type: String
    Description: "S3 bucket for Config logs in Audit account"

Resources:
  ConfigRecorder:
    Type: AWS::Config::ConfigurationRecorder
    Properties:
      Name: default
      RecordingGroup:
        AllSupported: true
        IncludeGlobalResourceTypes: true
      RoleARN: !GetAtt ConfigRole.Arn

  ConfigDeliveryChannel:
    Type: AWS::Config::DeliveryChannel
    Properties:
      S3BucketName: !Ref LogsBucketName
      ConfigSnapshotDeliveryProperties:
        DeliveryFrequency: Six_Hours

  ConfigRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: config.amazonaws.com
            Action: sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWS_ConfigRole

部署命令:


# 使用 StackSet 自动部署到指定 OU
aws cloudformation create-stack-set \
  --stack-set-name "baseline-aws-config" \
  --template-body "file://config-baseline.yaml" \
  --parameters ParameterKey=LogsBucketName,ParameterValue=central-logs-bucket \
  --capabilities CAPABILITY_NAMED_IAM \
  --permission-model SERVICE_MANAGED \
  --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=false

# 部署到整个 Production OU
aws cloudformation create-stack-instances \
  --stack-set-name "baseline-aws-config" \
  --deployment-targets OrganizationalUnitIds="ou-xxxx-prod" \
  --regions "us-east-1" "us-west-2" "ap-east-1"

4.3 Terraform 多账号 Pipeline 模式

对于 Terraform 用户,多账号管理通常采用"目录结构映射账号"模式:


terraform/
├── global/
│   ├── organizations/        # AWS Organizations 结构
│   ├── iam-identity-center/  # SSO / Permission Sets
│   └── route53/              # DNS 根域名
├── accounts/
│   ├── network-hub/          # TGW、DX、VPN
│   ├── security-audit/       # Security Hub、GuardDuty
│   ├── prod-app-1/           # 生产业务账号 1
│   ├── prod-app-2/           # 生产业务账号 2
│   └── dev-sandbox/          # 开发沙箱账号
└── modules/
    ├── vpc/
    ├── ecs-service/
    └── rds-aurora/

关键实践:

  1. Terraform Backend 隔离:每个账号使用独立的 S3 Backend,避免跨账号状态污染
  2. Provider 角色假设:使用 assume_role 跨账号执行,无需设置静态密钥
  3. Git 分支策略:main 自动 Apply 到 Dev → 手动审批 → Apply 到 Staging → 手动审批 → Apply 到 Prod

# Provider 配置:通过 assume_role 跨账号管理
provider "aws" {
  alias  = "network-hub"
  region = "us-east-1"
  assume_role {
    role_arn     = "arn:aws:iam::${var.network_account_id}:role/TerraformExecutionRole"
    session_name = "terraform-cicd"
  }
}

五、WAF 与 Shield 集中化安全防护:防火墙即服务

5.1 多账号 WAF 架构演进

多账号环境中,WAF 管理面临两个核心挑战:(1) 如何避免每个账号各自维护一套规则造成的"规则碎片化";(2) 如何在保持集中管理的同时不成为单点瓶颈。AWS 提供了两种模式:

维度Firewall Manager(FMS)集中管理CloudFront + WAF 前置模式
管理方式自动同步规则到所有成员账号所有流量先经过中心 CloudFront
WAF 所在位置每个账号各自的资源(ALB/CloudFront)仅中心账号的 CloudFront Distribution
扩展性受成员账号 WAF Web ACL 容量限制集中 WAF,单点但可扩展
延迟影响本地处理,无额外延迟多一跳(取决于 CloudFront POP 分布)
适用场景已有多个 ALB 分布在各账号以 CloudFront 为统一入口

5.2 Firewall Manager 实战:一键推送 WAF 规则到所有账号


# 1. 在管理账号创建 WAF 规则组
aws wafv2 create-rule-group \
  --name "Enterprise-Core-Rules" \
  --scope "REGIONAL" \
  --capacity 500 \
  --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName="EnterpriseCoreRules" \
  --rules '[
    {
      "Name": "RateLimit",
      "Priority": 1,
      "Statement": {
        "RateBasedStatement": {
          "Limit": 2000,
          "AggregateKeyType": "IP"
        }
      },
      "Action": {"Block": {}},
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "RateLimitRule"
      }
    },
    {
      "Name": "SQLiProtection",
      "Priority": 2,
      "Statement": {
        "ManagedRuleGroupStatement": {
          "VendorName": "AWS",
          "Name": "AWSManagedRulesSQLiRuleSet"
        }
      },
      "OverrideAction": {"None": {}},
      "VisibilityConfig": {
        "SampledRequestsEnabled": true,
        "CloudWatchMetricsEnabled": true,
        "MetricName": "SQLiProtection"
      }
    }
  ]'

# 2. 通过 Firewall Manager 创建策略
aws fms put-policy \
  --policy-name "WAF-Baseline-All-Accounts" \
  --resource-type "AWS::ElasticLoadBalancingV2::LoadBalancer" \
  --security-service-policy-data '{
    "Type": "WAF",
    "ManagedServiceData": "{\"type\":\"WAF\",\"ruleGroups\":[{\"arn\":\"arn:aws:wafv2:us-east-1:111111111111:regional/rulegroup/Enterprise-Core-Rules/xxx\",\"overrideAction\":{\"type\":\"NONE\"}}]}"
  }' \
  --exclude-resource-tags '[
    {"Key": "waf", "Values": ["exempt"]}
  ]' \
  --remediation-enabled

5.3 Shield Advanced 的成本优化策略

Shield Advanced 的月度费用为 $3,000/月/组织,对于中小型企业来说需要精打细算。以下是 ROI 优化建议:

策略说明预期节省
仅保护"不可中断"资源只将 Shield Advanced 分配给核心 API/支付系统减少资源浪费
利用 Organizations 订阅组织级别订阅可覆盖所有成员账号,无需每账号单独订阅固定 $3,000/月,账号越多越划算
合并 SRP 响应使用 AWS Shield Response Team (SRT) 统一处理所有账号的 DDoS 事件减少人工投入
成本保护机制如果 DDoS 导致 CloudFront/Route 53 产生额外费用,Shield Advanced 提供费用冲抵间接节省

六、五维统一管控的自动化编排

6.1 综合架构总览

将 VPC、IAM、CloudWatch、IaC、WAF 五个维度整合到一起,推荐的分层架构如下:


┌──────────────────────────────────────────────────┐
│                 AWS Organizations                │
│  ┌──────────┐  ┌──────────┐  ┌──────────────┐  │
│  │  Security │  │   Prod   │  │    Sandbox    │  │
│  │    OU     │  │    OU    │  │      OU       │  │
│  │ (Audit +  │  │ (App +   │  │  (Dev + Test) │  │
│  │  Logs)   │  │  Data)   │  │              │  │
│  └──────────┘  └──────────┘  └──────────────┘  │
└──────────────────────────────────────────────────┘
         │              │              │
    ┌────▼────┐    ┌────▼────┐    ┌────▼────┐
    │  WAF +  │    │  IAM    │    │  VPC    │
    │ Shield  │◄───│ Identity│◄───│  TGW    │
    │ (FMS)   │    │ Center  │    │  Hub    │
    └────┬────┘    └────┬────┘    └────┬────┘
         │              │              │
    ┌────▼──────────────▼──────────────▼────┐
    │         Central Monitoring            │
    │  CloudWatch + CloudTrail + Config     │
    │         (Cross-Account OAM)           │
    └───────────────────────────────────────┘
         │
    ┌────▼──────────────────────┐
    │     IaC Pipeline          │
    │  CFn StackSets + TF CI/CD │
    └───────────────────────────┘

6.2 Control Tower 与 Landing Zone 的"踩坑"清单

基于实际部署经验,以下是企业在落地 AWS Landing Zone 时最容易遇到的问题:

踩坑点现象解决方案
SCP 影响 Control Tower 自身过度限制的 SCP 导致 Control Tower 无法管理账号始终为 arn:aws:iam:::role/AWSControlTower 角色设置 SCP 豁免
RAM 共享子网的 IP 冲突多个 VPC 使用相同 CIDR 导致无法挂载 TGW定义全局 CIDR 分配表,通过 IPAM 管理
CloudWatch Cross-Account 数据延迟OAM Sink 未正确配置导致指标不可见验证 OAM Sink Policy 的 oam:AWSOrganizationsPath 条件
Terraform destroy 误删除共享资源在 Hub 账号执行 destroy 影响所有 Spoke为共享资源添加 prevent_destroy 生命周期规则
WAF 规则爆发导致请求延迟增加过多的自定义规则超过 WCU 限制使用 Firewall Manager 的 ruleGroupLimit 控制总 WCU

七、总结

多账号 AWS 治理是一个"牵一发而动全身"的系统工程。VPC 网络是骨架,定义了数据流动的物理边界;IAM 是免疫系统,决定了谁能碰什么;CloudWatch 是神经系统,感知全局的健康状况;IaC 是 DNA,确保每次复制的一致性;WAF/Shield 则是皮肤,抵御来自外部的攻击。

本文提出的五维统一管控框架本质上回答了同一个问题:如何在保持多账号自治灵活性的同时,不失去中心化的安全与合规管控能力? 答案不在某个单一服务的极致配置,而在于五个维度之间的协同编排——这也是平台工程团队在 AWS 环境中的核心价值所在。


本文由 7.chengzicloud.cloud 提供,点击访问首页了解更多