wei/个人文档/minioAKSK权限配置.md
2026-06-04 13:57:41 +08:00

258 lines
7.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

好的,我来为你系统整理一下 MinIO / AWS S3 中 **策略 JSON 的语法和常用参数**。这份指南结合了你之前遇到的桶权限场景,帮助理解每部分的作用。
---
## 一、策略 JSON 顶层结构
一个完整的策略由以下元素组成:
```json
{
"Version": "2012-10-17", // 版本号(必须,固定值)
"Statement": [ // 一个或多个权限声明
{
"Sid": "OptionalId", // 可选声明ID
"Effect": "Allow", // 允许或拒绝
"Principal": {...}, // 谁(仅某些类型的策略需要)
"Action": [...], // 哪些操作
"Resource": [...], // 哪些资源
"Condition": {...} // 条件限制(可选)
}
]
}
```
> **注意**:在 MinIO 中,用户/组策略Identity Policy通常不需要 `Principal`它用于存储桶策略Bucket Policy。我们这里主要讲解用户/组策略。
---
## 二、各字段详解
### 1. `Version`(必选)
- **固定值**`"2012-10-17"`
- 表示策略语言的版本,当前所有 S3 兼容系统都使用这个值。
### 2. `Statement`(必选)
- 类型:**数组**,内部包含一个或多个声明对象。
- 每个声明定义一组权限。
### 3. `Sid`(可选)
- **Statement ID**:任意字符串,用于标识该声明。
例如:`"Sid": "AllowListBucket"`
### 4. `Effect`(必选)
- 两个取值:`"Allow"` 或 `"Deny"`
- **Deny 优先级高于 Allow**。即如果一个请求匹配了某个 Deny 声明,即使有 Allow 也会被拒绝。
### 5. `Action`(必选)
- 指定允许或拒绝的**操作**。取值可以是:
- **单个操作**`"Action": "s3:GetObject"`
- **多个操作**`"Action": ["s3:GetObject", "s3:PutObject"]`
- **通配符所有操作**`"Action": "s3:*"`
(也可以是 `"*"` 表示所有服务所有操作,但不推荐)
- **常用 S3 Action** 见下文第四部分。
### 6. `Resource`(必选)
- 指定操作作用的**资源**(桶、对象、前缀等)。使用 **ARNAmazon Resource Name** 格式。
- **MinIO / S3 的 ARN 格式**
```
arn:aws:s3:::桶名称
arn:aws:s3:::桶名称/对象键
arn:aws:s3:::桶名称/前缀/*
```
- 示例:
- `"arn:aws:s3:::orderbook"` —— 桶本身
- `"arn:aws:s3:::orderbook/*"` —— 桶内所有对象
- `"arn:aws:s3:::orderbook/2024/*"` —— 桶内 `2024/` 前缀下的所有对象
- `"arn:aws:s3:::orderbook/report.pdf"` —— 单个对象
- 可以写数组包含多个资源。
### 7. `Condition`(可选)
- 用于在**特定条件**下才生效。格式为 `"条件运算符": { "条件键": "值" }`
- 常见条件运算符:
- `StringEquals`、`StringNotEquals`
- `StringLike`(支持 `*` 通配符)、`StringNotLike`
- `IpAddress`、`NotIpAddress`
- `Bool`(布尔值)
- `DateGreaterThan`、`DateLessThan`
- 常见条件键S3
- `s3:prefix` —— 对象前缀
- `s3:delimiter` —— 分隔符
- `s3:max-keys` —— ListObjects 的最大数量
- `aws:SourceIp` —— 客户端 IP
- `aws:RequestedRegion` —— 请求的区域
- **示例**:只允许来自特定 IP 的上传
```json
"Condition": {
"IpAddress": {
"aws:SourceIp": "192.168.1.100/32"
}
}
```
---
## 三、策略生效规则(重要)
1. **默认隐式拒绝**:任何未在策略中明确 Allow 的操作,都会被拒绝。
2. **显式 Deny 优先**:只要任意一个声明匹配 `Effect: "Deny"`,即使其他声明有 Allow也会被拒绝。
3. **合并策略**:用户可能同时有**用户策略**、**组策略**、**桶策略**,最终权限是这些策略的并集,再减去 Deny。
---
## 四、常用 S3 Action 分类MinIO 支持大部分)
| 分类 | Action | 说明 |
| :--- | :--- | :--- |
| **读操作** | `s3:ListBucket` | 列出桶内对象(需要桶资源 `arn:aws:s3:::bucket` |
| | `s3:GetObject` | 下载对象 |
| | `s3:GetObjectAcl` | 获取对象的 ACL |
| | `s3:GetObjectTagging` | 获取对象的标签 |
| | `s3:HeadObject` | 获取对象元数据(不返回内容) |
| **写操作** | `s3:PutObject` | 上传对象 |
| | `s3:DeleteObject` | 删除对象 |
| | `s3:DeleteObjectVersion` | 删除特定版本(启用版本控制时) |
| | `s3:PutObjectAcl` | 修改对象的 ACL |
| | `s3:PutObjectTagging` | 设置/修改对象标签 |
| | `s3:AbortMultipartUpload` | 终止分片上传 |
| **桶管理** | `s3:CreateBucket` | 创建桶 |
| | `s3:DeleteBucket` | 删除桶 |
| | `s3:PutBucketPolicy` | 设置桶策略 |
| | `s3:GetBucketPolicy` | 获取桶策略 |
| | `s3:PutBucketVersioning` | 设置版本控制 |
| | `s3:PutBucketLifecycle` | 设置生命周期规则 |
| **多部分上传** | `s3:ListMultipartUploadParts` | 列出已上传的分片 |
| | `s3:UploadPart` | 上传分片 |
> **提示**:使用 `s3:*` 可匹配该服务下所有操作。MinIO 还支持一些扩展操作(如 `admin:*`),但通常不写在用户存储策略中。
---
## 五、实战示例:逐步构建一个桶控制策略
### 场景:只允许对 `orderbook` 桶进行读写,**不允许删除**
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::orderbook",
"arn:aws:s3:::orderbook/*"
]
}
]
}
```
### 场景:完全控制 `orderbook` 桶(所有操作)
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::orderbook",
"arn:aws:s3:::orderbook/*"
]
}
]
}
```
### 场景:只允许上传到 `uploads/` 前缀,且文件名为 `incoming-*`
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::orderbook/uploads/incoming-*"
}
]
}
```
### 场景:拒绝删除任何对象(显式 Deny
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::orderbook",
"arn:aws:s3:::orderbook/*"
]
},
{
"Effect": "Deny",
"Action": [
"s3:DeleteObject",
"s3:DeleteObjectVersion"
],
"Resource": "arn:aws:s3:::orderbook/*"
}
]
}
```
### 场景:限制只能从特定 IP 访问
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::orderbook/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "10.0.0.0/24"
}
}
}
]
}
```
---
## 六、常见错误与调试
| 错误现象 | 可能原因 | 解决方案 |
| :--- | :--- | :--- |
| 能列出桶,但无法上传 | 桶对象资源 `/*` 缺失 | 确保 Resource 包含 `arn:aws:s3:::桶名/*` |
| 无法列出桶内对象 | 缺少 `s3:ListBucket` 或桶级 Resource | 添加桶本身资源(不带 `/*` |
| 能上传但无法覆盖 | 显式 Deny 或没有完整写入权限 | 检查是否有 `s3:PutObject` |
| IP 限制不生效 | Condition 语法错误或键名不对 | 使用 `aws:SourceIp` 且值为 CIDR |
| 策略不生效 | 策略未正确附加到用户/组 | 使用 `mc admin policy attach` 检查 |
---
## 七、MinIO 特有提醒
- MinIO 默认禁用 `s3:CreateBucket` 等管理操作,除非你使用 `root` 或拥有管理员策略。
- MinIO 支持 **内置策略**(如 `readonly`、`readwrite`、`consoleAdmin`),可以直接附加。
- 策略 JSON 大小限制通常为 **20KB**MinIO 默认)。
- 使用 `mc` 命令可以验证策略语法:
`mc admin policy create myminio mypolicy ./policy.json`
---
希望这份整理能够帮助你灵活编写策略。如果你有具体的访问控制需求,可以提供描述,我可以直接为你生成策略 JSON。