2. IAM 基础概念:用户、组、角色、策略的定义与关系

聊到云安全,第一个绕不开的就是 IAM。说白了,IAM 就是云上的 "门禁系统" 加 "权限管理"。你想想看,公司里谁可以进哪间办公室,谁能用哪台打印机,总得有个规矩。云上也是一样,只不过管的是 API 调用、资源读写这些事。

我个人习惯把 IAM 拆成四个核心零件:用户、组、角色 和 策略。搞清楚了它们,后面设计权限模型时你就不会手忙脚乱。

2.1 用户(User)—— 你是谁

用户,就是某个操作者的身份标识。可以是真人,比如开发小哥张三;也可以是机器,比如 CI/CD 流水线里跑的 Service Account。你给它一个名字,它就代表一个 "主体"。

这里有个容易搞混的点:IAM 用户和登录账号是两码事。登录账号是 "谁付钱",IAM 用户是 "谁干活"。我曾经见过有人把老板的 root 账号直接给开发用——嗯,后来出了事,权限大到能删库。

我的建议:每个真实的人或机器服务都建独立的 IAM 用户。别共享账号。别偷懒。共享账号一多,审计日志就像一锅粥,根本查不出是谁动了手。

2.2 组(Group)—— 你属于哪个团队

组就是用户的集合。把张三、李四、王五放进 "开发组",给这个组分配权限,那组里所有人都自动拿到这些权限。省事,也规范。

没有组会怎样?你想想看:公司来了一批新实习生,你得一个一个给他们加权限;有人离职,你得一个一个查他加过哪些策略。累不累?

// 伪代码:组与用户的关系
Group: "dev-team"
  Members: [user-zhangsan, user-lisi, user-wangwu]
  AttachedPolicies: [policy-developer-access]

// 张三能做什么?
// -> 继承了 dev-team 的所有权限

我在项目中遇到过很坑的场景:某团队没有用组,直接把策略贴到每个用户上。后来来了个安全审计,要批量修改权限,改到凌晨三点。何必呢?

2.3 角色(Role)—— 你暂时能做什么

角色和用户有点像,但有一个关键区别:角色没有长期凭证。它是一套 "临时工牌"。谁需要用,谁就 "扮演" 它,拿到一组临时凭证,用完就失效。

这玩意儿在跨账号授权时特别好使。比如你想让生产账号的某个服务访问测试账号的数据库,就不用建用户、不用交换密钥,直接给生产服务分配一个角色就够了。

避坑指南:我曾经看过有人把角色当用户来用——长期 "扮演" 同一个角色不切换,还让它跑定时任务。角色是有会话时效的,最长一般 12 小时或 1 小时(各家云不一样)。一旦过期,任务就断了。所以,长时间运行的工作负载,能用用户就别用角色;跨账号短期访问,用角色就对了。

2.4 策略(Policy)—— 你能做什么,不能做什么

策略,就是权限规则本身。说白了,它是一段 JSON 或 YAML,里面写清楚了 "谁可以对什么资源做什么操作"。

典型的策略包含几个要素:

  • Effect:Allow 或 Deny。Allow 放行,Deny 拒绝。
  • Action:具体操作,比如 kms:Decrypt、s3:GetObject。
  • Resource:针对哪些资源生效,比如某个 KMS 密钥或 S3 桶。
  • Condition:可选条件,比如 "只允许在办公时间操作" 或 "必须来自公司内网 IP"。
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "kms:Decrypt",
      "Resource": "arn:aws:kms:cn-north-1:123456789012:key/abc-123",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": "10.0.0.0/16"
        }
      }
    }
  ]
}

你想想看,这种规则写清楚后,连机器都能直接执行。不用人工审批,不用口头传达,多清爽。

2.5 它们的关系 —— 一张图说清楚

这四个东西怎么搭在一起?我画了一张结构图,你看一眼就明白了。

IAM 核心组件关系图 用户 (User) 组 (Group) 角色 (Role) 策略 (Policy) 属于 扮演 附加 附加 直接附加 说明:用户可直接附加策略,也可通过组间接获得策略 角色只能通过扮演获取,并携带一组临时策略

2.6 核心区别与选择建议

搞清楚了概念,接下来就是 "什么时候用什么"。我直接给你一张对比表,照着选就行:

维度 用户 组 角色 策略
本质 身份 身份集合 临时身份 权限规则
有无凭证 有(长期) 无 有(临时) 无
典型用途 个人 / 服务账号 团队管理 跨账号 / 服务扮演 定义权限
生命周期 长期 长期 会话级 长期 / 可更新
风险级别 高(泄露即出事) 中 中(需要信任策略) 核心(写错全崩)

我的实战经验:

  • 人员管理:优先用组。别一个个用户绑策略。
  • 机器互访:优先用角色。别浪费时间去管密钥轮换。
  • 写策略时:默认 Deny,只开最小权限。你永远不知道哪天加了个 "s3:ListAllMyBuckets" 会不会被人用来枚举数据。

2.7 一个容易忽略的点:策略的评估逻辑

很多人以为 "策略加得越多权限越大",其实不是。策略的评估逻辑是:Deny 永远优先。哪怕你同时有一个 Allow 和一个 Deny 在同一条语句里,Deny 会赢。

我之前就踩过坑:给一个用户加了 "允许访问所有 S3 桶" 的宽策略,后来又加了一条 "禁止访问某个敏感桶" 的细策略。结果发现用户还是能访问那个敏感桶——因为我忘了 Deny 优先于 Allow,而且我把两条策略的顺序搞反了。嗯,后来花了一下午查日志才定位到问题。

所以写策略时,记住一句话:先阻塞,再放行。安全策略永远是 "禁止优先"。

2.8 小结一下

用户、组、角色、策略,这四个东西组合起来,就能搭出很灵活又很安全的权限模型。你想想看:用人时用组管,机器交互用角色,所有权限都靠策略定义。这样一来,不管是业务扩张还是安全审计,你都有章可循。

下一部分我们会聊怎么把这些人、组、角色串起来,搭出一个完整的权限模型框架。别急,先把这四个零件的概念锤实了,后面的事就水到渠成。