227 lines
5.8 KiB
Markdown
227 lines
5.8 KiB
Markdown
# 第20天:IAM 策略深入——精确控制权限
|
||
|
||
## 今天你将学到什么
|
||
|
||
第 6 天我们学了 IAM 的基本概念。今天深入学习 IAM 策略的编写——它是一份 JSON 格式的"权限清单",精确定义"谁能对什么资源做什么操作"。
|
||
|
||
---
|
||
|
||
## 策略长什么样
|
||
|
||
一个 IAM 策略就是一段 JSON 文本。别被 JSON 吓到,它的结构其实很简单:
|
||
|
||
```json
|
||
{
|
||
"Version": "2012-10-17",
|
||
"Statement": [
|
||
{
|
||
"Effect": "Allow",
|
||
"Action": "s3:GetObject",
|
||
"Resource": "arn:aws:s3:::my-photos/*"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
翻译成人话:**允许从 my-photos 这个 S3 桶里下载文件。**
|
||
|
||
---
|
||
|
||
## 策略的四个核心要素
|
||
|
||
每条策略声明(Statement)回答四个问题:
|
||
|
||
### 1. Effect(效果):允许还是拒绝?
|
||
|
||
只有两个值:
|
||
- `"Allow"` — 允许
|
||
- `"Deny"` — 拒绝
|
||
|
||
### 2. Action(操作):能做什么?
|
||
|
||
格式是 `服务名:操作名`,比如:
|
||
- `s3:GetObject` — 从 S3 下载文件
|
||
- `s3:PutObject` — 往 S3 上传文件
|
||
- `ec2:StartInstances` — 启动 EC2 实例
|
||
- `ec2:TerminateInstances` — 终止(销毁)EC2 实例
|
||
- `rds:CreateDBInstance` — 创建 RDS 数据库
|
||
|
||
**通配符**:
|
||
- `s3:*` — S3 的所有操作
|
||
- `ec2:Describe*` — EC2 所有以 Describe 开头的操作(都是只读查询)
|
||
- `*` — 所有服务的所有操作(超级危险!)
|
||
|
||
### 3. Resource(资源):对什么东西?
|
||
|
||
用 ARN(Amazon Resource Name)指定具体资源:
|
||
|
||
```
|
||
arn:aws:服务:区域:账户ID:资源
|
||
```
|
||
|
||
举例:
|
||
- `arn:aws:s3:::my-photos/*` — my-photos 桶里的所有文件
|
||
- `arn:aws:ec2:ap-northeast-1:123456789012:instance/i-abc123` — 东京区域的某台特定 EC2
|
||
- `*` — 所有资源(谨慎使用!)
|
||
|
||
### 4. Condition(条件):在什么条件下?(可选)
|
||
|
||
添加额外的限制条件,比如:
|
||
- 只在工作时间允许
|
||
- 只从公司 IP 地址允许
|
||
- 必须使用 MFA 验证后才允许
|
||
|
||
---
|
||
|
||
## 用生活例子理解策略
|
||
|
||
**例子 1:实习生的权限**
|
||
|
||
"允许实习生查看所有 S3 桶的文件列表,但不能下载、上传或删除任何文件"
|
||
|
||
```json
|
||
{
|
||
"Version": "2012-10-17",
|
||
"Statement": [
|
||
{
|
||
"Effect": "Allow",
|
||
"Action": [
|
||
"s3:ListBucket",
|
||
"s3:ListAllMyBuckets"
|
||
],
|
||
"Resource": "*"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
就像给实习生一把只能看目录的权限——能看到有什么文件,但打不开。
|
||
|
||
**例子 2:开发者的权限**
|
||
|
||
"允许开发者对测试环境的 EC2 做任何操作,但不能碰生产环境"
|
||
|
||
```json
|
||
{
|
||
"Version": "2012-10-17",
|
||
"Statement": [
|
||
{
|
||
"Effect": "Allow",
|
||
"Action": "ec2:*",
|
||
"Resource": "*",
|
||
"Condition": {
|
||
"StringEquals": {
|
||
"ec2:ResourceTag/Environment": "test"
|
||
}
|
||
}
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
只有标签为 `Environment=test` 的 EC2 实例才能操作。生产环境的实例(`Environment=production`)碰不了。
|
||
|
||
**例子 3:安全红线**
|
||
|
||
"无论如何,任何人都不能删除生产数据库"
|
||
|
||
```json
|
||
{
|
||
"Version": "2012-10-17",
|
||
"Statement": [
|
||
{
|
||
"Effect": "Deny",
|
||
"Action": "rds:DeleteDBInstance",
|
||
"Resource": "arn:aws:rds:*:*:db:production-*"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
即使某人有 AdministratorAccess,这条 Deny 规则也会阻止他删除生产数据库。**因为 Deny 永远优先于 Allow。**
|
||
|
||
---
|
||
|
||
## 策略评估逻辑
|
||
|
||
当你在 AWS 上做一个操作时,系统怎么判断你有没有权限?
|
||
|
||
```
|
||
第一步:默认拒绝(什么权限都没有)
|
||
↓
|
||
第二步:查找所有适用的策略
|
||
↓
|
||
第三步:有没有显式的 Deny?
|
||
├── 有 → 最终结果:拒绝(到此结束,Deny 最大)
|
||
└── 没有 ↓
|
||
第四步:有没有显式的 Allow?
|
||
├── 有 → 最终结果:允许
|
||
└── 没有 → 最终结果:拒绝(默认拒绝)
|
||
```
|
||
|
||
**记住三句话**:
|
||
1. 默认所有操作都被拒绝
|
||
2. 需要显式的 Allow 才能做事
|
||
3. 任何地方有 Deny 就一定被拒绝(Deny 优先级最高)
|
||
|
||
---
|
||
|
||
## AWS 托管策略 vs 自定义策略
|
||
|
||
**AWS 托管策略**:AWS 预先写好的常用策略,开箱即用。
|
||
|
||
常用的有:
|
||
| 策略名 | 权限范围 |
|
||
|--------|----------|
|
||
| AdministratorAccess | 所有服务所有操作(万能钥匙) |
|
||
| PowerUserAccess | 除了 IAM 之外的所有权限 |
|
||
| ReadOnlyAccess | 所有服务的只读权限 |
|
||
| AmazonS3FullAccess | S3 的完全权限 |
|
||
| AmazonS3ReadOnlyAccess | S3 的只读权限 |
|
||
| AmazonEC2FullAccess | EC2 的完全权限 |
|
||
|
||
**自定义策略**:你自己写的策略,可以精确到具体的资源和操作。
|
||
|
||
**建议**:
|
||
- 学习阶段用 AWS 托管策略(方便)
|
||
- 生产环境写自定义策略(精确控制,最小权限)
|
||
|
||
---
|
||
|
||
## 常见错误和调试
|
||
|
||
**错误信息**:`Access Denied`(访问被拒绝)
|
||
|
||
**排查步骤**:
|
||
1. 确认你用的是哪个 IAM 用户/角色
|
||
2. 检查这个用户/角色附加了哪些策略
|
||
3. 策略里有没有覆盖你要做的操作和资源
|
||
4. 有没有 Deny 规则在阻止你
|
||
|
||
**调试工具**:
|
||
- IAM Policy Simulator:模拟测试策略效果,不用真的去执行操作
|
||
- CloudTrail:查看被拒绝的 API 调用详情
|
||
|
||
---
|
||
|
||
## 今天的小测验
|
||
|
||
1. 一个 IAM 策略的四个核心要素是什么?
|
||
2. 如果一个用户同时有一条 Allow 规则和一条 Deny 规则针对同一个操作,最终结果是什么?
|
||
3. `"Action": "s3:*"` 和 `"Action": "*"` 有什么区别?
|
||
4. 为什么生产环境不建议用 `AdministratorAccess`?
|
||
|
||
---
|
||
|
||
## 延伸阅读
|
||
|
||
- [IAM 策略参考文档](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)
|
||
- [IAM Policy Simulator](https://policysim.aws.amazon.com/)
|
||
- [AWS 策略生成器](https://awspolicygen.s3.amazonaws.com/policygen.html)
|
||
|
||
---
|
||
|
||
## 明天预告
|
||
|
||
明天学习 IAM 角色的高级用法:跨账户访问、服务角色、联合身份。理解企业环境中如何安全地管理多个账户和外部用户的访问。
|