当前位置: 首页 > news >正文

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

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

  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 的连接别名mcaliassetmyminio http://192.168.58.227:9000 business business123

然后创建存储桶:

# 创建存储桶mcmb myminio/business-platform# 验证是否创建成功mclsmyminio/

2.3 方式三:通过 S3 API(代码)创建

适合在应用程序中集成,以下为 Python 示例(使用 minio-py SDK):

pipinstallminio
fromminioimportMinio 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/*"]}]}

策略解读:

StatementEffectActionResource含义
第一条Allows3:ListBucket 等arn:aws:s3:::business-platform允许列出桶内容和查看桶信息
第二条Allows3:Get/Put/DeleteObjectarn: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 并绑定策略mcadmin user svcacctadd\--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 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 正向验证(应该成功的操作)

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

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

  1. 尝试创建新的存储桶——应返回AccessDenied
  2. 尝试访问其他存储桶的文件——应返回AccessDenied
  3. 尝试删除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}")# 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>查看对象元数据
生成预签名 URLmc share download <alias>/<bucket>/<key>生成临时访问链接
创建用户mc admin user add <alias> <user> <pass>创建 MinIO 用户
创建 Service Accountmc 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)应仅对管理网络开放,不对外网暴露。
http://www.zskr.cn/news/1500203.html

相关文章:

  • 2026锦州漏水维修攻略|一修匠修缮:厨卫 阳台 外墙 屋顶 地下室|靠谱防水门店 - 绿呼吸检测中心
  • 2026马鞍山漏水维修攻略|一修匠修缮:厨卫 阳台 外墙 屋顶 地下室|靠谱防水门店 - 绿呼吸检测中心
  • 性价比高的教务系统供应商
  • 2026贵阳漏水维修攻略|一修匠修缮:厨卫 阳台 外墙 屋顶 地下室|靠谱防水门店 - 绿呼吸检测中心
  • Java IO输入输出流精讲|流的作用、划分方式与使用场景梳理
  • 100 万科研者的共同选择背后:中国科研正在发生什么结构性变化?
  • 2026邯郸漏水维修攻略|一修匠修缮:厨卫 阳台 外墙 屋顶 地下室|靠谱防水门店 - 绿呼吸检测中心
  • 2026年 无锡注册营业执照代办优选榜单:高效合规、一站式公司注册代办服务深度推荐 - 品牌发掘
  • 2026年口碑好的 青岛正规画室、美术培训学校排行:5家机构办学实力实测对比 - 起跑123
  • AI Agent Harness Engineering 作为企业家:自主发现并执行商业机会的潜力
  • 数据的加密与解密(22:35)
  • 2026晋中漏水维修攻略|一修匠修缮:厨卫 阳台 外墙 屋顶 地下室|靠谱防水门店 - 绿呼吸检测中心
  • Python课程设计-问题小结
  • 告别数据丢失!2026年超好用的文件自动备份工具推荐
  • 拆解一个真实的P2P金融系统:它的Web端、APP端和后管平台都是怎么协作的?
  • 青云国樾售楼处官方预约热线公布!低密洋房房源、样板间参观提前登记 - 资讯快报
  • leecodecode【状态机DP】【2026.6.9打卡-java版本】
  • STM32 IIC实战避坑:用HAL库读写AT24C02 EEPROM,CubeMX配置详解
  • 2026最新湖南建康学校招生办电话|湖南建康学校招生办官方联系方式大全 - 品牌官
  • 2026菏泽漏水维修攻略|一修匠修缮:厨卫 阳台 外墙 屋顶 地下室|靠谱防水门店 - 绿呼吸检测中心
  • 2026年6月天津律师深度测评!专业实力与性价比综合排行婚姻策略指导 - 资讯快报
  • 从4G到5G:RRC连接重配置信令在跨代网络协同中扮演的关键角色
  • 瓦楞纸板厂主要集中在哪些地区?
  • CKKS同态加密中的旋转操作:在隐私计算与联邦学习里,它到底解决了什么实际问题?
  • 在STM32上跑通TinyML:从理论到实践的全栈指南
  • Scrutor:.NET 依赖注入自动化的优雅实现
  • git遇见的问题[2]
  • LangGraph多智能体系统工程实践:状态驱动的网页数据采集架构
  • 2026年电滑环公司选型指南:驰宏科技如何定义高性能滑环新标准? - 品牌报告
  • PowerShell操作FTP踩坑全记录:从PSFTP模块的Bug到手动调用.Net类的终极方案