第 2 章

IAM 与安全

⏱️ 90 分钟📚 Design Secure Architectures难度: ⭐⭐
📝 30 题练习
备考助手

🎯 学习目标

  • 掌握 IAM 用户、组和角色的使用
  • 理解 IAM 策略的编写和评估
  • 实施 AWS 安全最佳实践

📌 核心知识点

IAM 用户、组、角色IAM 策略结构与编写MFA 多因素认证AWS Organizations安全最佳实践

学习目标

完成本章学习后,你将能够:

  • 理解 IAM 的核心概念,清楚 Users、Groups、Roles、Policies 之间的关系
  • 读懂并编写 IAM Policy JSON 文档
  • 掌握权限评估流程,能判断"到底有没有权限"
  • 理解 STS 临时凭证、跨账户访问、Permission Boundaries 的工作机制
  • 掌握 Organizations、SCP、Control Tower 的多账户治理体系

学习建议:本章按"门禁系统"来理解整个 IAM 体系。

  • Users / Groups / Roles = 先搞清楚"谁要进门"
  • Policies = 再定义"谁能做什么"
  • STS / MFA = 给进门的人发"临时通行证"和"双重验证"
  • Organizations / SCP = 集团总部统一管理所有子公司的门禁规则

本章知识地图:

                        ┌──────────────┐
                        │   IAM 门禁   │
                        └──────┬───────┘
               ┌───────────────┼───────────────┐
               ▼               ▼               ▼
        ┌──────────┐    ┌──────────┐    ┌──────────────┐
        │ 谁要进门 │    │ 能做什么 │    │  怎么管大楼  │
        │ (身份)   │    │ (权限)   │    │  (治理)      │
        └────┬─────┘    └────┬─────┘    └──────┬───────┘
             │               │                 │
     Users / Groups     Policies          Organizations
     Roles / STS      Boundaries            SCP
     MFA / Federation  Evaluation          Control Tower

1. IAM 是什么

1.1 通俗理解

把 AWS 想成一栋超大的办公大楼。IAM (Identity and Access Management) 就是这栋大楼的 门禁系统

  • 门禁卡 = 你的 AWS 账户凭证(用户名密码、Access Key)
  • 权限级别 = 有的人能进所有楼层,有的人只能进自己的办公室
  • 访客通行证 = 临时凭证(STS),用完就失效
  • 安保日志 = CloudTrail,记录谁在什么时候刷了什么卡

1.2 一句话解释

IAM 是 AWS 的集中式访问控制中心,决定"谁"能对"哪些资源"做"什么操作"。

1.3 为什么第一个学 IAM?

你可能会想:"我想学 EC2、S3 这些好玩的东西,为什么要先学门禁?"

原因很简单:没有 IAM,你什么都做不了。

  • 创建 EC2?需要 ec2:RunInstances 权限
  • 上传文件到 S3?需要 s3:PutObject 权限
  • 查看账单?需要 aws-portal:ViewBilling 权限

IAM 是所有 AWS 服务的"前置条件"。学好 IAM,后面的章节你会轻松很多。

1.4 核心功能

  • Share access at various levels of permission - 多级权限共享
  • Identity federation - 身份联合(支持 Facebook、Google、Active Directory 等外部认证)
  • MFA (Multi-Factor Authentication) - 多因素认证
  • Custom password rotation policy - 自定义密码轮换策略
  • PCI DSS compliant - 符合支付卡行业数据安全标准(通过政府强制的信用卡安全法规)

2. IAM 四大实体

IAM Entities

图解(IAM Identities)
  • 图中展示了 IAM 的四种核心概念。注意看图标含义:User(人形图标)= 具体的人;Group(人群图标)= 一组人;Role(安全帽图标)= 可以被"穿戴"的身份,通常给服务用;Policy(清单图标)= 权限规则。
  • 关键观察:Policy 的框画在外面,说明 Policy 本身不是身份(Identity),而是"附加"到身份上的规则。就像门禁规则不是人,而是贴在门上的告示。
  • 看图顺序建议:User(个人)→ Group(分组管理)→ Role(服务身份)→ Policy(权限规则附加到前三者上)
  • 考试怎么考:题目可能会问"以下哪个不是 IAM Identity?" — 答案是 Policy

2.1 用"公司人员管理"来理解

想象你是一家科技公司的 IT 主管,要管理办公大楼的门禁:

IAM 概念公司类比说明
User每位员工的工牌小明、小红各有一张工牌
Group部门"开发部"、"财务部",入职时分到对应部门就自动有该部门权限
Role临时安全帽外包人员来了,戴上"运维安全帽"就临时拥有运维权限
Policy门禁规则表"开发部可进3楼实验室,不可进4楼财务室"

2.2 Users (用户)

任何个人终端用户,如 employee, system architect, CTO 等。

为什么每人要有独立用户?
  • 共享账号 = 出了事不知道谁干的(无审计追踪)
  • 独立用户 = CloudTrail 能精确记录"谁在什么时候做了什么"

User 认证方式:

认证类型用途说明
Console PasswordAWS Console 登录可设置密码策略
Access KeysCLI / SDKAccess Key ID + Secret Access Key
SSH KeysCodeCommitGit over SSH
Server CertificatesHTTPSSSL/TLS 证书

2.3 Groups (组)

具有共享权限的用户集合,如 system administrators, HR employees, finance teams。

通俗理解: Group 就是公司里的"部门"。你不需要逐个给每位开发人员配权限,只要把他们拉进"开发部"这个 Group,所有人就自动继承开发部的权限。

  • 组内用户 继承 组的所有权限
  • 一个用户可以属于多个组(就像一个人可以同时属于"开发部"和"项目A组")
  • ⚠️ 注意: Groups 不能嵌套!You cannot create subgroups.
  • Groups 只能包含 Users,不能包含其他 Groups 或 Roles

🧠 最易混淆:很多人以为 Group 可以嵌套(像文件夹一样),但 IAM Group 是扁平的,不支持子组。

2.4 Roles (角色)

需要权限执行任务的 AWS 服务或外部实体。

通俗理解: Role 就像一顶"安全帽"。EC2 实例本身没有权限,但"戴上"一个 Role(安全帽),就临时拥有了这个 Role 定义的权限。用完可以摘下来。

常见使用场景:

  • AWS Lambda needing write permissions to S3
  • A fleet of EC2 instances needing read permissions from RDS MySQL
  • Cross-account access from another AWS account
  • Users from corporate directory using Identity Federation

Role 核心概念:

概念说明类比
Trust Policy定义谁可以 assume 这个 role"谁有资格戴这顶安全帽"
Permission Policy定义 role 拥有的权限"戴上安全帽后能干什么"
Role Sessionassume role 后的临时会话"安全帽的使用时段"

🧠 最易混淆:User 是"永久身份",Role 是"临时身份"。不要给 EC2 用 Access Key(永久),应该给它 Role(临时、自动轮换)。

2.5 Policies (策略)

授予或限制访问的规则集合,用 JSON 编写。

通俗理解: Policy 就是贴在门上的"规则清单"。上面写着"允许进入3楼实验室"或者"禁止进入4楼财务室"。

Policy 类型:

类型描述示例类比
AWS ManagedAWS 预定义策略AmazonS3ReadOnlyAccess物业统一制定的标准规则
Customer Managed用户自定义策略可复用,可版本控制公司自己制定的特殊规则
Inline直接嵌入到 User/Group/Role1:1 关系,不可复用写在某人工牌背面的特殊权限

⚠️ 重要: IAM Policies 不是 IAM Identity,而是附加到 IAM Identities 上的。就像"规则"不是"人",而是贴在人身上的。


3. IAM Policy 怎么写

3.1 场景引入

假设你是 IT 主管,公司来了一位实习生小王。你的需求是:

  • 小王只能 查看 S3 里的照片存储桶
  • 小王 不能 删除任何文件
  • 只在 悉尼区域 生效

怎么用 IAM Policy 表达这个需求?看下面这段 JSON:

3.2 Policy JSON 结构

{
  "Version": "2012-10-17",
  "Id": "S3-Account-Permissions",
  "Statement": [
    {
      "Sid": "AllowS3ListRead",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::my-bucket",
        "arn:aws:s3:::my-bucket/*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": "ap-southeast-2"
        }
      }
    }
  ]
}

3.3 逐字段带读

我们逐行拆解这段 JSON,像读合同一样:

字段含义类比
Version"2012-10-17"Policy 语言版本(固定值,别改)合同模板版本号
Id"S3-Account-Permissions"给这个 Policy 起个名字(可选)合同编号
Statement[...]一条或多条权限声明合同条款列表
Sid"AllowS3ListRead"这条声明的 ID(可选)第一条条款的编号
Effect"Allow"允许还是拒绝"允许进入"
Principal"arn:aws:iam::..."谁被允许(Resource-based policy 才需要)"持此工牌的人"
Action["s3:GetObject", ...]允许做什么操作"可以看文件、列清单"
Resource["arn:aws:s3:::my-bucket/*"]对哪些资源生效"仅限照片存储桶"
Condition{"StringEquals": ...}在什么条件下生效"仅限悉尼办公时间"

3.4 Policy 元素详解

元素必需描述
Version策略语言版本,始终用 "2012-10-17"
Id策略标识符
Statement一个或多个权限声明
SidStatement ID,语句标识符
EffectAllowDeny
Principal🔸谁被允许/拒绝(Resource-based policy 需要)
Action允许/拒绝的操作列表
Resource操作应用的资源 ARN
Condition策略生效的条件

3.5 Policy Variables (策略变量)

场景: 公司有 100 个员工,每人在 S3 有自己的文件夹。你不可能写 100 个 Policy。这时候用变量:

{
  "Resource": "arn:aws:s3:::mybucket/${aws:username}/*"
}

${aws:username} 会自动替换成当前登录用户的名字。小王访问时变成 mybucket/xiaowang/*,小红访问时变成 mybucket/xiaohong/*

常用变量:

  • ${aws:username} - IAM 用户名
  • ${aws:userid} - 用户唯一 ID
  • ${aws:PrincipalTag/department} - Principal 的标签值

4. 核心要点

4.1 Global Service

  • IAM is a global AWS service, not limited by regions
  • Any user, group, role or policy is accessible globally
  • 但某些资源可以通过 Condition 限制到特定 region

为什么是全局的? 因为"人"是全局的。你不会因为切到悉尼区域就变成另一个人。IAM 管的是"身份",身份当然是全球通用的。

4.2 Root Account

  • 注册 AWS 时使用的账户拥有完全 admin access
  • 建议使用公司官方邮箱创建 root account
  • ⚠️ 绝对不要 在日常工作中使用 root account
  • ⚠️ 绝对不要 创建 root account 的 access keys
  • 必须 为 root account 启用 MFA

为什么不用 Root? Root 拥有"上帝权限",一旦泄露,攻击者可以删掉你所有数据、创建天价资源。日常操作用权限受限的 IAM User,就像公司老板不会把万能钥匙挂在脖子上到处走。

4.3 New Users

  • New users have no permissions when first created(最小权限原则)
  • 创建用户时会生成 Access Key IDSecret Access Key ID
  • Access Keys 只能下载 一次,丢失需重新生成
  • Access Keys 用于 CLI 和 SDK,不能 用于控制台登录

为什么默认没权限? 这叫 最小权限原则(Least Privilege)。想象新员工入职第一天,门禁卡是空白的,需要 IT 主管逐个开通权限。这比"默认全开、出事再关"安全得多。

4.4 Identity Federation (身份联合)

如果公司有内部 SSO (Single Sign On),可以复用现有身份:

联合类型使用场景协议
SAML 2.0企业 AD/LDAP 集成SAML
Custom Identity Broker不支持 SAML 的系统STS API
Web Identity Federation移动/Web 应用OIDC
AWS SSO多账户 SSOSAML/OIDC
Cognito外部用户 (Google/Facebook)OIDC

为什么需要联合身份? 你的公司有 5000 名员工用 Active Directory 登录电脑。难道要在 AWS 再创建 5000 个 IAM User?联合身份让他们用同一套账号密码登录 AWS,省去重复管理。

4.5 IAM Roles 灵活性

  • 可在 EC2 实例创建前或后分配
  • 可随时更改权限,立即生效
  • 通过 AWS Console 或 CLI 操作
  • Instance Profile 是将 Role 附加到 EC2 的容器

4.6 Tags for Access Control (ABAC)

使用 tags 标记资源和 principals,然后通过 IAM policy 控制访问:

{
  "Condition": {
    "StringEquals": {
      "aws:ResourceTag/Environment": "${aws:PrincipalTag/Environment}"
    }
  }
}

这叫做 Attribute-Based Access Control (ABAC)

通俗理解: 不再按"你是谁"来给权限,而是按"你的标签"来给权限。比如:标签是 Environment=Production 的人只能访问标签也是 Environment=Production 的资源。像停车场按"员工车贴颜色"决定能停哪个区。


5. 权限判断流程

5.1 通俗理解:安检多道关卡

想象你要进入一栋高安全级别的大楼,需要过多道安检:

  1. 黑名单检查(Explicit Deny)→ 名字在黑名单上?直接拒绝,不管你有什么通行证
  2. 集团总部规定(SCP)→ 总部说这栋楼禁止进入?你也进不了
  3. 大楼邀请函(Resource-based Policy)→ 大楼管理员单独邀请你?可以进
  4. 权限上限(Permission Boundary)→ 你的权限等级够吗?
  5. 临时通行证限制(Session Policy)→ 你的临时证件允许进这里吗?
  6. 个人门禁卡(Identity-based Policy)→ 你的卡能刷开这扇门吗?
  7. 默认拒绝(Default Deny)→ 以上都没有明确允许?那就是不能进

5.2 权限优先级

优先级名称描述
1️⃣Explicit Deny明确拒绝,不可覆盖
2️⃣Organization SCPOrganizations Service Control Policy
3️⃣Resource-based Policy资源策略的 Allow
4️⃣Permission Boundary权限边界限制
5️⃣Session PolicyAssumeRole 时的限制
6️⃣Identity-based Policy附加到 User/Group/Role 的策略
7️⃣Default Deny如果没有明确允许,默认拒绝

5.3 权限评估流程图

Request(请求来了)
   │
   ▼
Explicit Deny? ──Yes──▶ ❌ DENY(黑名单直接拒绝)
   │ No
   ▼
SCP Allow? ──No──▶ ❌ DENY(总部不允许)
   │ Yes
   ▼
Resource Policy Allow? ──Yes──▶ ✅ ALLOW (same account)
   │ No
   ▼
Permission Boundary Allow? ──No──▶ ❌ DENY(超出权限上限)
   │ Yes
   ▼
Session Policy Allow? ──No──▶ ❌ DENY (if present)
   │ Yes
   ▼
Identity Policy Allow? ──No──▶ ❌ DENY(门禁卡没权限)
   │ Yes
   ▼
✅ ALLOW(全部通过,放行!)

🧠 考试口诀:"Deny 永远赢" — 只要有一个 Explicit Deny,不管其他 Policy 怎么 Allow,最终结果一定是 Deny。这是 IAM 权限评估的第一定律。

5.4 考试怎么考

典型题目: 一个 IAM User 的 Identity Policy 允许 s3:*,但 SCP 只允许 s3:GetObject。这个 User 能删除 S3 对象吗?

解题思路: 有效权限 = Identity Policy ∩ SCP。s3:DeleteObject 在 Identity Policy 中被允许,但不在 SCP 允许范围内 → 不能删除


6. STS 临时凭证

6.1 通俗理解:酒店房卡

AWS STS (Security Token Service) 提供的临时凭证,就像酒店房卡:

  • 入住时发放(AssumeRole 时获取)
  • 有效期有限(15分钟 ~ 12小时,不是永久的)
  • 只能开指定的门(权限由 Role 的 Policy 决定)
  • 退房后自动失效(过期后不能再用)

对比 IAM User 的 Access Key,那就像你家的钥匙——永远有效,丢了就危险了。

6.2 AssumeRole

为 IAM 用户或 AWS 服务获取临时凭证:

aws sts assume-role \
  --role-arn arn:aws:iam::123456789012:role/MyRole \
  --role-session-name MySession

返回:

  • AccessKeyId - 临时 Access Key
  • SecretAccessKey - 临时 Secret Key
  • SessionToken - 必须随请求发送
  • Expiration - 过期时间(15分钟 ~ 12小时)

为什么用 AssumeRole 而不是直接给 Access Key? 因为临时凭证会自动过期。即使泄露,攻击者也只有很短的窗口期。而 Access Key 一旦泄露,在你发现之前可能已经被滥用数周。

6.3 AssumeRoleWithSAML

用于 SAML 2.0 身份联合:

  • 企业 AD 用户登录 AWS Console
  • 无需创建 IAM 用户

6.4 AssumeRoleWithWebIdentity

用于 Web Identity Federation:

  • 移动应用用户通过 Google/Facebook 登录
  • 推荐使用 Cognito 替代直接调用

6.5 GetSessionToken

用于 MFA 保护的 API 调用:

aws sts get-session-token \
  --serial-number arn:aws:iam::123456789012:mfa/user \
  --token-code 123456

6.6 跨账户访问 (Cross-Account Access)

为什么需要跨账户访问? 大公司通常有多个 AWS 账户(开发、测试、生产)。开发者在"开发账户"工作,但偶尔需要查看"生产账户"的日志。跨账户访问让这成为可能。

方式一:Resource-based Policy

在资源上设置信任其他账户:

{
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:root"
  }
}

支持的服务:S3, SNS, SQS, Lambda, KMS 等。

方式二:AssumeRole

  1. 在目标账户创建 Role,Trust Policy 信任源账户
  2. 源账户用户 assume 目标账户的 role
  3. 获取临时凭证访问资源

示例 Trust Policy:

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

🧠 考试选择题思路: 小规模跨账户 → Resource-based Policy。大规模多账户 → AssumeRole。需要额外安全保障 → 要求 MFA 才能 AssumeRole。


7. Permission Boundaries (权限边界)

7.1 通俗理解:给孩子的零花钱上限

想象你给孩子一张银行卡,但设了 每月 500 元上限。即使孩子知道卡里有 10 万元,每月也只能花 500 元。

Permission Boundary 就是这个"上限":

  • Identity Policy = 孩子想买什么(允许的操作)
  • Permission Boundary = 爸妈设的上限(最大允许范围)
  • 实际权限 = 两者的 交集
有效权限 = Identity Policy ∩ Permission Boundary

即使 Identity Policy 授予 * 权限,Permission Boundary 也会限制实际权限。

7.2 使用场景

  • 允许开发者创建 IAM 角色,但限制他们能授予的权限
  • 防止 privilege escalation(权限提升攻击)

为什么需要它? 假设你允许开发者创建 Lambda 函数的 Role。如果没有 Boundary,开发者可以给这个 Role AdministratorAccess,然后通过 Lambda 获得管理员权限——这就是"权限提升"。有了 Boundary,即使开发者想授予 *,实际权限也不会超出边界。

7.3 示例

设置 Permission Boundary 只允许 S3 和 CloudWatch:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:*",
        "cloudwatch:*"
      ],
      "Resource": "*"
    }
  ]
}

8. MFA (Multi-Factor Authentication)

8.1 通俗理解:银行 U 盾

你去银行转账,只输密码不够,还需要插 U 盾或输入手机验证码。MFA 就是 AWS 版的"U 盾":

  • 第一因素 = 你知道的东西(密码)
  • 第二因素 = 你拥有的东西(手机 App、硬件设备)

即使密码被盗,没有第二因素也登录不了。

8.2 MFA 设备类型

类型示例适用场景
Virtual MFAGoogle Authenticator, Authy最常用,手机 App 生成 6 位数
Hardware MFAGemalto token高安全性要求的企业
U2F Security KeyYubiKey物理密钥,插 USB 验证
Hardware MFA for Root专用设备Root 账户专用

8.3 MFA 强制策略

强制用户使用 MFA 才能执行操作:

{
  "Condition": {
    "BoolIfExists": {
      "aws:MultiFactorAuthPresent": "true"
    }
  }
}

8.4 MFA Delete for S3

启用 MFA Delete 后,删除对象版本需要 MFA 认证:

  • 防止意外删除
  • 只有 bucket owner (root account) 可以启用/禁用
  • 只能通过 CLI 启用,不能通过 Console

🧠 考试考法: "如何防止 S3 对象被意外或恶意删除?" → 启用 Versioning + MFA Delete


9. 安全工具箱

IAM 不只是"设权限",还提供了一整套安全监控工具。把它想成门禁系统的"监控中心":

9.1 IAM Access Advisor (User Level)

什么时候用: 你想知道某个用户的权限是不是给多了。

  • 显示授予用户的 service permissions
  • 显示 last accessed time(最后一次使用该权限的时间)
  • 用于实施最小权限原则 — 如果一个权限 90 天没用过,大概率可以移除

9.2 IAM Credentials Report (Account Level)

什么时候用: 安全审计,检查整个账户的凭证健康状况。

  • 列出所有账户用户及其 credentials 状态
  • 包含:密码、Access Keys、MFA 状态
  • 用于 安全审计合规检查
  • 每 4 小时可生成一次

9.3 IAM Access Analyzer

什么时候用: 检查是否有资源被意外公开。

  • 分析资源策略,识别 外部访问
  • 发现意外公开或跨账户共享的资源
  • 支持:S3, IAM Roles, KMS, Lambda, SQS

9.4 AWS CloudTrail

什么时候用: 出了安全事件,需要"回看监控录像"。

AWS CloudTrail Architecture

图解(CloudTrail)
  • 左侧红色图标是 CloudTrail 服务。它捕获两类事件:Management Events(管理操作,如创建 EC2、修改 IAM 策略)和 Data Events(数据操作,如 S3 GetObject、Lambda Invoke)。
  • 日志可发送到两个目的地:CloudWatch Logs(实时告警,像安保人员盯着监控屏幕)和 S3(长期存储归档,像监控录像存硬盘)。
  • 底部说明 Trail 可配置为 One Region(单区域)或 All Regions(全区域)。
  • 右侧提示 IAM、STS 等 Global Services 的事件默认记录在 us-east-1。
  • 考试怎么考:"谁在凌晨3点删了这个 S3 bucket?" → 查 CloudTrail 日志。

CloudTrail 核心功能:

  • 记录所有 IAM API 调用
  • 用于安全分析、合规审计、故障排查

9.5 CloudWatch Logs

CloudWatch Logs Integration

图解(CloudWatch Logs)
  • 日志有三层结构:各种 Logging Sources(EC2、Lambda、CloudTrail 等)产生日志 → 进入 Log Group(日志容器,按应用/服务分组)→ 每个 Group 内有多个 Log Stream(日志流,按实例/时间区分)→ 流中是一条条 Log Events(具体日志条目)。
  • 右侧是监控链:从日志中提取 Metric Filter(如"ERROR 出现次数")→ 生成 Metric(指标)→ 触发 Alarm(告警,如"ERROR 超过 10 次就发邮件")。
  • 考试怎么考:"如何在 IAM 策略被修改时立即收到通知?" → CloudTrail 日志 → CloudWatch Logs → Metric Filter → Alarm → SNS 通知。

10. Organizations & SCP

10.1 通俗理解:集团管子公司

想象你是一家集团公司(AWS Organizations)的总部。集团下面有好几家子公司(Member Accounts):

  • 总部(Management Account)= 统一支付所有子公司的账单,制定集团统一规章
  • 子公司(Member Accounts)= 各自独立运营,但必须遵守总部规定
  • 事业部(OU - Organizational Units)= 按业务线分组,如"生产事业部"、"研发事业部"

10.2 AWS Organizations

AWS Organizations Architecture

图解(AWS Organizations)
  • 顶部带皇冠的图标 = Management Account(总部),它是整个组织的"老大",负责支付所有账单、管理组织结构。
  • 下方的图标 = Member Accounts(子公司),它们是独立的 AWS 账户,加入组织后受总部管理。
  • 左下方 On-premises 图标 = 本地办公室/数据中心也能通过 VPN/Direct Connect 接入组织网络。
  • 看图顺序:总部 → 事业部分组 → 各子公司账户 → 本地互联。

核心功能:

  • Consolidated Billing — 合并账单,获得批量折扣(用得越多越便宜)
  • OU (Organizational Units) — 组织单元,按部门/环境分组
  • Management Account — 主管理账户,支付所有账单
  • Member Accounts — 成员账户,可通过 Role 访问

10.3 Service Control Policies (SCP)

Service Control Policies

图解(SCP 树状结构)
  • 这张图展示了 SCP 的 继承关系。顶部是 Management Account,下面是两个 OU:OU:ProductionOU:Development,每个 OU 下面有各自的 Member Accounts。
  • SCP(清单图标)附加在 OU 上,就像集团总部的规章制度贴在各事业部的门口。
  • 关键概念:SCP 是 向下继承 的。附加在 OU 上的 SCP,会自动应用到该 OU 下的所有账户。
  • ⚠️ Management Account 不受 SCP 限制!总部自己不受自己制定的规则约束。

SCP 核心规则:

  • 只在 Organizations 中可用
  • 不授予权限,只 限制 权限(SCP 是"天花板",不是"地板")
  • 影响账户中所有用户和角色(包括 root)
  • 不影响 service-linked roles

10.4 SCP 的"韦恩图"理解

SCP Allow vs Deny Flow

图解(SCP 韦恩图)
  • 这张图是理解 SCP 最关键的图。两个圆圈形成交集:
    • 左圆 = Identity Policy(IAM 策略允许的权限)
    • 右圆 = SCP(组织策略允许的权限范围)
    • 交集(重叠部分) = 实际有效权限
  • 左圆溢出部分 = Identity Policy 允许,但 SCP 不允许 → 无效! 就像员工有进入实验室的工牌,但集团规定该楼层关闭 → 进不了
  • 右圆溢出部分 = SCP 允许,但 Identity Policy 没给 → 也无效! 就像集团允许进实验室,但员工的工牌上没有这个权限 → 也进不了
  • 考试口诀:有效权限 = Identity Policy ∩ SCP,两边都得允许才行。

10.5 SCP 示例

禁止关闭 CloudTrail(防止子账户毁灭证据):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "cloudtrail:StopLogging",
        "cloudtrail:DeleteTrail"
      ],
      "Resource": "*"
    }
  ]
}

为什么需要这条 SCP? 如果子账户的管理员做了坏事,第一反应可能是关闭 CloudTrail 来"毁灭证据"。有了这条 SCP,即使子账户的 Root 用户也无法关闭日志记录。

10.6 SCP 继承

Root
├── SCP: FullAWSAccess
│
├── OU: Production
│   ├── SCP: DenyS3Delete
│   └── Account: Prod-App
│       └── 有效权限 = FullAWSAccess ∩ DenyS3Delete
│
└── OU: Development
    └── Account: Dev-App
        └── 有效权限 = FullAWSAccess

解读: Production OU 下的账户不能删除 S3 对象(多了一道限制),而 Development OU 下的账户没有额外限制。这很合理——生产环境要更严格。


11. Control Tower

11.1 通俗理解

如果说 Organizations 是"集团架构图",那 Control Tower 就是"集团管理手册 + 自动化流程"。它帮你:

  • 自动创建符合规范的新账户(不用手动配置几十项设置)
  • 自动应用安全基线(不用担心新账户"裸奔")
  • 持续监控合规状态(不用人工检查)

11.2 核心组件

AWS Control Tower

图解(Control Tower)
  • 顶部是 Management Account(集团总部),通过 Control Tower 管理一切。
  • 中间是 Account Factory(账户工厂):像生产线一样,按模板批量创建新账户。每个新账户自动配好安全基线、日志、网络。
  • 左下 Audit Account(审计账户):集团审计部门的专用账户,所有安全事件汇总到这里。
  • 右下 Log Archive Account(日志归档账户):所有账户的 CloudTrail/Config 日志统一归档到这里,防篡改。
  • 两侧的 Guardrails(护栏):附加在组织上的治理规则,分为 Preventive(预防型,基于 SCP,直接禁止危险操作)和 Detective(侦测型,基于 Config Rules,发现违规后报警)。
  • 考试怎么考:"如何快速建立一个安全合规的多账户环境?" → Control Tower

核心功能:

  • Landing Zone — 自动创建安全的多账户架构
  • Guardrails — 预定义的治理规则(Preventive + Detective)
  • Account Factory — 自动化创建符合规范的新账户
  • Dashboard — 集中查看合规状态

🧠 和 Organizations 的关系: Control Tower 是 建立在 Organizations 之上 的。Organizations 提供多账户的"骨架",Control Tower 提供自动化的"管理流程"。你可以只用 Organizations 不用 Control Tower,但用 Control Tower 一定会用到 Organizations。


12. 最佳实践

账户安全

  1. Lock away root user access keys — 不为 root 创建 access keys
    • 为什么:Root 的 access key 一旦泄露,等于给了攻击者"上帝模式"
  2. Enable MFA for root — 必须为 root 启用 MFA
    • 为什么:即使密码被盗,没有 MFA 设备也登不进来
  3. Create individual IAM users — 每人独立用户,不共享凭证
    • 为什么:共享账号无法审计"谁做了什么"
  4. Use groups — 通过组管理权限,不直接给用户附加策略
    • 为什么:100 个开发者逐个改权限 vs 改一次 Group 权限,效率差 100 倍

权限管理

  1. Grant least privilege — 最小权限原则,只给需要的权限
    • 为什么:权限越多,被滥用的风险越大
  2. Use roles for EC2 — EC2 应用使用 IAM Role,不用 access keys
    • 为什么:Role 临时凭证自动轮换,access key 永久有效一旦泄露就危险
  3. Use roles for cross-account — 跨账户使用 AssumeRole
    • 为什么:临时凭证比永久凭证安全
  4. Use Permission Boundaries — 限制开发者创建的角色权限
    • 为什么:防止权限提升攻击

凭证管理

  1. Rotate credentials — 定期轮换密码和 access keys
    • 为什么:长期不变的凭证更容易被破解
  2. Remove unused credentials — 删除不使用的凭证
    • 为什么:不用的凭证 = 不设防的后门
  3. Use temporary credentials — 优先使用 STS 临时凭证
    • 为什么:自动过期,即使泄露损害也有限

监控审计

  1. Enable CloudTrail — 记录所有 API 调用
    • 为什么:没有日志 = 出事了无法追查
  2. Use Access Analyzer — 发现意外的外部访问
    • 为什么:你可能不知道哪个 S3 bucket 被设成了公开
  3. Review Credentials Report — 定期审查凭证报告
    • 为什么:发现"僵尸账号"和过期凭证
  4. Use IAM Access Advisor — 移除未使用的权限
    • 为什么:90 天没用过的权限,大概率不需要

13. 考试重点

高频考点

💡 IAM 基础

  • IAM is global, not regional
  • Root account should be secured with MFA
  • Users have no permissions by default
  • Access Keys 用于 CLI/SDK,不能用于 Console
  • Policies 用 JSON 编写

💡 Roles vs Users

  • 优先使用 Roles 而不是在 EC2 中嵌入 access keys
  • EC2 通过 Instance Profile 获取 Role
  • Role credentials 自动轮换

💡 跨账户访问

  • 小规模:使用 Resource-based policy
  • 大规模:使用 AssumeRole
  • 可要求 MFA 才能 AssumeRole

💡 STS 临时凭证

  • 默认有效期 1 小时
  • 最长可达 12 小时
  • 包含 AccessKeyId, SecretAccessKey, SessionToken

💡 权限评估

  • Explicit Deny 永远优先
  • 没有明确允许 = Implicit Deny
  • SCP 限制整个账户(Organizations)

典型场景题

场景 1: 开发者需要访问 S3,但你想限制他们只能访问自己的文件夹 解题思路: 一个 Policy 管 100 个用户?不可能写 100 个。用 Policy Variables ${aws:username} 动态匹配。 答案: 使用 Policy Variables ${aws:username}

场景 2: 企业用户想用 Active Directory 登录 AWS Console 解题思路: 关键词"Active Directory" + "AWS Console" = 企业 SSO 场景。AD 支持 SAML 2.0。 答案: SAML 2.0 Federation + AssumeRoleWithSAML

场景 3: 移动应用用户需要上传文件到 S3 解题思路: 移动用户 = 外部用户,不应该创建 IAM User。需要联合身份。AWS 推荐用 Cognito。 答案: Cognito Identity Pool + Web Identity Federation

场景 4: 防止 IAM 管理员给自己授予过多权限 解题思路: 关键词"防止权限提升" = Permission Boundaries。给管理员画一个权限天花板。 答案: Permission Boundaries

场景 5: 子账户不能关闭 CloudTrail 解题思路: "子账户" = Organizations 环境。"不能做某事" = 需要 Deny。跨账户统一限制 = SCP。 答案: Organization SCP + Deny cloudtrail:StopLogging


14. 官方资源

📝 章节练习 (30 题)
开始练习