服务账户和 STS

介绍 RustFS 服务账户(派生访问密钥)以及通过 STS AssumeRole API 获取的临时凭证。

RustFS 提供两种从现有身份派生凭证的机制:服务账户(由父用户拥有的长期访问密钥)和 STS 临时凭证(包含会话令牌的短期密钥)。

服务账户

服务账户是属于父 IAM 用户(或根账户)的访问密钥/秘密密钥对。它像普通密钥一样进行身份验证,但使用父身份的权限进行授权:

  • 继承策略(默认)。 如果创建服务账户时未提供策略,它会继承父用户的组合策略在请求时允许的所有权限。
  • 会话绑定策略。 如果创建时提供策略文档,该策略会嵌入服务账户。请求必须同时获得父用户策略和嵌入策略的允许。
  • 过期时间。 可以设置可选的过期时间戳(RFC 3339);到达该时间后凭证将停止工作。

服务账户不能调用 AssumeRole,也不能将服务账户访问密钥转换为普通 IAM 用户。

在控制台中,通过访问密钥页面管理服务账户,请参阅访问密钥管理。管理 API 提供以下端点:

操作方法和路径说明
创建服务账户PUT /rustfs/admin/v3/add-service-account正文见下文。也可通过 /add-service-accounts 访问。需要 admin:CreateServiceAccount 才能为其他用户(targetUser)创建。
列出服务账户GET /rustfs/admin/v3/list-service-accounts?user=<name>列出其他用户的账户需要 admin:ListServiceAccounts
批量列出访问密钥GET /rustfs/admin/v3/list-access-keys-bulk支持仅筛选用户、仅筛选服务账户或仅筛选 STS 密钥。
服务账户详情GET /rustfs/admin/v3/info-service-account?accessKey=<key>返回名称、描述、父身份、过期时间和会话策略(继承时返回 impliedPolicy: true)。
临时账户详情GET /rustfs/admin/v3/temporary-account-info?accessKey=<key>用于 STS 签发的密钥。
访问密钥详情GET /rustfs/admin/v3/info-access-key?accessKey=<key>统一查询用户、服务账户和 STS 密钥。
更新服务账户POST /rustfs/admin/v3/update-service-account?accessKey=<key>可以轮换秘密密钥,更改状态、名称、描述和过期时间,或替换策略。
删除服务账户DELETE /rustfs/admin/v3/delete-service-account?accessKey=<key>也可通过 /delete-service-accounts 访问。非管理员调用方只能删除自己的服务账户。

创建请求正文(除特别说明外,所有字段均可选):

{
  "policy": { "Version": "2012-10-17", "Statement": [] },
  "targetUser": "alice",
  "accessKey": "myserviceaccount",
  "secretKey": "mysecret",
  "name": "ci-pipeline",
  "description": "Key used by CI",
  "expiration": "2027-01-01T00:00:00Z"
}

省略 accessKey/secretKey 可让 RustFS 随机生成密钥对。省略 policy 可创建继承策略的服务账户。使用 targetUser 需要管理员权限;普通用户为自己创建服务账户。

STS 临时凭证

RustFS 在服务器根路径实现了与 AWS 兼容的 STS 端点(使用表单编码参数的 POST /)。支持两种操作:

  • AssumeRole:用于现有 IAM 身份,使用 SigV4 签名。
  • AssumeRoleWithWebIdentity:用于 OIDC 身份,通过 JWT 本身进行身份验证(请参阅外部身份(OIDC))。

AssumeRole

请求必须由长期 IAM 凭证签名(AWS Signature V4),临时凭证和服务账户不能调用 AssumeRole。调用身份还需要其策略允许 sts:AssumeRole 操作(所有内置策略均包含此操作)。

表单参数:

参数必需描述
ActionAssumeRole
Version必须为 2011-06-15
DurationSeconds凭证有效期(秒)。默认为 3600(1 小时);值会被限制在 900(15 分钟)到 43200(12 小时)范围内。
Policy进一步限制临时凭证的内联会话策略(JSON)。
RoleArn, RoleSessionName, ExternalId为兼容 AWS 而接受。

示例:

curl -s -X POST "https://rustfs.example.com/" \
  --user "$ACCESS_KEY:$SECRET_KEY" \
  --aws-sigv4 "aws:amz:us-east-1:s3" \
  -d "Action=AssumeRole" \
  -d "Version=2011-06-15" \
  -d "DurationSeconds=3600"

响应是一个 XML AssumeRoleResponse,包含 AccessKeyIdSecretAccessKeySessionTokenExpiration。后续 S3 请求需使用全部三个凭证值(会话令牌放在 X-Amz-Security-Token 中)。

临时凭证继承调用方的策略;凭证的 parent 是发起调用的访问密钥。如果提供了 Policy 参数,该参数会存储在会话中并作为额外限制应用。

AssumeRoleWithWebIdentity

用于 OIDC 流程;由于使用身份提供商的 JWT 进行身份验证,因此不需要 SigV4 签名:

参数必需描述
ActionAssumeRoleWithWebIdentity
Version必须为 2011-06-15
WebIdentityToken由已配置提供商签发的 OIDC ID 令牌。
DurationSeconds默认值和 900–43200 范围限制与 AssumeRole 相同。
Policy可选的内联会话策略。

RustFS 根据配置的提供商验证令牌(签名、签发者、受众、有效期),将令牌的 groups/roles 声明映射到 RustFS 策略名称;如果无法映射到任何策略或组,则拒绝请求。响应是 XML AssumeRoleWithWebIdentityResponse,包含相同的凭证字段以及 SubjectFromWebIdentityToken

请根据工作负载的实际需要,将 DurationSeconds 设置得尽可能短;泄露的临时凭证在过期前仍然有效。

本页目录