给 RustFS 拆多租户权限:IAM 用户、组与策略的实战

一次生产事故让我记住了权限模型的重要性:有个团队把 rustfsadmin 这个根账号的 key 直接下发给了三个业务组,结果其中一个组的脚本误删了另一个组的桶。根账号在 RustFS 里绕过所有策略检查,出事根本拦不住。RustFS 内置了一套以 AWS IAM 策略语言为模型的身份与访问管理系统,能让你像管 AWS 一样把权限拆到用户、组、服务账户,甚至接外部 IdP 做单点登录。这篇文章把身份类型和策略评估讲透,并给一条可落地的拆分路线。

1. 问题背景:根账号不是给你天天用的

RustFS 启动时通过 RUSTFS_ACCESS_KEY / RUSTFS_SECRET_KEY 创建的是根凭证,它拥有所有者语义,绕过所有策略检查。文档原话是「根账户绕过策略检查」。这把钥匙只该用来引导部署------创建第一批 IAM 用户和服务账户,然后日常操作全走这些受控身份。

我习惯的做法是:部署完第一件事就用根账号建一个 consoleAdmin 的管理员用户,把根 key 收进密钥库不再日常使用。剩下的按业务线拆用户、按团队拆组。

2. RustFS 的五类身份

RustFS 区分的身份类型,来源是官方 IAM 文档:

  • 根凭证:启动时环境变量创建,仅用于初始设置和紧急管理。
  • IAM 用户 :控制台或管理 API(add-user)创建,面向人或应用的长期命名账户。
  • :控制台或管理 API(update-group-members)创建,一次把一组策略挂到多个用户,成员继承所属每个组的策略。
  • 服务账户(访问密钥)add-service-account 创建,属于某个父用户的派生凭证,继承父用户权限,可加嵌入式会话策略进一步收窄,还能设过期时间------适合 CI、脚本这类非人操作。
  • STS 临时凭证 :通过 AssumeRole / AssumeRoleWithWebIdentity 获取,有效期 15 分钟到 12 小时,带访问密钥、秘密密钥和会话令牌。
  • 外部 OIDC 身份 :Keycloak、Authing 等标准 OIDC IdP 做控制台 SSO,ID 令牌里的 groups/roles 声明映射到 RustFS 策略名,再签发 STS 凭证。

3. 内置策略与自定义策略

RustFS 自带五个内置(canned)策略,覆盖大多数场景:readwritereadonlywriteonlydiagnosticsconsoleAdmin。日常八成需求靠这几个就够了。

需要更细的粒度时,写一条 AWS IAM 兼容的 JSON 策略文档挂上去。比如只允许某个应用读写 app-a 桶:

json 复制代码
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject", "s3:ListBucket"],
      "Resource": ["arn:aws:s3:::app-a", "arn:aws:s3:::app-a/*"]
    }
  ]
}

策略是具名 JSON 文档存进 RustFS,通过控制台或管理 API(set-user-or-group-policy)绑定到用户或组。一个用户可挂多条策略,组里的成员还会叠加组的策略。

4. 策略评估语义:显式拒绝优先

理解评估顺序,才能不写出「以为允许其实被拒」的策略。RustFS 合并一个身份的所有策略语句后按这个次序判:

  1. 显式拒绝优先 :只要有匹配的 Deny 语句,不管有没有 Allow,一律拒绝。
  2. 所有者快捷:没有匹配显式拒绝时,根(所有者)账户直接放行。
  3. 必须显式允许 :其他身份至少要有匹配的 Allow 语句。
  4. 默认拒绝:没有任何语句匹配,请求被拒。

服务账户和带会话策略的 STS 会话,有效权限取交集------父身份策略和会话策略都必须允许。这条对「临时给外包人员开一个只读、且只能访问某个前缀的凭证」特别好用:父用户本来有全量权限,但会话策略把它收窄到只读 + 单前缀。

5. 一条可落地的拆分路线

我建议按这四步把权限体系建起来:

  1. 用根账号创建一个 consoleAdmin 管理员用户,收起根 key。
  2. 按团队建组(如 team-datateam-ml),挂 readwrite 或自定义策略。
  3. 每个业务线建 IAM 用户,加入对应组;CI/脚本走服务账户并设过期时间。
  4. 如果已经有 Keycloak / Authing 这类 IdP,直接接 OIDC SSO,让研发用公司账号登录控制台,权限由 IdP 的 groups 声明驱动。

一个中性提醒:根凭证无法被策略限制,所以千万不要把它当日常账号下发。另外服务账户没有自己的策略绑定,它继承父用户------给服务账户收窄权限要靠创建时嵌入的会话策略,而不是单独挂策略。

6. 总结与下一步

RustFS 的 IAM 是 AWS IAM 兼容模型,意味着你现有的策略知识和工具链基本能直接搬。先把根账号收好,再用「用户 + 组 + 内置策略」三件套把日常权限管起来,需要跨系统统一身份就上 OIDC。

下一步可以打开控制台试建一个 readonly 用户、用 mc 配它的 key 验证只能读不能写;多集群场景再去看站点复制和跨桶复制的权限怎么配。


以下是深入学习 RustFS 的推荐资源:RustFS

官方文档: RustFS 官方文档- 提供架构、安装指南和 API 参考。

GitHub 仓库: GitHub 仓库 - 获取源代码、提交问题或贡献代码。

社区支持: GitHub Discussions- 与开发者交流经验和解决方案。

意见反馈:GitHub Issues

相关推荐
2601_9621007322 分钟前
2026年健康科普短视频怎么拍:手机拍摄规范与开源半自动工作流复盘
智能手机·开源·音视频
ZGG00341 分钟前
MCP 02:MCP 的各类比对——和 Function Calling、A2A、Skill 到底什么关系
人工智能·后端·python
IT_陈寒42 分钟前
Vite热更新突然失效?可能是这个配置在捣鬼
前端·人工智能·后端
redfred1 小时前
Koodo Reader 使用教程:开源电子书阅读器 epub/pdf/mobi/azw3 全格式 多端同步 AI翻译 笔记高亮
人工智能·pdf·开源
数学人学c语言1 小时前
OpenDM05-Memory 训练开源
机器人·开源
小灰灰搞电子1 小时前
Rust+Slint 实现蜂巢菜单源码分享
开发语言·rust·蜂巢菜单.
飞多学堂1 小时前
每日开源硬件精选简报 2026-08-21
开源·开源硬件·硬件开源·电子制作
SelectDB技术团队2 小时前
统一全文检索与 SQL 分析:Apache Doris 日志分析实践
大数据·数据结构·后端·python·全文检索·doris·日志分析
霸道流氓气质2 小时前
Spring AI多模型路由与动态切换
java·后端·spring