Skip to content

云账号与权限管理模型:IAM / RAM 角色与权限关系

学习指南:提示词工程解决的是"怎么把话说清楚",云账号权限管理解决的是"谁能做什么事"。本章节会围绕一个问题展开:在云端世界里,如何既能方便地授权,又不把钥匙交给不该给的人?

在开始之前,建议你先补两块"基础砖":

  • Token 是什么:可以先阅读 大语言模型入门 的「分词 & Token」部分。
  • Prompt 是什么:如果你还不熟悉 System / User / Assistant 的基本结构,可以先看 提示词工程

0. 引言:为什么刚上云就"踩雷"了?

AWS IAM vs 阿里云 RAM 对比

点击各个模块查看详细对比

IAM
Identity and Access Management
👤
用户管理使用 IAM User,支持编程访问和控制台访问,可分配独立...
👥
用户组管理IAM Group 用于批量管理用户权限,一个用户可属于多个...
🎭
角色与扮演IAM Role 支持跨账号访问和服务角色,使用 STS A...
📋
权限策略IAM Policy 使用 JSON 格式,支持 Actio...
🔗
身份联合支持 SAML 2.0 和 OIDC,可与 AD、Okta ...
🔑
访问密钥IAM User 可创建 AK/SK,支持定期轮换和访问分析...
RAM
Resource Access Management
👤
用户管理使用 RAM 用户,功能与 IAM User 类似,支持子账...
👥
用户组管理RAM 用户组功能类似,支持按部门或项目分组管理...
🎭
角色与扮演RAM 角色支持跨云账号访问和临时授权,使用 STS Ass...
📋
权限策略RAM Policy 语法类似,支持阿里云服务特定的 Act...
🔗
身份联合支持 SAML 2.0 和企业 AD/LDAP,支持钉钉等国...
🔑
访问密钥RAM 用户支持 AccessKey,提供密钥使用分析和安全...
💡 提示:IAM 和 RAM 的核心概念基本一致,只是术语和实现细节略有不同。掌握一个平台后,可以快速迁移到另一个平台。

很多人刚开始使用云服务时都会遇到类似的情况:

  • 为了省事,直接把 AccessKey 写在代码里提交到 GitHub;
  • 给所有员工都开了"管理员权限",结果有人误删了生产数据库;
  • 项目交接后,不知道谁手里还有旧员工的账号密码;
  • 听说要开 MFA,但觉得"麻烦"就一直拖着没开。

直觉上,我们会以为是:"这些员工安全意识不够"

但大多数时候,问题并不在于人,而在于没有建立正确的权限管理体系

问题
  • 上下文难以保持一致:对话一长,前后语义容易脱节。
  • 关键事实容易丢失:早期给出的信息在后续轮次中难以被准确引用。
  • 调用成本持续上升:每一轮都要重新处理大量历史内容。
可能的成因
  • 视野仅限当前调用:模型只能依赖这一轮提供的上下文。
  • 信息缺乏结构化组织:重要信息与次要细节混在一起,难以形成稳定记忆。
  • 历史内容反复计算:大量固定前缀在多轮对话中被一遍遍重新处理。
带来的影响
  • 回答质量不稳定:对话越长,模型越难保持一致性和可追溯性。
  • 成本难以预估:每轮上下文大小高度波动,调用费用不可控。
  • 难以工程化落地:缺乏明确的上下文管理策略,系统在生产环境中难以维护与扩展。

面对这些挑战,单纯依靠"小心点操作"已经行不通了。我们需要一套系统的权限管理方法论,这正是IAM(Identity and Access Management,身份与访问管理)试图解决的问题。


1. 什么是 IAM/RAM?从"门禁系统"说起

1.1 类比:公司的智能门禁

想象一下,你们公司搬到了一栋新写字楼:

场景没有 IAM 的做法有 IAM 的做法
新员工入职给他一把能开所有门的万能钥匙给他一张门禁卡,只能刷他办公区域的门
员工离职钥匙丢了就丢了,也不知道谁拿着立即在系统里注销他的门禁卡,所有门都打不开了
外包人员把钥匙借给他几天发临时门禁卡,设置3天后自动失效
访客前台配一把钥匙给他发一次性访客码,只能进会议室

IAM(Identity and Access Management,身份与访问管理),就像是这套"智能门禁系统":

  • 身份(Identity):谁?员工、外包、访客、应用程序
  • 访问(Access):能进哪些门?能做什么操作?
  • 管理(Management):怎么发钥匙、怎么收钥匙、怎么查记录

1.2 AWS IAM vs 阿里云 RAM

AWS IAM vs 阿里云 RAM 对比

点击各个模块查看详细对比

IAM
Identity and Access Management
👤
用户管理使用 IAM User,支持编程访问和控制台访问,可分配独立...
👥
用户组管理IAM Group 用于批量管理用户权限,一个用户可属于多个...
🎭
角色与扮演IAM Role 支持跨账号访问和服务角色,使用 STS A...
📋
权限策略IAM Policy 使用 JSON 格式,支持 Actio...
🔗
身份联合支持 SAML 2.0 和 OIDC,可与 AD、Okta ...
🔑
访问密钥IAM User 可创建 AK/SK,支持定期轮换和访问分析...
RAM
Resource Access Management
👤
用户管理使用 RAM 用户,功能与 IAM User 类似,支持子账...
👥
用户组管理RAM 用户组功能类似,支持按部门或项目分组管理...
🎭
角色与扮演RAM 角色支持跨云账号访问和临时授权,使用 STS Ass...
📋
权限策略RAM Policy 语法类似,支持阿里云服务特定的 Act...
🔗
身份联合支持 SAML 2.0 和企业 AD/LDAP,支持钉钉等国...
🔑
访问密钥RAM 用户支持 AccessKey,提供密钥使用分析和安全...
💡 提示:IAM 和 RAM 的核心概念基本一致,只是术语和实现细节略有不同。掌握一个平台后,可以快速迁移到另一个平台。

不同的云厂商都有自己的 IAM 实现:

云厂商服务名称核心概念
AWSIAM (Identity and Access Management)User、Group、Role、Policy
阿里云RAM (Resource Access Management)用户、用户组、角色、策略
腾讯云CAM (Cloud Access Management)用户、用户组、角色、策略
华为云IAM用户、用户组、委托、策略
AzureAzure AD + RBACUser、Group、Role、RBAC

虽然名字不同,但核心概念都是相通的

  • 用户(User):代表一个具体的人或应用程序
  • 用户组(Group):批量管理一批用户的权限
  • 角色(Role):定义一组权限,可以被"扮演"
  • 策略(Policy):具体的权限规则(允许/拒绝做什么)

2. 用户、组、角色:到底该用哪个?

2.1 三种"身份"的区别

身份提供商(IdP)集成流程

点击步骤查看 SSO 单点登录流程

1
用户访问应用用户尝试访问企业应用
2
重定向到 IdP应用将用户重定向到身份提供商
3
用户登录认证用户在 IdP 输入企业账号密码
4
颁发 SAML 令牌IdP 验证成功后颁发 SAML Assertion
5
返回应用携带令牌返回企业应用
6
换取云凭证应用使用令牌换取云临时凭证
7
访问云资源使用临时凭证访问云资源
用户访问企业应用

用户打开浏览器,访问企业内部的业务系统(如 CRM、ERP 等)。此时用户尚未登录,应用检测到用户没有有效的会话。

用户访问 →企业应用
💡 SSO 优势:通过企业 IdP 统一管理用户身份,避免在每个云平台单独创建账号,提高安全性和管理效率。

用一个办公室的场景来类比:

概念类比适用场景特点
用户(User)正式员工,有自己的工位和门禁卡长期、稳定的团队成员有永久凭证(密码、AK/SK)
用户组(Group)部门,如"技术部"、"销售部"批量管理权限不能登录,只是权限容器
角色(Role)临时访客证、外包临时卡临时授权、跨账号访问没有永久凭证,靠"扮演"获取临时凭证

2.2 真实案例:一个创业公司的权限演进

阶段一:创始团队(2-3人)

问题:直接用根账号(Root Account)登录控制台,因为"省事"
风险:根账号拥有所有权限,一旦泄露整个账号就废了

阶段二:团队扩张(5-10人)

改进:给每个人创建 IAM User,分配不同权限
问题:
- 运维小王离职了,他的 AK/SK 散落在哪些服务器上?
- 新来的前端需要 S3 只读权限,后端需要 RDS 权限,手动一个个配太麻烦

阶段三:规范化(10-30人)

改进:
1. 按角色创建 IAM Group:
   - Developers(开发):S3、EC2、RDS 读写
   - DevOps(运维):全权限,但需要 MFA
   - ReadOnly(只读):查看所有资源,不能修改
   - QAs(测试):测试环境资源访问

2. 使用 IAM Role:
   - EC2 实例使用 Instance Profile,不再在服务器上放 AK/SK
   - 跨账号访问用 Role Assume,不用共享 AK/SK
   - CI/CD 用 OIDC Federation,不用存储长期凭证

阶段四:多账号/企业级(30人+)

架构:
- Master Account(主账号):只用来管理账单和组织结构,不放任何资源
- Audit Account(审计账号):收集所有账号的日志
- Dev Account(开发账号):开发环境
- Staging Account(预发布账号):测试环境
- Prod Account(生产账号):线上环境,权限最严格

权限流转:
- 开发人员默认只有 Dev 账号的只读权限
- 需要修改生产环境时,提工单申请 Assume 到 Prod 的临时 Role
- 所有 Assume 操作都被 CloudTrail 记录,定期审计

3. 角色与策略:权限管理的"灵魂"

3.1 角色的本质:信任 + 权限

角色与策略关系可视化

拖动查看角色如何关联多个策略

🎭
CrossAccountS3AccessRole跨账号访问角色
📦S3ReadWritePolicy
Allows3:GetObjectarn:aws:s3:::bucket/*
Allows3:PutObjectarn:aws:s3:::bucket/*
Allows3:ListBucketarn:aws:s3:::bucket
📊CloudWatchLogsPolicy
🚫DenySensitiveData
💡 策略叠加:一个角色可以附加多个策略,最终的权限是所有策略的叠加结果。Deny 策略优先级高于 Allow。

IAM Role 有两个核心组成部分:

  1. 信任策略(Trust Policy):谁可以扮演这个角色?
  2. 权限策略(Permission Policy):扮演成功后能做什么?

用一个话剧表演的类比:

概念类比说明
Role(角色)剧本里的"哈姆雷特"定义了要演什么戏(权限)
Trust Policy导演说"谁能演哈姆雷特"可能是"本剧团的演员"(本账号用户)、"隔壁剧团借来的演员"(跨账号)、"特邀嘉宾"(外部 IdP)
Permission Policy剧本内容哈姆雷特能做什么:说台词、决斗、发疯(具体权限)
Assume Role演员上台表演小李被导演选中演哈姆雷特,上台后他就拥有了剧本里定义的所有权限
临时凭证演出证小李拿到一个"临时演出证",演出结束后就失效了

3.2 策略(Policy):权限的"语法"

权限层级结构

点击层级查看详细权限范围

👑
根账号 (Root)全账号最高权限
{ "name": "完全管理权限", "type": "full" }{ "name": "账单管理", "type": "billing" }{ "name": "组织架构管理", "type": "org" } +2
👤
IAM 管理员IAM 全权限
{ "name": "创建/删除用户", "type": "user" }{ "name": "创建/删除角色", "type": "role" }{ "name": "管理策略", "type": "policy" } +1
👥
普通 IAM 用户受限权限
{ "name": "只读访问 EC2", "type": "read" }{ "name": "读写指定 S3 桶", "type": "limited" }{ "name": "查看 CloudWatch 日志", "type": "read" } +1
🎭
临时角色 (Role)按策略定义
{ "name": "临时凭证 (1-12小时)", "type": "temp" }{ "name": "按信任策略授权", "type": "conditional" }{ "name": "可跨账号使用", "type": "cross" } +1
🔑
服务账号 / 应用API 访问权限
{ "name": "AK/SK 或临时凭证", "type": "api" }{ "name": "特定服务 API 权限", "type": "service" }{ "name": "无控制台访问", "type": "programmatic" } +1
根账号 (Root) 详情
权限范围:全账号最高权限
典型场景:账号所有者,拥有云服务的所有权限
拥有权限:
完全管理权限账单管理组织架构管理关闭账号恢复已删除资源
💡 最小权限原则:始终授予用户完成工作所需的最小权限。从低权限开始,根据实际需求逐步提升,而不是一开始就授予高权限。

IAM Policy 是一个 JSON 文档,定义了"谁能对什么资源做什么操作"。

一个完整的 Policy 示例

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowS3ReadWrite",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:PutObject",
        "s3:DeleteObject"
      ],
      "Resource": "arn:aws:s3:::my-app-bucket/*",
      "Condition": {
        "StringEquals": {
          "aws:RequestedRegion": "ap-northeast-1"
        },
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    },
    {
      "Sid": "DenySensitiveData",
      "Effect": "Deny",
      "Action": "s3:*",
      "Resource": "arn:aws:s3:::my-app-bucket/sensitive/*"
    }
  ]
}

关键字段解释

字段含义示例
VersionPolicy 语法版本"2012-10-17"
Statement权限声明数组,可包含多个规则[...]
Sid声明 ID,可选,用于标识这条规则"AllowS3ReadWrite"
Effect效果:Allow(允许)或 Deny(拒绝)"Allow"
Action允许/拒绝的操作,支持通配符"s3:GetObject", "s3:*"
Resource作用的资源,用 ARN 标识"arn:aws:s3:::bucket/*"
Condition可选,满足特定条件时才生效区域限制、MFA 要求等

3.3 权限的优先级:Deny > Allow > 默认拒绝

IAM 的权限评估逻辑可以用一句话总结:显式 Deny 永远赢,没有 Allow 就是拒绝

评估流程如下:

1. 先看有没有 Deny 策略
   ├─ 有 Deny → 拒绝(不管有没有 Allow)
   └─ 没有 Deny → 继续看

2. 再看有没有 Allow 策略
   ├─ 有 Allow → 允许
   └─ 没有 Allow → 拒绝(默认拒绝原则)

实战案例:保护敏感数据

json
// 策略1:给开发者的普通权限
{
  "Effect": "Allow",
  "Action": ["s3:*"],
  "Resource": "arn:aws:s3:::company-data/*"
}

// 策略2:保护敏感目录(即使开发者有 s3:* 也不能访问)
{
  "Effect": "Deny",
  "Action": ["s3:*"],
  "Resource": "arn:aws:s3:::company-data/sensitive/*"
}

关键点

  • 开发者虽然有 s3:* 的 Allow 权限
  • 但敏感目录有显式的 Deny 规则
  • Deny 优先级更高,所以开发者无法访问敏感数据
  • 即使开发者是管理员,这个 Deny 也有效(除非是根账号)

4. 访问密钥(AK/SK):一把需要谨慎保管的"钥匙"

4.1 AK/SK 是什么?

访问密钥(AK/SK)生命周期管理

模拟 AK/SK 的创建、使用和轮换流程

活跃已创建 45 天
Access Key ID:
AKIAIOSF...
Secret Access Key:
************************************
123456API 调用
2 小时前最后使用
💡 安全提示:访问密钥泄露是云安全事件的主要原因之一。建议优先使用 IAM 角色替代访问密钥,如果必须使用,请务必定期轮换。

Access Key(访问密钥)是云服务提供的一种长期凭证,用于程序化的 API 调用。它由两部分组成:

组成部分名称作用类比
Access Key ID访问密钥 ID标识你是谁(类似于用户名)银行卡号
Secret Access Key秘密访问密钥证明你是你(类似于密码)银行卡密码

4.2 为什么 AK/SK 是"高危物品"?

真实案例:某创业公司的教训

小李是一家创业公司的新晋后端工程师。入职第一周,他的任务是调试一个文件上传功能。

python
# 小李写的代码(有严重安全问题!)
import boto3

# 为了方便调试,直接把 AK/SK 写在代码里
s3 = boto3.client(
    's3',
    aws_access_key_id='AKIAIOSFODNN7EXAMPLE',
    aws_secret_access_key='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
    region_name='ap-northeast-1'
)

def upload_file(file_path, bucket_name, object_name):
    s3.upload_file(file_path, bucket_name, object_name)
    print(f"文件已上传到 s3://{bucket_name}/{object_name}")

# 测试上传
upload_file('./test.jpg', 'my-company-bucket', 'uploads/test.jpg')

一周后发生的事情

  1. 小李提交代码到 GitHub(包括 AK/SK)
  2. GitHub 上的代码被爬虫扫描到,AK/SK 被提取
  3. 攻击者使用这些凭证,在公司账号里创建了大量 EC2 实例挖矿
  4. 月底收到账单:额外消费 12,000 美元
  5. 审计发现 AK/SK 泄露,小李被约谈...

这个案例告诉我们什么?

错误做法正确做法
把 AK/SK 硬编码在代码中使用 IAM Role,让程序自动获取临时凭证
把 AK/SK 提交到 Git 仓库使用 .gitignore 忽略配置文件,使用密钥管理服务
长期使用同一个 AK/SK 不轮换定期轮换 AK/SK,使用临时凭证替代长期凭证
给 AK/SK 分配过大权限遵循最小权限原则,只授予必要的权限

4.3 AK/SK 的安全使用指南

场景一:本地开发

bash
# 正确做法:使用 AWS CLI 配置凭证,不写在代码里
aws configure
# 然后根据提示输入 Access Key ID 和 Secret Access Key
# 这些信息会被保存在 ~/.aws/credentials,权限设置为 600

# 代码中不需要任何凭证配置
import boto3
s3 = boto3.client('s3')  # 自动从 ~/.aws/credentials 读取

场景二:服务器/EC2

python
# 正确做法:使用 IAM Instance Profile
# 1. 创建一个 IAM Role,附加需要的权限(如 S3ReadOnly)
# 2. 创建一个 Instance Profile,关联这个 Role
# 3. 启动 EC2 时,选择这个 Instance Profile

# 代码中完全不需要凭证
import boto3
s3 = boto3.client('s3')  # 自动从 EC2 元数据服务获取临时凭证

# 临时凭证会自动轮换,无需担心过期

场景三:CI/CD 流水线

yaml
# 正确做法:使用 OIDC Federation(OpenID Connect)
# 以 GitHub Actions 为例:

# 1. 在 AWS 创建 OIDC Identity Provider,信任 GitHub
# 2. 创建一个 IAM Role,信任策略允许 GitHub 的特定仓库扮演
# 3. 在 GitHub Actions 中配置

name: Deploy
on: [push]

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      id-token: write  # 关键:允许请求 OIDC token
      contents: read
    steps:
      - uses: actions/checkout@v3

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          role-to-assume: arn:aws:iam::123456789012:role/GitHubActionsRole
          aws-region: ap-northeast-1
          # 注意:这里没有 Access Key!完全使用临时凭证

      - name: Deploy
        run: aws s3 sync ./build s3://my-bucket/

总结:AK/SK 使用的安全层级

安全等级做法适用场景风险等级
最高使用 IAM Role(无长期凭证)EC2、Lambda、ECS、CI/CD极低
使用 OIDC FederationGitHub Actions、GitLab CI
使用密钥管理服务本地开发、小团队
使用环境变量快速原型、个人项目
极低硬编码在代码中任何场景都不推荐极高

5. 多因素认证(MFA):给你的账号加把"锁"

5.1 什么是 MFA?

MFA 多因素认证模拟

体验 MFA 双因素认证流程

🔐
密码验证
📱
MFA 验证
登录成功
请输入密码
💡 MFA 安全价值:启用 MFA 可降低 99.9% 的账号被盗风险。即使密码泄露,攻击者没有你的 MFA 设备也无法登录。

MFA(Multi-Factor Authentication,多因素认证),也叫 2FA(Two-Factor Authentication,双因素认证),是一种安全机制,要求用户在登录时提供两种或以上不同类型的认证因素:

因素类型是什么例子
知识因素(你知道什么)只有用户知道的信息密码、PIN 码
持有因素(你有什么)用户拥有的物理设备手机、硬件密钥
生物因素(你是什么)用户的生物特征指纹、面部识别

5.2 为什么 MFA 这么重要?

真实数据告诉你答案

攻击方式没有 MFA 时的成功率有 MFA 时的成功率
密码猜测/暴力破解很高极低(还需要第二因素)
钓鱼攻击获取密码很高极低(钓鱼页面无法获取 MFA 码)
密码泄露(其他网站泄露)很高极低(不知道第二因素)

微软安全报告(2020):启用 MFA 可以阻止 99.9% 的自动化攻击。

5.3 MFA 实战:为 AWS 根账号开启 MFA

步骤一:登录 AWS 控制台

  1. 使用根账号邮箱和密码登录
  2. 在右上角点击你的账号名,选择 "Security Credentials"

步骤二:启用 MFA

  1. 找到 "Multi-factor authentication (MFA)" 区域
  2. 点击 "Assign MFA device"
  3. 选择 MFA 设备类型(推荐"Authenticator app")

步骤三:配置虚拟 MFA

  1. 在手机上安装 Google Authenticator 或 Microsoft Authenticator
  2. 扫描二维码或手动输入密钥
  3. 输入 App 上显示的 6 位验证码(连续输入两个,因为验证码每 30 秒刷新)

完成! 你的根账号现在有了 MFA 保护。


6. 跨账号访问:如何安全地"串门"?

6.1 为什么需要跨账号访问?

随着业务增长,很多公司会使用多账号架构来隔离不同环境:

账号类型用途权限要求
Master Account组织管理、账单结算几乎不使用
Security Audit集中收集所有账号的日志只读访问其他账号
Shared Services共享资源(镜像仓库等)其他账号只读访问
Development开发环境开发者完全权限
Staging测试/预发布环境测试人员权限
Production生产环境严格限制,需要审批

问题:Shared Services 账号里的镜像,怎么让 Production 账号的 EC2 拉取?

  • 方案 A:把 AK/SK 写在 Production 的用户数据里 (危险!AK/SK 泄露风险)
  • 方案 B:使用跨账号 Role Assume (推荐!临时凭证,自动轮换)

6.2 跨账号 Role Assume 的原理

账号 A(Production)                    账号 B(Shared Services)
    |                                           |
    |  1. 请求 Assume Role                      |
    |  "我想扮演账号 B 的 ECRReadRole"          |
    |------------------------------------------>|
    |                                           |
    |                    2. 检查信任策略         |
    |                    "账号 A 可以扮演我吗?" |
    |                                           |
    |  3. 返回临时凭证                          |
    |  AccessKeyId, SecretKey, SessionToken    |
    |<------------------------------------------|
    |                                           |
    |  4. 使用临时凭证访问 ECR                  |
    |  docker pull 账号B.dkr.ecr...            |

关键点

  • 临时凭证有效期默认 1 小时,最长可配置 12 小时
  • 不需要在代码里存储任何长期凭证
  • 信任策略可以限制谁可以扮演这个角色(如指定账号、指定外部 ID)

6.3 实战:配置跨账号 ECR 访问

场景:Production 账号的 EC2 需要拉取 Shared Services 账号的 Docker 镜像。

步骤一:在 Shared Services 账号创建 IAM Role

  1. 登录 Shared Services 账号的 AWS 控制台
  2. 进入 IAM -> Roles -> Create role
  3. 选择"Another AWS account"
  4. 输入 Production 账号的 Account ID
  5. 可选:勾选"Require external ID"并输入一个随机字符串(增加安全性)
  6. 附加权限:AmazonEC2ContainerRegistryReadOnly
  7. 给 Role 命名:CrossAccountECRReadRole

步骤二:获取 Role ARN

创建完成后,复制 Role 的 ARN:

arn:aws:iam::SHARED_SERVICES_ACCOUNT_ID:role/CrossAccountECRReadRole

步骤三:在 Production 账号配置 EC2 实例

方式 A:使用 Instance Profile(推荐)

  1. 在 Production 账号创建 IAM Role(EC2 用)
  2. 信任策略:信任 EC2 服务
  3. 权限策略:允许 Assume 跨账号 Role
json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::SHARED_SERVICES_ACCOUNT_ID:role/CrossAccountECRReadRole"
    }
  ]
}
  1. 创建 Instance Profile,关联这个 Role
  2. 启动 EC2 时,选择这个 Instance Profile

方式 B:在 EC2 用户数据里动态 Assume Role

bash
#!/bin/bash
# 安装 AWS CLI
yum install -y aws-cli

# Assume 跨账号 Role
CREDS=$(aws sts assume-role \
  --role-arn arn:aws:iam::SHARED_SERVICES_ACCOUNT_ID:role/CrossAccountECRReadRole \
  --role-session-name EC2PullSession)

# 提取临时凭证
export AWS_ACCESS_KEY_ID=$(echo $CREDS | jq -r '.Credentials.AccessKeyId')
export AWS_SECRET_ACCESS_KEY=$(echo $CREDS | jq -r '.Credentials.SecretAccessKey')
export AWS_SESSION_TOKEN=$(echo $CREDS | jq -r '.Credentials.SessionToken')

# 登录 ECR
aws ecr get-login-password --region ap-northeast-1 | \
  docker login --username AWS --password-stdin SHARED_SERVICES_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com

# 拉取镜像
docker pull SHARED_SERVICES_ACCOUNT_ID.dkr.ecr.ap-northeast-1.amazonaws.com/my-app:latest

步骤四:测试跨账号访问

在 Production 的 EC2 上执行:

bash
# 测试能否 Assume Role
aws sts get-caller-identity
# 应该显示:arn:aws:sts::PRODUCTION_ACCOUNT_ID:assumed-role/CrossAccountECRReadRole/EC2PullSession

# 测试能否列出 Shared Services 的 ECR 仓库
aws ecr describe-repositories --registry-id SHARED_SERVICES_ACCOUNT_ID

完成! 现在 Production 的 EC2 可以安全地拉取 Shared Services 的镜像,而无需共享任何长期凭证。


7. 实战:构建安全的权限体系

7.1 从零开始搭建权限架构

云账号权限管理最佳实践清单

点击查看详细的实施指南和代码示例

👑
根账号保护
P0 - 最高优先级

根账号是云服务的所有者,拥有所有权限。必须实施最高级别的保护措施。

✓ 检查清单
  • 启用 MFA(推荐硬件 MFA 设备)
  • 创建 IAM 管理员用户用于日常操作
  • 删除或锁定根账号的访问密钥
  • 配置根账号使用告警
  • 设置账号恢复联系信息
代码示例
# AWS CLI - 创建管理员用户并禁用根账号 AK
aws iam create-user --user-name AdminUser
aws iam attach-user-policy --user-name AdminUser   --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

# 删除根账号访问密钥(必须使用根账号登录控制台操作)
推荐工具
硬件 MFA (YubiKey)虚拟 MFA (Google Authenticator)AWS IAM阿里云 RAM
👤
用户权限最小化
P0 - 最高优先级
+
🎭
优先使用 IAM 角色
P1 - 高优先级
+
🔑
访问密钥安全管理
P1 - 高优先级
+
📊
监控与审计
P2 - 中优先级
+
💡 实施建议:按照优先级从 P0 开始逐步实施最佳实践。每个改进都能显著提升账号安全性,不要试图一次性完成所有改进。

假设你是一个 10 人创业公司的技术负责人,需要从零设计 AWS 权限架构。以下是推荐的实施步骤:

阶段一:根账号保护(第 1 天)

目标:保护根账号,这是最重要的账号

1. 启用根账号 MFA(必须)
   - 推荐硬件 MFA(YubiKey),或者 Google Authenticator

2. 创建 IAM 管理员账号
   - 用户名:admin(或你的名字)
   - 权限:AdministratorAccess(但后续会收紧)
   - 启用 MFA

3. 删除根账号的 Access Key(如果创建了的话)
   - 根账号永远不应该有 AK/SK

4. 配置根账号使用告警
   - 使用 CloudWatch + SNS,一旦根账号登录就发邮件/短信

阶段二:团队权限分组(第 1 周)

目标:给团队成员分组,批量管理权限

1. 分析团队角色:
   - 后端开发(2人)
   - 前端开发(1人)
   - 移动端开发(1人)
   - 产品经理(1人)
   - 设计师(1人)
   - 创始人/管理员(3人)

2. 创建 IAM Groups:

   Group: Developers
   ├── 成员:所有开发(后端、前端、移动端)
   ├── 权限:
   │   ├── EC2: 启动、停止、查看(但不能删除别人的实例)
   │   ├── S3: 读写开发环境的 bucket
   │   ├── RDS: 只读权限(不能修改生产数据库)
   │   └── CloudWatch: 查看日志
   └── 限制:只能操作 ap-northeast-1 区域

   Group: ProductTeam
   ├── 成员:产品经理、设计师
   ├── 权限:
   │   ├── S3: 只读(查看数据文件)
   │   ├── CloudWatch Dashboard: 查看监控图表
   │   └── Cost Explorer: 查看账单(但不能修改)
   └── 限制:只读权限,不能修改任何资源

   Group: Administrators
   ├── 成员:创始人、技术负责人
   ├── 权限:AdministratorAccess
   └── 要求:必须使用 MFA 才能操作

3. 给每个人创建 IAM User,加入对应的 Group
   - 不要给个人直接附加权限,一律通过 Group 管理
   - 启用 MFA(强制要求)

阶段三:应用层权限优化(第 2-4 周)

目标:让应用程序安全地访问 AWS 资源

1. EC2 实例使用 Instance Profile
   - 不再在服务器上配置 AK/SK
   - 创建 IAM Role,附加需要的权限(如 S3 读写)
   - 创建 Instance Profile,关联这个 Role
   - 启动 EC2 时选择这个 Instance Profile
   - 应用代码中直接使用 boto3,无需配置凭证

2. 如果必须使用 AK/SK(第三方集成)
   - 使用 AWS Secrets Manager 存储 AK/SK
   - 应用启动时从 Secrets Manager 读取
   - 设置定期轮换(90天)
   - 监控 AK/SK 的使用情况

3. 配置 CloudTrail 记录所有 API 调用
   - 创建单独的 S3 bucket 存储日志
   - 设置日志文件校验(防止篡改)
   - 配置 SNS 通知关键事件(如根账号使用、策略变更)

阶段四:安全加固(持续)

目标:建立持续的安全监控和改进机制

1. 启用 AWS Config
   - 监控资源配置变更
   - 检查合规性(如安全组是否开放了 0.0.0.0/0)

2. 启用 IAM Access Analyzer
   - 持续分析资源策略
   - 识别外部访问(如 S3 bucket 是否公开)

3. 定期审查 IAM 配置
   - 每月检查一次未使用的 IAM User、Role
   - 检查 Access Key 的使用情况
   - 验证 Group 成员是否合理

4. 建立安全事件响应流程
   - 如果发现 AK/SK 泄露:立即删除、轮换、审计影响范围
   - 如果发现异常 API 调用:立即调查、限制权限

8. 常见误区与避坑指南

8.1 十大 IAM 反模式

#反模式为什么不好正确做法
1使用根账号进行日常操作根账号拥有所有权限,一旦泄露无法限制损害创建 IAM 管理员账号,根账号仅在必要时使用
2给所有人 AdministratorAccess违反最小权限原则,增加误操作和内部威胁风险按角色分组,只授予必要的权限
3在代码中硬编码 AK/SKAK/SK 容易通过 GitHub 泄露,且难以轮换使用 IAM Role、环境变量或密钥管理服务
4长期不轮换 AK/SK增加凭证泄露后的风险敞口时间设置 90 天轮换策略,或更好的——使用临时凭证
5忽略 MFA密码泄露后账号直接沦陷为所有 IAM 用户启用 MFA,尤其是高权限用户
6不使用 CloudTrail无法审计谁做了什么操作,出事后无法溯源启用 CloudTrail,并将日志存储到独立的审计账号
7IAM Policy 过于宽松Resource: "*"Action: "*",增加攻击面明确指定资源 ARN 和具体 Action
8不清理离职员工的 IAM User僵尸账号可能成为后门建立离职流程,立即禁用并删除 IAM User
9不使用 IAM Access Analyzer无法发现过度宽松的资源策略(如公开 S3 bucket)启用 IAM Access Analyzer,定期检查外部访问
10不在测试环境验证 Policy直接在生产环境应用 Policy,可能导致服务中断使用 IAM Policy Simulator 测试,先在测试环境验证

9. 名词对照表

英文术语中文对照解释
IAM (Identity and Access Management)身份与访问管理云服务中管理用户身份和访问权限的服务
RAM (Resource Access Management)资源访问管理阿里云的 IAM 服务名称
Root Account根账号注册云账号时创建的拥有者账号,拥有最高权限
IAM UserIAM 用户/子账号由根账号创建的子身份,用于日常操作
IAM RoleIAM 角色临时性权限载体,无长期凭证,需要被"扮演"
IAM PolicyIAM 策略JSON 格式的权限规则定义
ARN亚马逊资源名称全局唯一的资源标识符
AK/SK访问密钥/密钥程序访问云 API 的凭证
STS安全令牌服务提供临时安全凭证的服务
MFA多因素认证需要两个或以上因素的认证方式
SSO单点登录用户一次登录即可访问多个系统的认证方式
ExternalId外部 ID用于防止困惑代理攻击的安全标识符
CloudTrail云审计服务记录云账号中所有 API 调用和操作的日志服务

总结:云账号权限管理的核心原则

云账号权限管理不是一蹴而就的,而是需要根据团队规模和业务需求持续演进:

  1. 起步阶段(1-10 人):

    • 保护根账号(MFA + 不用根账号日常操作)
    • 创建 IAM 管理员账号
    • 基本的分组(Developers、Admins)
  2. 成长阶段(10-50 人):

    • 细化的权限分组(前后端、运维、产品等)
    • 使用 IAM Role 替代 AK/SK
    • 启用 CloudTrail 审计
    • 定期权限审查
  3. 成熟阶段(50 人以上 / 多账号):

    • 多账号架构(Dev、Staging、Prod 分离)
    • 集中式日志审计账号
    • 自动化权限审查和告警
    • 完善的权限申请和审批流程

核心原则记住三句话

  1. 最小权限原则:只给必要的权限,不要给 AdministratorAccess
  2. 不用长期凭证:优先使用 IAM Role 和临时凭证,避免 AK/SK 泄露
  3. 启用 MFA:特别是根账号和高权限账号,这是最有效的安全措施

延伸阅读