首页 AWS Data Perimeter 设计 - SCP 如何防止数据外泄
文章
取消

AWS Data Perimeter 设计 - SCP 如何防止数据外泄

Data Perimeter(数据边界)是 AWS 安全体系中定义”信任边界”的一套策略组合。核心目标只有两条:组织内资源只能被组织内账号访问、组织内账号只能访问组织内资源。

实现方式不是单一策略,而是从不同维度分层控制。以下按控制维度逐一说明。

一、主体侧控制:SCP aws:ResourceOrgID

控制什么:限制 IAM 主体只能操作归属于本组织的资源。

原理aws:ResourceOrgID 是全局条件键,在 API 请求中携带目标资源所属的组织 ID。SCP 判断该 ID 是否匹配本组织。

1
2
3
4
5
6
7
8
9
10
{
  "Effect": "Deny",
  "Action": "*",
  "Resource": "*",
  "Condition": {
    "StringNotEqualsIfExists": {
      "aws:ResourceOrgID": "o-xxxxxxxxxx"
    }
  }
}

注意事项

  • StringNotEqualsIfExists 表示当条件键存在时才检查,不存在则放行。这能兼容不支持 ResourceOrgID 的旧服务。如果用 StringNotEquals 配合 Null 会更严格(不存在的也拒绝),但首次部署风险较高
  • SSO 和 Terraform AssumeRole 不受影响,因为操作的资源都在组织内
  • 建议首次部署时 exclude organizations:*support:*,这两类 API 可能不携带 ResourceOrgID
  • 部署前用 IAM Access Analyzer 的 CheckNoNewAccess 策略预检

二、资源侧控制:RCP

控制什么:限制资源只能被组织内的主体访问。与 SCP 互补——SCP 管”谁能操作”,RCP 管”谁能被操作”。

维度SCPRCP
作用对象IAM 主体资源
限制方式主体的权限天花板资源的访问规则
覆盖服务几乎所有服务S3、KMS、IAM Role、SQS、SNS

注意事项

  • RCP 只覆盖 5 个服务,不能替代 SCP
  • 跨账号请求必须同时通过 SCP 和 RCP 检查
  • RCP 发布较新(2024 年底),Terraform 支持的稳定性需要验证

三、网络接入控制:VPC Endpoint Policy

控制什么:限制通过 VPC Endpoint 的 API 调用只能访问指定资源。

价值:即使 SCP 和资源策略(Bucket Policy 等)都被修改,Endpoint Policy 仍然生效——这是独立于 IAM 体系之外的第三层防御。

以 S3 Gateway Endpoint Policy 为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Deny",
    "Action": "s3:PutObject",
    "Resource": "arn:aws:s3:::*",
    "Condition": {
      "ArnNotEquals": {
        "aws:SourceArn": "arn:aws:s3:::audit-bucket/*"
      }
    }
  }]
}

注意事项

  • 需要配合 Gateway Endpoint(S3/DynamoDB 免费)或 Interface Endpoint(其他服务,按小时计费)使用
  • Endpoint Policy 只影响经过该 Endpoint 的流量,不限制公网 API 调用
  • 适合保护特定桶或表,不适合做全局限制

四、网络位置控制:SCP aws:SourceVpc

控制什么:限制敏感 API 调用只能从指定 VPC 发起。

解决的问题:即使身份凭证在组织内,如果攻击者从公网拿到 AccessKey,仍然可以从任意位置调用 API。SourceVpc 把调用位置也纳入限制。

1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "Effect": "Deny",
  "Action": ["s3:PutObject", "kms:Decrypt", "ec2:CopySnapshot"],
  "Resource": "*",
  "Condition": {
    "StringNotEqualsIfExists": {
      "aws:SourceVpc": "vpc-xxxxx"
    },
    "Null": {
      "aws:SourceVpc": "true"
    }
  }
}

注意事项

  • 必须配合 VPC Interface Endpoint 使用——只有经过 Endpoint 的请求才携带 aws:SourceVpc
  • Null: true 的作用:当请求来自公网(无 SourceVpc 键)时直接拒绝
  • 不适合直接全局应用,会阻断所有公网 API 调用。建议先针对 S3 PutObject、KMS Decrypt 等敏感操作逐步收窄
  • 与 SCP ResourceOrgID 配合时,先加上 ResourceOrgID 策略,稳定后再逐步启用 SourceVpc

五、操作可追溯:SCP sts:SourceIdentity

控制什么:强制跨账号角色切换时必须传递操作人身份信息。

解决的问题:没有 SourceIdentity 时,CloudTrail 只能看到”哪个角色执行了操作”,无法追溯到具体操作人。

1
2
3
4
5
6
7
8
9
10
{
  "Effect": "Deny",
  "Action": "sts:AssumeRole",
  "Resource": "*",
  "Condition": {
    "Null": {
      "sts:SourceIdentity": "true"
    }
  }
}

注意事项

  • 需要调用方在 sts:AssumeRole 时主动设置 SourceIdentity 参数,SSO 和一些自动化工具可能不默认携带
  • 开启前需要确认所有 AssumeRole 的调用方都支持设置 SourceIdentity
  • 单纯靠 SCP 强制还不够,需要配合 CloudTrail 日志查询才体现价值

六、基础防护:S3 Block Public Access

控制什么:组织级和账号级禁止 S3 桶公开访问。这是最基础的防护,应该最先部署。

注意事项

  • 可以在组织级( Management 账号)和账号级两个层面开启
  • 组织级开启后,子账号无法自行关闭
  • 开启前检查是否有现有的公开桶依赖

实施建议

P0(必须先做):S3 Block Public Access + SCP aws:ResourceOrgID P1(强烈建议):VPC Endpoint Policy + KMS Key Policy 组织限制 P2(建议做):aws:SourceVpc SCP + S3 Data Events 审计 P3(按需):sts:SourceIdentity + RCP

小结

Data Perimeter 的每一层策略覆盖一个不同的攻击维度:SCP ResourceOrgID 管主体、RCP 管资源、Endpoint Policy 管网络通道、SourceVpc 管调用位置、SourceIdentity 管操作追溯。没有单一策略能覆盖所有场景,分层组合才是关键。

本文由作者按照 CC BY 4.0 进行授权

AWS 中心化网络架构 - 为什么所有流量都该走枢纽 VPC

让 Private 子网的 EC2 访问公网 - TGW + NAT 出站方案