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 的连接别名mcaliassetmyminio http://192.168.58.227:9000 business business123然后创建存储桶:
# 创建存储桶mcmb myminio/business-platform# 验证是否创建成功mclsmyminio/2.3 方式三:通过 S3 API(代码)创建
适合在应用程序中集成,以下为 Python 示例(使用 minio-py SDK):
pipinstallminiofromminioimportMinio client=Minio("192.168.58.227:9000",access_key="business",secret_key="business123",secure=False)# 创建存储桶bucket_name="business-platform"ifnotclient.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 并绑定策略mcadmin user svcacctadd\--policy/tmp/bp-rw-policy.json\myminio business# 输出示例:# Access Key: MQ8484Z8S41I6YPPMZTQ# Secret Key: Hps+Whe22+tALzskv2SeIefb7YNpyqd7qaC+g0PP3.5 方式三:通过 Console REST API 创建
适合自动化部署场景,通过 HTTP 请求直接调用 Console API:
# 1. 登录获取 Session TokenTOKEN=$(curl-s-XPOST http://192.168.58.227:9001/api/v1/login\-H'Content-Type: application/json'\-d'{"accessKey":"business","secretKey":"business123"}'\-c-|greptoken|awk'{print $NF}')# 2. 创建 Service Accountcurl-XPOST 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)
fromminioimportMiniofromminio.errorimportS3Errorimportio 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")exceptS3Errorase:print(f"被拒绝:{e.code}")# AccessDenied5 常用 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)应仅对管理网络开放,不对外网暴露。
