1. 课程导入与治理全景

在 AWS 上,安全的第一性问题不是“网络怎么隔离”,而是“谁可以对这个资源做什么”。身份与权限体系是 AWS 所有服务的公共底座:无论是启动一台 EC2、读取一个 S3 对象、调用一次 Lambda,还是让 CI/CD 流水线部署代码,最终都会被翻译成一次带身份的 API 调用,并由 IAM 策略引擎判定允许或拒绝。本课程围绕这条主线展开,从单账号内的 IAM 用户、角色、策略,逐步扩展到多账号的 Organizations、SCP、权限边界与跨账号访问,最终形成一套可落地、可审计、可扩展的治理体系。

一、治理全景:五个核心对象与它们的关系

理解 AWS 权限治理,先要抓住五个核心对象。第一是主体(Principal),即发起请求的身份,可以是 IAM 用户、IAM 角色、联合身份用户,或 AWS 服务本身。第二是资源(Resource),如 S3 桶、DynamoDB 表、KMS 密钥,每个资源都有唯一的 ARN。第三是策略(Policy),用 JSON 描述“谁在什么条件下能对哪些资源执行哪些操作”。第四是边界(Boundary),包括权限边界、SCP、会话策略,它们不授予权限,只做权限的上限裁剪。第五是组织(Organization),通过 OU 层级把账号分组,让 SCP 和集中式日志、集中式账单得以统一施加。

这五个对象的关系可以用一句话概括:主体携带策略发起请求,策略经过边界裁剪后,由 IAM 策略引擎对资源做最终判定。下图展示了这一判定链路与各对象的相对位置,也标出了本课程后续章节将逐层展开的部分。

AWS 身份权限治理全景:从主体到资源的判定链路 组织层 · AWS Organizations 管理账号 (Root) OU: 生产 OU: 开发 OU: 安全/日志 SCP 上限 主体 Principal IAM 用户 IAM 角色 联合身份 AWS 服务 策略 Policy 身份策略 资源策略 信任策略 会话策略 边界 Boundary(只裁剪不授予) 权限边界 SCP 会话策略 资源控制策略 IAM 策略引擎判定 显式 Deny > 显式 Allow > 隐式 Deny(默认拒绝) 资源 Resource(ARN 唯一标识) S3 · DynamoDB · KMS · Lambda · EC2 … 携带身份策略 裁剪上限

二、学习路径:从单账号到多账号治理

本课程的学习路径遵循“先局部、后全局,先授权、后约束”的顺序。第一阶段聚焦单账号 IAM:理解用户与角色的区别、策略 JSON 的结构(Version、Statement、Effect、Action、Resource、Condition)、以及策略评估逻辑。第二阶段进入多账号治理:用 Organizations 建立 OU 树,用 SCP 设定组织级上限,用跨账号角色实现集中管理与最小权限访问。第三阶段是工程化落地:把权限纳入 IaC(CloudFormation/Terraform)、接入 CloudTrail 与 Access Analyzer 做审计、用权限边界限制开发者自建角色的能力。第四阶段是成本与安全并重:通过标签、预算、集中账单和资源清理策略,让实验环境可控、可回收。

需要特别强调的是,策略评估的默认结果是拒绝。只有当某条策略显式 Allow,且没有任何边界或 SCP 显式 Deny 时,请求才会被放行。这个“默认拒绝”原则贯穿全课程,也是排查权限问题的第一判断依据。

三、实验环境准备:账号、身份与工具

为了让后续实验可复现,建议按以下方式准备环境。首先准备一个管理账号和一个成员账号(示例中命名为 lab-prod),管理账号用于创建组织与 SCP,成员账号用于验证权限效果。不要用根用户做日常操作,根用户只保留在创建组织和设置账单时使用,并立即开启 MFA。

其次,在成员账号中创建一个用于实验的 IAM 角色 LabAdminRole,信任策略允许管理账号中的指定用户切换。这样你可以在不创建长期访问密钥的前提下,通过 sts:AssumeRole 获得临时凭证。示例信任策略如下:

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Allow",
    "Principal": {
      "AWS": "arn:aws:iam::111122223333:root"
    },
    "Action": "sts:AssumeRole",
    "Condition": {
      "Bool": { "aws:MultiFactorAuthPresent": "true" }
    }
  }]
}

第三,安装并配置 AWS CLI v2,使用 aws configure sso 或 aws sts assume-role 获取临时凭证。验证身份是否生效,最直接的方式是调用:

aws sts get-caller-identity
# 预期输出示例(示例值,非实测):
# {
#   "UserId": "AROAEXAMPLE:alice",
#   "Account": "444455556666",
#   "Arn": "arn:aws:sts::444455556666:assumed-role/LabAdminRole/alice"
# }

如果返回的 Arn 是 assumed-role 形式,说明你正在以角色身份操作,而不是长期密钥,这是推荐的工作方式。

四、成本控制:让实验不产生意外账单

身份权限实验本身通常不产生高额费用,但一旦涉及 S3、KMS、CloudTrail、Config 等资源,就可能持续计费。建议在实验前完成三件事:第一,在管理账号启用成本预算,例如设置每月 5 美元的预算告警,阈值 80% 时邮件通知;第二,为所有实验资源打上统一标签,如 Project=iam-lab、Owner=your-name,便于按标签筛选和批量清理;第三,优先使用临时凭证与按需资源,实验结束后删除 IAM 用户访问密钥、删除测试用的 S3 桶和 KMS 密钥(注意 KMS 密钥有 7 天等待删除期,期间仍会计费)。

成本控制的一个实用习惯:每次实验开始前先执行 aws ce get-cost-and-usage 记录基线,实验结束后再对比一次,确认没有遗留资源在持续计费。
不要为了“方便”而创建长期访问密钥并提交到代码仓库。一旦密钥泄露,攻击者可以在数分钟内枚举并删除你的资源。优先使用 IAM 角色、SSO 和临时凭证。

五、本节小结与检查清单