MinIO创建存储桶与密钥对赋权操作指南
MinIO 对象存储:创建存储桶与密钥对赋权操作指南
文档版本:v1.0 | 日期:2026-06-09 | 适用于 MinIO RELEASE.2024+ 版本
1 概述
MinIO 是一款高性能的开源对象存储服务器,完全兼容 Amazon S3 API。它适合存储非结构化数据,如图片、视频、日志文件、备份数据等。本文档以「创建存储桶并为其分配专属密钥对」为主线,介绍 MinIO 的核心操作流程。
1.1 架构与端口
MinIO 服务通常会监听两个端口,分别用于不同的访问场景:
| 端口 | 用途 | 说明 |
|---|---|---|
| 9000(默认) | S3 API 端口 | 程序通过此端口进行文件上传/下载等 S3 操作 |
| 9001(默认) | Web Console 端口 | 浏览器访问的可视化管理界面 |
提示: 在云服务器或 Docker 环境中,端口可能被自定义。请确保防火墙已放行 S3 API 端口(9000),否则程序无法连接。
1.2 核心概念
| 概念 | 说明 | 类比 |
|---|---|---|
| Bucket(存储桶) | 存储对象的顶级容器,名称全局唯一 | 类似文件系统的根目录 |
| Object(对象) | 存储在桶中的文件,通过 key(路径)访问 | 类似文件 |
| Policy(策略) | JSON 格式的 IAM 权限声明,定义允许/禁止的操作 | 类似文件权限 ACL |
| User(用户) | 拥有固定密钥对的身份,可绑定策略 | 类似系统用户 |
| Service Account(服务账号) | 用户的子账号,可分配独立的策略和密钥对 | 类似 API Key |
2 创建存储桶(Bucket)
存储桶是 MinIO 中存储对象的顶级容器。创建时需注意:桶名必须全局唯一,仅允许小写字母、数字、短横线和点号,且长度在 3–63 个字符之间。
2.1 方式一:通过 Web Console 创建
这是最直观的方式,适合日常管理操作。
- 打开浏览器,访问 Console 地址(如
http://192.168.58.227:9001),使用管理员账号登录。 - 在左侧导航栏点击「Buckets」进入存储桶管理页面。
- 点击右上角「Create Bucket」按钮。
- 填写桶名(如
business-platform),根据需要开启 Versioning(版本控制)或 Object Locking(对象锁定)。 - 点击「Create Bucket」确认创建。创建成功后会出现在存储桶列表中。
注意: Versioning 开启后,每次覆盖同名文件都会保留历史版本,可用于数据恢复但会增加存储用量。
2.2 方式二:通过 mc 命令行创建
mc(MinIO Client)是官方提供的命令行工具,适合自动化脚本和批量操作。
首先配置连接别名:
# 配置一个名为 myminio 的连接别名
mc alias set myminio http://192.168.58.227:9000 business business123
然后创建存储桶:
# 创建存储桶
mc mb myminio/business-platform
# 验证是否创建成功
mc ls myminio/
2.3 方式三:通过 S3 API(代码)创建
适合在应用程序中集成,以下为 Python 示例(使用 minio-py SDK):
pip install minio
from minio import Minio
client = Minio(
"192.168.58.227:9000",
access_key="business",
secret_key="business123",
secure=False
)
# 创建存储桶
bucket_name = "business-platform"
if not client.bucket_exists(bucket_name):
client.make_bucket(bucket_name)
print(f"存储桶 {bucket_name} 创建成功")
else:
print(f"存储桶 {bucket_name} 已存在")
提示: Java 可使用 MinIO Java SDK(
io.minio:minio),Node.js 可使用 minio npm 包,API 逻辑均相同。
3 创建密钥对并赋权
这是本文档的核心部分。我们需要为应用程序创建一对专属的 Access Key / Secret Key,并通过策略(Policy)限制其只能访问特定的存储桶。这样既能让应用正常读写文件,又不会影响其他数据的安全。
3.1 理解 MinIO 的身份与权限模型
MinIO 采用与 AWS IAM 兼容的权限模型。密钥对的赋权有两种方式:
| 方式 | 适用场景 | 特点 |
|---|---|---|
| 创建 User(用户) | 需要登录 Console 的人员账号 | 可登录 Console,可创建多个 Service Account |
| 创建 Service Account(服务账号) | 程序/API 调用场景 | 不能登录 Console,策略可独立于父用户 |
对于应用程序集成,推荐使用 Service Account 方式,因为它可以定义独立的策略,且不会影响父用户的权限。
3.2 编写 IAM Policy(权限策略)
Policy 是一个 JSON 文档,定义了密钥对能做什么、不能做什么。以下策略允许对 business-platform 桶进行读写操作,同时禁止访问其他桶:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:ListBucketMultipartUploads",
"s3:GetBucketLocation"
],
"Resource": [
"arn:aws:s3:::business-platform"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts"
],
"Resource": [
"arn:aws:s3:::business-platform/*"
]
}
]
}
策略解读:
| Statement | Effect | Action | Resource | 含义 |
|---|---|---|---|---|
| 第一条 | Allow | s3:ListBucket 等 | arn:aws:s3:::business-platform |
允许列出桶内容和查看桶信息 |
| 第二条 | Allow | s3:Get/Put/DeleteObject | arn:aws:s3:::business-platform/* |
允许对桶内文件进行读写删操作 |
关键区别: Resource 中的
arn:aws:s3:::bucket-name代表桶本身(用于 ListBucket),而arn:aws:s3:::bucket-name/*代表桶内所有对象(用于 GetObject/PutObject)。两者缺一不可。
3.3 方式一:通过 Console 创建 Service Account
- 登录 MinIO Console,在左侧导航栏点击「User」或「Service Accounts」。
- 点击「Create Service Account」按钮。
- 在 Policy 区域粘贴上方 3.2 节的 JSON 策略。
- 可选填写 Name 和 Description,方便日后识别用途。
- 点击「Create」。系统会生成一对 Access Key 和 Secret Key。
- 立即复制并安全保存 Secret Key——它只显示一次!
重要: Secret Key 创建后仅显示一次,关闭弹窗后无法再次查看。如果遗失,只能删除该 Service Account 并重新创建。
3.4 方式二:通过 mc 命令行创建
先将策略保存为文件,再创建并绑定:
# 1. 将策略写入文件
cat > /tmp/bp-rw-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket","s3:GetBucketLocation"],
"Resource": ["arn:aws:s3:::business-platform"]
},
{
"Effect": "Allow",
"Action": ["s3:GetObject","s3:PutObject","s3:DeleteObject"],
"Resource": ["arn:aws:s3:::business-platform/*"]
}
]
}
EOF
# 2. 创建 Service Account 并绑定策略
mc admin user svcacct add \
--policy /tmp/bp-rw-policy.json \
myminio business
# 输出示例:
# Access Key: MQ8484Z8S41I6YPPMZTQ
# Secret Key: Hps+Whe22+tALzskv2SeIefb7YNpyqd7qaC+g0PP
3.5 方式三:通过 Console REST API 创建
适合自动化部署场景,通过 HTTP 请求直接调用 Console API:
# 1. 登录获取 Session Token
TOKEN=$(curl -s -X POST http://192.168.58.227:9001/api/v1/login \
-H 'Content-Type: application/json' \
-d '{"accessKey":"business","secretKey":"business123"}' \
-c - | grep token | awk '{print $NF}')
# 2. 创建 Service Account
curl -X POST http://192.168.58.227:9001/api/v1/service-accounts \
-H 'Content-Type: application/json' \
-b "token=$TOKEN" \
-d '{
"policy": "<上述 JSON 策略字符串>",
"name": "business-platform-rw",
"description": "Read/Write access to business-platform"
}'
4 验证权限配置
创建完成后,必须验证新密钥对的权限范围是否正确。以下是推荐的验证流程:
4.1 正向验证(应该成功的操作)
- 使用新密钥对连接 MinIO,确认能看到
business-platform桶。 - 上传一个测试文件到
business-platform,确认上传成功。 - 下载该文件,确认内容正确。
- 列出桶内文件,确认能看到刚上传的文件。
- 删除测试文件,确认删除成功。
4.2 反向验证(应该被拒绝的操作)
- 尝试创建新的存储桶——应返回
AccessDenied。 - 尝试访问其他存储桶的文件——应返回
AccessDenied。 - 尝试删除
business-platform桶本身——应返回AccessDenied。
如果所有正向验证通过且所有反向验证均被拒绝,则说明权限配置正确、无越权风险。
4.3 验证脚本示例(Python)
from minio import Minio
from minio.error import S3Error
import io
client = Minio(
"192.168.58.227:9000",
access_key="MQ8484Z8S41I6YPPMZTQ", # 替换为实际值
secret_key="<你的 Secret Key>",
secure=False
)
# 正向: 上传文件
data = b"hello minio"
client.put_object("business-platform", "test.txt",
io.BytesIO(data), len(data))
# 反向: 尝试创建新桶 (应报错)
try:
client.make_bucket("hacker-bucket")
except S3Error as e:
print(f"被拒绝: {e.code}") # AccessDenied
5 常用 mc 命令速查
以下是日常运维中最常用的 mc 命令:
| 操作 | 命令 | 说明 |
|---|---|---|
| 配置连接 | mc alias set <name> <url> <ak> <sk> |
配置服务器别名 |
| 创建桶 | mc mb <alias>/<bucket> |
创建新存储桶 |
| 删除桶 | mc rb <alias>/<bucket> |
删除空桶(--force 可删非空桶) |
| 列出文件 | mc ls <alias>/<bucket> |
列出桶内对象(--recursive 递归) |
| 上传文件 | mc cp <local> <alias>/<bucket>/ |
上传本地文件到桶 |
| 下载文件 | mc cp <alias>/<bucket>/<key> <local> |
从桶下载文件到本地 |
| 删除文件 | mc rm <alias>/<bucket>/<key> |
删除桶内对象 |
| 查看信息 | mc stat <alias>/<bucket>/<key> |
查看对象元数据 |
| 生成预签名 URL | mc share download <alias>/<bucket>/<key> |
生成临时访问链接 |
| 创建用户 | mc admin user add <alias> <user> <pass> |
创建 MinIO 用户 |
| 创建 Service Account | mc admin user svcacct add <alias> <user> |
为用户创建子账号 |
| 查看策略 | mc admin policy info <alias> <policy> |
查看策略详情 |
| 服务器信息 | mc admin info <alias> |
查看服务器状态和用量 |
6 最佳实践与注意事项
6.1 密钥对管理
- 每个应用程序使用独立的 Service Account,不要共享密钥对。
- Secret Key 创建后只显示一次,必须立即安全存储(如密码管理器、环境变量、KMS)。
- 定期轮换密钥对:创建新的 Service Account → 应用切换 → 删除旧的。
- 绝不将密钥对硬编码在源代码中或提交到 Git 仓库。
6.2 最小权限原则
- 只授予应用所需的最小权限。如果只需读取,就不要给
PutObject和DeleteObject权限。 - 用 Resource 精确限制访问范围,可以用前缀路径进一步细化,如
arn:aws:s3:::bucket/app-data/*。 - 避免使用
"Resource": "*"或"Action": "s3:*"这类通配策略。
6.3 存储桶设计
- 桶名使用小写字母 + 短横线,避免特殊字符。
- 按业务或环境分桶(如
app-prod、app-staging、logs-2026),不要把所有数据放在一个桶里。 - 重要数据开启 Versioning,可防止误删除和意外覆盖。
6.4 网络与安全
- 生产环境务必使用 HTTPS(
useSSL=True),避免密钥对和数据在网络中明文传输。 - 通过防火墙限制 S3 API 端口的访问来源,只开放给必要的 IP 或网段。
- Console 端口(9001)应仅对管理网络开放,不对外网暴露。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)