第1章 IAM概述:让身份与权限不再是一笔糊涂账
聊IAM之前,我先说说自己刚入行时的感受。那时候公司几十个AWS账号,密钥满邮箱飞,权限全靠运维大哥手工配。有人离职了,密钥还躺在代码里。想想都后怕。
说白了,IAM就是云端的一把锁。没有它,你的资源对全世界开放。有了它,谁干什么、能看什么、不能碰什么,全在策略里写死。
1.1 什么是IAM?
IAM全称是 Identity and Access Management(身份与访问管理)。它不是某一朵云的专利,但云厂商把它做成了最基础、也是最容易出错的服务。
我记得有一次帮客户做安全审计,发现他们居然用一个根用户跑生产业务。根用户是什么?那就是云上的皇帝,没有任何限制。我当时就跟他们讲:根用户只用来开账号,用完就锁。这个习惯必须养成。
IAM核心价值:
- 最小权限 —— 只给够用的权限,不给多余的。
- 职责分离 —— 开发、测试、运维各管各的。
- 可审计 —— 每笔操作都能追溯到谁、什么时间、干了什么。
- 临时凭证优先 —— 能用角色就别用长密钥,能用临时令牌就别存AccessKey。
1.2 IAM的核心组件
IAM的组件不多,但每个都很关键。就像拼图,少一块都不转。
1.2.1 用户(User)
用户代表一个人或一个应用。每个用户有唯一的ARN,可以关联密码(登录控制台用)或AccessKey(API调用用)。
我个人习惯:能建角色就不建用户。用户一旦多了,密钥管理就是噩梦。有一次我接手一个项目,光IAM用户就200多个,里面三分之一是「已离职」。嗯,清理了一整个周末。
1.2.2 组(Group)
组是一组用户的集合。你给组挂策略,组里的用户自动继承。这东西省事,我一直推荐。
举个例子:developers组,挂上「只读+部署」的策略,所有开发人员往里一塞,齐活。有人离职?从组里移除就行,不用改策略。
1.2.3 角色(Role)
角色没有长久的密钥,它是拿临时凭证的。角色可以给AWS服务用,比如EC2实例要读S3;也可以跨账号用,比如合作伙伴要访问你的一桶数据。
你想想看,如果你的应用跑在EC2上,你会在代码里写AccessKey吗?我反正不会。给实例绑一个角色,SDK自动获取临时凭证,安全又省心。
1.2.4 策略(Policy)
策略定义了「谁什么时候能干什么」。它是JSON格式的文档,包含Effect(Allow/Deny)、Action(操作列表)、Resource(资源ARN)、Condition(条件)。
小技巧:写策略时,我习惯先写Deny,再写Allow。为什么?因为Deny优先于Allow,提前把风险高的操作挡掉,再开放业务需要的权限。
| 组件 | 对应实体 | 凭证类型 | 典型用途 |
|---|---|---|---|
| 用户 | 人 / 应用 | 密码 / AccessKey | 控制台登录、API调用 |
| 组 | 用户集合 | 无单独凭证 | 批量权限管理 |
| 角色 | 临时身份 | STS临时凭证 | 服务间访问、跨账号 |
| 策略 | 权限规则 | JSON文档 | 定义Allow/Deny |
1.3 策略的两种类型
策略分两种:身份策略和资源策略。别看都是JSON,差别很大。
- 身份策略:挂到用户、组、角色上。控制「这个身份能做什么」。
- 资源策略:挂到资源上(比如S3桶、KMS密钥)。控制「谁能访问这个资源」。
我记得有一次做S3桶策略,漏写了一个条件,导致匿名用户也能读桶里的日志。当时客户数据差点出事。从那以后,我只要写资源策略,一定加 aws:SourceIp 或者 aws:PrincipalOrgID 条件。
1.4 必须要了解的几个概念
我曾经见过一个团队,把所有的权限策略写在一个超长的JSON里,谁改都怕炸。后来我建议他们拆分:按服务拆、按环境拆、按团队拆。每个策略只做一件事,命名也统一(比如 s3-readonly-dev)。以后查起来,眼睛不累,脑子也清楚。
1.4.1 隐式Deny vs 显式Deny
IAM里,默认所有权限都是Deny(隐式)。只有你显式Allow了,才能操作。但如果你写了显式Deny,那就连Allow也救不了。Deny优先。记住这一点,很多安全问题就能想通。
1.4.2 Condition条件键
条件键是策略的精细开关。比如:只允许来自公司IP的请求;只允许使用MFA登录的人执行敏感操作;只允许在特定时间范围内操作。没有条件,策略就是一纸空文。
1.5 本章知识体系全景图
下面这张图把IAM的核心要素串了起来,我建议你存下来,后面几章都会用到。
从上图能看出来,身份(用户/组/角色)关联策略,策略里可以带条件,最终IAM引擎给你一个Allow或Deny。整个链条里,策略是灵魂。后面的章节,我会带你手把手写策略、绑角色、管密钥。
1.6 本章要点速查
- 根用户:只用于开户,日常禁用。
- 最小权限:只给必要的,写策略时从Deny入手。
- 角色>用户:能拿临时凭证就别造长期密钥。
- 条件键:策略不加条件,等于把门敞开。
- 资源策略:小心公开写Allow,每个桶都该检查一遍。