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 创建

这是最直观的方式,适合日常管理操作。

  1. 打开浏览器,访问 Console 地址(如 http://192.168.58.227:9001),使用管理员账号登录。
  2. 在左侧导航栏点击「Buckets」进入存储桶管理页面。
  3. 点击右上角「Create Bucket」按钮。
  4. 填写桶名(如 business-platform),根据需要开启 Versioning(版本控制)或 Object Locking(对象锁定)。
  5. 点击「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

  1. 登录 MinIO Console,在左侧导航栏点击「User」或「Service Accounts」。
  2. 点击「Create Service Account」按钮。
  3. 在 Policy 区域粘贴上方 3.2 节的 JSON 策略。
  4. 可选填写 Name 和 Description,方便日后识别用途。
  5. 点击「Create」。系统会生成一对 Access Key 和 Secret Key。
  6. 立即复制并安全保存 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 正向验证(应该成功的操作)

  1. 使用新密钥对连接 MinIO,确认能看到 business-platform 桶。
  2. 上传一个测试文件到 business-platform,确认上传成功。
  3. 下载该文件,确认内容正确。
  4. 列出桶内文件,确认能看到刚上传的文件。
  5. 删除测试文件,确认删除成功。

4.2 反向验证(应该被拒绝的操作)

  1. 尝试创建新的存储桶——应返回 AccessDenied
  2. 尝试访问其他存储桶的文件——应返回 AccessDenied
  3. 尝试删除 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 最小权限原则

  • 只授予应用所需的最小权限。如果只需读取,就不要给 PutObjectDeleteObject 权限。
  • 用 Resource 精确限制访问范围,可以用前缀路径进一步细化,如 arn:aws:s3:::bucket/app-data/*
  • 避免使用 "Resource": "*""Action": "s3:*" 这类通配策略。

6.3 存储桶设计

  • 桶名使用小写字母 + 短横线,避免特殊字符。
  • 按业务或环境分桶(如 app-prodapp-staginglogs-2026),不要把所有数据放在一个桶里。
  • 重要数据开启 Versioning,可防止误删除和意外覆盖。

6.4 网络与安全

  • 生产环境务必使用 HTTPS(useSSL=True),避免密钥对和数据在网络中明文传输。
  • 通过防火墙限制 S3 API 端口的访问来源,只开放给必要的 IP 或网段。
  • Console 端口(9001)应仅对管理网络开放,不对外网暴露。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐