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

43 阅读5分钟

封面

RustFS 官网首页:面向 AI 数据中心的高性能 S3 兼容对象存储

一次生产事故让我记住了权限模型的重要性:有个团队把 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 凭证。

RustFS IAM 身份类型与创建方式

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

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

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

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

RustFS OIDC SSO 登录到访问的链路

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