注意
本文档适用于 Ceph 的开发版本。
用户帐户
Squid 版本新增。
Ceph 对象网关支持用户帐户作为一项可选功能,可实现对用户、组和角色的自助式管理,类似于 AWS Identity and Access Management (IAM) 中的功能。
帐户根用户
每个帐户都由一个帐户根用户管理。与普通用户和角色一样,帐户和帐户根用户必须由管理员使用 radosgw-admin 或 Admin Ops API 创建。
帐户根用户对帐户拥有的所有资源具有默认权限。根用户的凭证(访问密钥和密钥)可用于 Ceph 对象网关 IAM API,以创建额外的 IAM 用户和角色,用于 Ceph 对象网关 S3 API,以及管理其相关的访问密钥和策略。
鼓励帐户所有者仅将此帐户根用户用于管理,并为特定应用程序创建具有细粒度权限的用户和角色。
警告
虽然帐户根用户不需要 IAM 策略即可访问帐户内的资源,但可以添加策略明确拒绝其访问。谨慎使用拒绝语句。
资源所有权
当普通(非帐户)用户创建存储桶和上传对象时,这些资源归该用户所有。相关的 S3 ACL 将该用户命名为所有者和被授权者,并且这些存储桶仅在 s3:ListBuckets 请求中对拥有该存储桶的用户可见。
相比之下,当用户或角色属于某个帐户时,他们创建的资源则归该帐户本身所有。相关的 S3 ACL 将帐户 ID 命名为所有者和被授权者,并且这些存储桶对该帐户中的任何用户或角色发送的 s3:ListBuckets 请求可见。
由于资源归帐户所有,而不是归其用户所有,因此所有使用情况统计信息和配额执行都适用于整个帐户,而不是其单个用户。
帐户 ID
帐户标识符可以在接受用户 ID 或租户名称的多个位置使用,因此帐户 ID 使用特殊格式以避免歧义:字符串 RGW 后跟 17 位数字,如 RGW33567154695143645。如果在创建帐户时未指定,则会随机生成该格式的帐户 ID。
帐户 ID 通常出现在 IAM 策略文档的 Amazon Resource Names (ARN) 中。例如,arn:aws:iam::RGW33567154695143645:user/A 指的是该帐户中名为 A 的 IAM 用户。Ceph 对象网关也支持在该位置使用租户名称。
帐户 ID 也可以用于 ACL 中,作为类型为 CanonicalUser 的 Grantee。此处也支持用户 ID。
IAM 策略
虽然非帐户用户默认允许创建存储桶和上传对象,但帐户用户开始时没有任何权限。
在 IAM 用户执行 API 操作之前,必须添加一些策略以允许其操作。帐户根用户可以通过几种方式为其用户添加身份策略。
使用
iam:PutUserPolicy和iam:AttachUserPolicy操作直接向用户添加策略。创建一个 IAM 组,并使用
iam:PutGroupPolicy和iam:AttachGroupPolicy操作添加组策略。使用iam:AddUserToGroup操作添加到该组的用户将继承该组的所有策略。创建一个 IAM 角色,并使用
iam:PutRolePolicy和iam:AttachRolePolicy操作添加角色策略。使用sts:AssumeRole和sts:AssumeRoleWithWebIdentity操作担任此角色的用户将继承该角色的所有策略。
这些身份策略根据 在单个帐户内评估策略 和 跨帐户策略评估逻辑 中的规则进行评估。
主体
当用户属于某个帐户时,策略文档中的“主体”ARN 会以不同的方式引用用户。
在帐户之外,用户主体按用户 ID 命名,例如 arn:aws:iam:::user/uid 或 arn:aws:iam::tenantname:user/uid,其中 uid 对应于 radosgw-admin 中的 --uid 参数。
在帐户内,用户主体改为使用用户名,例如 arn:aws:iam::RGW33567154695143645:user/name,其中 name 对应于 radosgw-admin 中的 --display-name 参数。帐户用户继续匹配租户形式,以便在用户迁移到帐户时现有策略继续有效。
租户隔离
与用户一样,帐户可以选择性地属于一个租户,以实现存储桶的命名空间隔离。例如,一个名为“acct”的帐户可以存在于租户“a”下,而另一个名为“acct”的帐户可以存在于租户“b”下。有关详细信息,请参阅 多租户。
租户帐户只能包含具有相同租户名称的用户。
无论租户如何,帐户 ID 和电子邮件地址必须是全局唯一的。
帐户管理
创建帐户
创建帐户
radosgw-admin account create [--account-name={name}] [--account-id={id}] [--email={email}]
创建帐户根用户
创建帐户根用户
radosgw-admin user create --uid={userid} --display-name={name} --account-id={accountid} --account-root --gen-secret --gen-access-key
删除帐户
删除帐户
radosgw-admin account rm --account-id={accountid}
帐户统计/配额
查看帐户统计信息
radosgw-admin account stats --account-id={accountid} --sync-stats
启用帐户配额
radosgw-admin quota set --quota-scope=account --account-id={accountid} --max-size=10G
radosgw-admin quota enable --quota-scope=account --account-id={accountid}
为帐户启用存储桶配额
radosgw-admin quota set --quota-scope=bucket --account-id={accountid} --max-objects=1000000
radosgw-admin quota enable --quota-scope=bucket --account-id={accountid}
将现有用户迁移到帐户
可以使用 user modify 将现有用户收纳到帐户中
radosgw-admin user modify --uid={userid} --account-id={accountid}
注意
用户所有存储桶的所有权将转移到帐户。
注意
帐户成员身份是永久性的。一旦添加,用户不能从其帐户中删除。
注意
IAM 用户 API 对 UserName 的格式提出了额外的要求,在将用户迁移到帐户时会强制执行此要求。如果迁移失败并显示“UserName contains invalid characters”,则应修改 --display-name 以匹配 [\w+=,.@-]+。
警告
用户通知主题的所有权不会转移到帐户。通知将继续有效,但这些主题将不再对 SNS 主题 API 可见。主题及其相关的存储桶通知可以按照下面 迁移通知主题 中的描述进行迁移。
由于帐户用户默认没有权限,因此必须添加一些身份策略才能恢复用户的原始权限。
或者,您可能希望为每个现有用户创建一个新帐户。在这种情况下,您可能希望添加 --account-root 选项,使每个用户成为其帐户的根用户。
迁移通知主题
仅当启用 notification_v2 功能时才支持帐户主题,如 存储桶通知 和 支持的区域功能 中所述。
迁移影响: 当非帐户用户迁移到帐户时,现有通知主题仍然可以通过 RADOS Gateway admin API 访问,但用户会失去通过 SNS Topic API 访问它们的权限。尽管如此,这些主题仍然有效,并且存储桶通知将继续按预期交付。
重新创建主题: 帐户用户应使用相同的名称重新创建主题。旧主题(现在无法访问)和新的帐户拥有的主题将共存而不会相互干扰。
更新存储桶通知配置: 订阅旧的归用户所有主题的存储桶应更新为使用新的归帐户所有主题。为防止重复通知,请保持相同的通知 ID。例如,如果存储桶的现有通知配置为
{"TopicConfigurations": [{ "Id": "ID1", "TopicArn": "arn:aws:sns:default::topic1", "Events": ["s3:ObjectCreated:*"]}]}
更新后的配置将为
{"TopicConfigurations": [{ "Id": "ID1", "TopicArn": "arn:aws:sns:default:RGW00000000000000001:topic1", "Events": ["s3:ObjectCreated:*"]}]}
在此示例中,
RGW00000000000000001是帐户 ID,topic1是主题名称,ID1是通知 ID。删除旧主题: 一旦没有存储桶订阅旧的归用户所有主题,管理员就可以将其删除
$ radosgw-admin topic rm --topic topic1
帐户根用户示例
帐户根用户的凭证解锁 Ceph 对象网关 IAM API。
此示例使用 awscli 创建用于 S3 操作的 IAM 用户。
为帐户根用户创建配置文件
$ aws --profile rgwroot configure set endpoint_url https://:8000 $ aws --profile rgwroot configure AWS Access Key ID [None]: {root access key} AWS Secret Access Key [None]: {root secret key} Default region name [None]: default Default output format [None]:创建 IAM 用户,添加凭证,并附加用于 S3 访问的策略
$ aws --profile rgwroot iam create-user --user-name Alice { "User": { "Path": "/", "UserName": "Alice", "UserId": "b580aa8e-14c7-4b6a-9dac-a30c640244b6", "Arn": "arn:aws:iam::RGW63136524507535818:user/Alice", "CreateDate": "2024-02-07T00:15:45.162786+00:00" } } $ aws --profile rgwroot iam create-access-key --user-name Alice { "AccessKey": { "UserName": "Alice", "AccessKeyId": "JBNLYD5BDNRVV64J02E8", "Status": "Active", "SecretAccessKey": "SnHoE700kdNuT22K8Bhy2iL3DwZU0sUSDI1gUXHr", "CreateDate": "2024-02-07T00:16:34.679316+00:00" } } $ aws --profile rgwroot iam attach-user-policy --user-name Alice \ --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess为 S3 用户创建配置文件
$ aws --profile rgws3 configure set endpoint_url https://:8000 $ aws --profile rgws3 configure AWS Access Key ID [None]: JBNLYD5BDNRVV64J02E8 AWS Secret Access Key [None]: SnHoE700kdNuT22K8Bhy2iL3DwZU0sUSDI1gUXHr Default region name [None]: default Default output format [None]:
使用 S3 用户配置文件创建存储桶
$ aws --profile rgws3 s3 mb s3://testbucket make_bucket: testbucket