使用 IAM 账户增强 Ceph 多租户管理


简介 ¶
在大型对象存储系统中,高效的多租户环境管理至关重要。在 Ceph Squid 版本中,我们引入了一项变革性的功能:身份和访问管理 (IAM) 账户。
此增强功能为 Ceph 对象存储带来了自助式资源管理,并通过实现非人工多租户管理,显著降低了 Ceph 管理员的管理开销。
IAM 账户允许租户独立管理其资源——用户、组、角色、策略和存储桶——使用模拟 AWS IAM 的 API 接口。对于 Ceph 管理员来说,这意味着将日常运营责任委派给租户,同时保留系统范围内的控制权。
IAM API 与 AWS S3 完全兼容,并通过对象网关 API 端点提供。 这样,IAM 账户管理员(根账户)无需访问 Ceph 内部 radosgw-cli 或 adminOPS API 的访问权限或权限,从而增强了责任委派,同时保持了安全性。
随着 IAM 账户的添加,我们有了一种新的用户角色,代表租户管理员:IAM 根账户用户。
- Ceph 对象存储管理员:负责系统范围内的管理和创建 IAM 账户。
- IAM 根账户用户:负责账户的管理员。管理特定租户/IAM 账户内的资源,使用通过 RGW 端点提供的 IAM API。
- S3 终端用户:在根账户用户授予的权限范围内运行。

使用 Ceph 中的 IAM 账户演练 ¶
先决条件:运行 RGW/对象存储服务的 Ceph Squid 或更高版本。 ¶
虽然本文档的范围之外,我们提供了一个示例 RGW 规范文件,用于设置 RGW 服务和 RGW 端点的 Ingress 服务(负载均衡器)。
# cat << EOF > /root/rgw-ha.spec
---
service_type: ingress
service_id: rgw.rgwsrv
service_name: ingress.rgw.rgwsrv
placement:
count: 2
hosts:
- ceph-node-02.cephlab.com
- ceph-node-03.cephlab.com
spec:
backend_service: rgw.rgwsrv
first_virtual_router_id: 50
frontend_port: 80
monitor_port: 1497
virtual_ip: 192.168.122.100
---
service_type: rgw
service_id: rgwsrv
service_name: rgw.rgwsrv
placement:
count: 3
hosts:
- ceph-node-03.cephlab.com
- ceph-node-00.cephlab.com
- ceph-node-01.cephlab.com
spec:
rgw_frontend_port: 8080
rgw_realm: realm1
rgw_zone: zone1
rgw_zonegroup: zonegroup1
EOF
# ceph orch apply -i /root/rgw-ha.spec
此配置为我们提供了一个在 192.168.122.100 上工作的虚拟 IP 端点,该端点解析为 s3.zone1.cephlab.com。
如何作为对象存储管理员创建和设置 IAM 账户 ¶
让我们逐步完成配置 IAM 账户、创建用户和应用权限的步骤。
创建 IAM 账户 ¶
我们将使用 radosgw-admin CLI 创建一个用于分析 Web 应用程序团队的 IAM 账户;您也可以使用 AdminOPS API。
在本例中,我们首先创建 IAM 账户,然后定义该特定 IAM 账户将从全局 RGW/对象存储系统获得哪些资源。
# radosgw-admin account create --account-name=analytic_app
此命令创建一个名为 analytic_app 的账户。该账户使用默认配额和限制进行初始化,之后可以进行调整。使用 IAM 账户时,将创建一个 RGW 账户 ID,该 ID 将成为我们在需要引用它时使用的 Principal ARN 的一部分,例如:arn:aws:iam::RGW00889737169837717:user/name。
示例输出
{
"id": "RGW00889737169837717",
"tenant": "analytics",
"name": "analytic_app",
"max_users": 1000,
...
}
修改 IAM 账户限制 ¶
作为 RGW 管理员,在本例中,我们调整了账户的最大用户数
# radosgw-admin account modify --max-users 10 --account-name=analytic_app
这确保了 IAM 账户可以创建最多十个用户。根据您的需要,您还可以管理最大数量的组、密钥、策略、存储桶等。
设置 IAM 账户上的配额 ¶
作为创建 IAM 账户的一部分,我们可以启用并定义账户的配额以控制资源使用情况。在本例中,我们将账户的最大存储使用量配置为 20GB,我们还可以配置与每个存储桶的对象数量相关的其他配额
# radosgw-admin quota set --quota-scope=account --account-name=analytic_app --max-size=20G
# radosgw-admin quota enable --quota-scope=account --account-id=RGW00889737169837717
¶
为我们的新 IAM 账户创建账户根用户
每个 IAM 账户都由一个根用户管理,该用户拥有账户内所有资源的默认权限。与普通用户和角色一样,账户和账户根用户必须由管理员使用 radosgw-admin 或 Admin Ops API 创建。
要为 analytic_app 账户创建账户根用户,我们运行以下命令
# radosgw-admin user create --uid=root_analytics_web --display-name=root_analytics_web --account-id=RGW00889737169837717 --account-root --gen-secret --gen-access-key
示例输出
{
"user_id": "root_analytics_web",
"access_key": "1EHAKZAXKPV6LU65QS2R",
"secret_key": "AgXK1BqPOP25pt0HvERDts2yZtFNfF4Mm8mCnoJX",
...
}
根账户用户现在已准备好创建和管理 IAM 账户内的用户、组、角色和权限。这些资源可以通过 RGW 端点提供的 IAM API 进行管理和管理。此时,RGW 管理员可以将 IAM 账户的根用户的凭据提供给负责该账户的人员。该人员可以使用 RGW 端点提供的 IAM API 执行与他们的账户相关的所有管理操作,这对于 RGW 管理员/操作员来说是完全非人工的。
以下是 IAM 根账户无需 RGW 管理员干预即可执行的一些操作的列表
- 创建、修改和删除用户
- 管理账户用户访问权限和密钥
- 管理 IAM 策略
- 管理 IAM 用户策略
- 管理 IAM 组
- 创建、修改和删除 OIDC 提供程序
- 创建、修改和删除通知主题
通过 IAM API 作为 IAM 根账户创建用户、组和角色 ¶
创建一个新的 IAM 用户到 IAM 账户。 ¶
现在我们将使用在上一步中生成的 IAM 根账户的访问密钥和密钥配置 AWS CLI。IAM API 默认情况下在我的 Ceph 对象网关 (RGW) 端点上可用。在本例中,我们有 s3.zone1.cephlab.com 作为提供对 API 的访问的负载均衡端点。
# dnf install awscli -y
# aws configure
AWS Access Key ID [****************dmin]: 1EHAKZAXKPV6LU65QS2R
AWS Secret Access Key [****************dmin]: AgXK1BqPOP25pt0HvERDts2yZtFNfF4Mm8mCnoJX
Default region name [multizg]: zonegroup1
Default output format [json]: json
# aws configure set endpoint_url http://s3.zone1.cephlab.com
将名为 analytics_frontend 的新 IAM 用户添加到 analytics IAM 账户
# aws iam create-user --user-name analytics_frontend
为新用户分配访问密钥和密钥
# aws iam create-access-key --user-name analytics_frontend
此时,用户无法访问 S3 资源。在下一步中,我们将启用用户访问资源。以下是在未附加策略的情况下尝试访问 S3 命名空间的示例
# aws --profile analytics_backend s3 ls
argument of type 'NoneType' is not iterable
# aws --profile analytics_backend s3 ls s3://staticfront/
argument of type 'NoneType' is not iterable
为 IAM 用户提供对 S3 资源的访问权限的选项 ¶
我们有多种方法可以授予新 IAM 用户访问账户中各种资源的权限,例如 IAM、S3 和 SNS 资源
- 附加预定义的托管策略;托管 IAM 策略可以附加到多个 IAM 身份(用户、组、角色)并在 AWS 账户之间重用。
- 创建自定义内联用户或组策略(使用户成为附加了策略的组的一部分)
- 假设现有的 IAM 角色以获取授予该角色的权限
| 功能 | 托管策略 | 内联策略 | 假设角色 |
|---|---|---|---|
| 定义 | 可附加到多个用户、组或角色的可重用策略。 | 附加到单个用户、组或角色的策略。 | 向用户或服务授予临时访问权限以执行特定任务。 |
| 可重用性 | 可以在多个账户或 RGW IAM 系统内的身份之间共享。 | 特定于附加到的身份,不能重用。 | 角色可以由需要临时访问权限的多个身份重用。 |
| 易于管理 | 由于集中式策略定义,因此更易于管理。 | 需要对附加到的每个身份进行单独更新。 | 由于角色是集中定义的并按需假设,因此更易于管理。 |
| 灵活性 | 非常适合适用于许多用户或组的常见权限。 | 最适合针对特定用例或用户的独特权限。 | 高度灵活,适用于需要限时、特定任务访问权限的情况。 |
| 用例 | 示例:授予对多个用户 S3 存储桶的只读或完全访问权限。 | 示例:授予特定用户访问唯一的 S3 存储桶的权限。 | 示例:允许服务临时假设访问 S3 存储桶以进行处理的权限。 |
示例 1. 将托管策略附加到新的 IAM 用户 ¶
在本例中,我们使用托管策略 policy/AmazonS3FullAccess 允许 analytics_frontend 用户完全访问 IAM 账户 S3 资源
# aws iam attach-user-policy --user-name analytics_frontend --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
一旦我们附加了托管策略,我们就可以创建 IAM 账户的 S3 资源,例如
# aws --profile analytics_frontend s3 mb s3://staticfront
make_bucket: staticfront
示例 2. 将托管策略附加到组并将 IAM 用户添加到该组 ¶
首先创建一个 IAM 组来管理需要类似角色的用户的权限。在本例中,我们正在为前端监控团队创建一个组。
# aws iam create-group --group-name frontend-monitoring
将策略附加到组:在本例中,我们将附加一个 S3 只读访问策略到该组,以便所有用户继承权限并可以以只读模式访问 S3 资源。不允许修改 S3 数据集。
# aws iam attach-group-policy --group-name frontend-monitoring --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
检查策略是否已成功附加到该组
# aws iam list-attached-group-policies --group-name frontend-monitoring
{
"AttachedPolicies": [
{
"PolicyName": "AmazonS3ReadOnlyAccess",
"PolicyArn": "arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess"
}
]
}
创建具有其密钥的单个 IAM 用户,这些用户将是组的成员。
# aws iam create-user --user-name mon_user1
# aws iam create-user --user-name mon_user2
# aws iam create-access-key --user-name mon_user1
# aws iam create-access-key --user-name mon_user2
将上一步中创建的用户添加到 frontend-monitoring 组,以便他们继承权限。
# aws iam add-user-to-group --group-name frontend-monitoring --user-name mon_user1
# aws iam add-user-to-group --group-name frontend-monitoring --user-name mon_user2
确认两个用户都是该组的一部分
# aws iam get-group --group-name frontend-monitoring
{
"Users": [
{
"Path": "/",
"UserName": "mon_user1",
"UserId": "fe09d373-08e8-4b61-bffa-6f65eaf11e56",
"Arn": "arn:aws:iam::RGW60952341557974488:user/mon_user1"
},
{
"Path": "/",
"UserName": "mon_user2",
"UserId": "29c57263-1293-4bdf-90e4-a784859f12ef",
"Arn": "arn:aws:iam::RGW60952341557974488:user/mon_user2"
}
],
"Group": {
"Path": "/",
"GroupName": "frontend-monitoring",
"GroupId": "a453d5af-4e25-401c-be76-b4075419cc94",
"Arn": "arn:aws:iam::RGW60952341557974488:group/frontend-monitoring"
}
}
示例 3. 创建自定义内联策略并将其附加到特定的用户 ¶
本示例演示了在 IAM 中创建和附加内联策略。内联策略定义了单个用户的权限,并直接嵌入到他们的身份中。虽然本示例侧重于 PutUserPolicy 操作,但如果您需要管理这些实体的权限,则相同的方法适用于组(PutGroupPolicy)和角色(PutRolePolicy)。
我们首先创建一个将分配自定义内联策略的用户。
# aws iam create-user --user-name static_ro
# aws iam create-access-key --user-name static_ro
我们创建一个 JSON 文件,其中包含策略文档以定义自定义内联策略。此策略允许用户对特定的 S3 存储桶及其对象执行只读操作。
# cat << EOF > analytics_policy_web_ro.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": [
"arn:aws:s3:::staticfront/*",
"arn:aws:s3:::staticfront"
]
}
]
}
EOF
示例策略概述
- Effect: Allow 指定策略授予权限。
- Actions: 包括 s3:GetObject、s3:ListBucket 和 s3:ListBucketMultipartUploads,这些允许用户读取数据和列出 S3 存储桶中的对象。
- Resource: 指定 S3 存储桶 (analytics:staticfront) 及其对象。
使用 put-user-policy 命令将策略附加到用户。
# aws iam put-user-policy --user-name static_ro --policy-name analytics-static-ro --policy-document file://analytics_policy_web_ro.json
列出附加到用户的内联策略以确认策略已成功应用。
# aws iam list-user-policies --user-name static_ro
{
"PolicyNames": [
"analytics-static-ro"
]
}
结论 ¶
由于此主题对于单个帖子来说过于广泛,我们不会在本文章中介绍 IAM 角色以及借助 STS 允许 IAM 用户假设角色的功能。在关于 Squid 版本中新 IAM 账户功能的下一篇文章中,我们将探索其他令人兴奋的功能,包括具有 STS 和跨账户访问以在账户之间共享数据集的角色。
有关 IAM 的更多详细信息,请参阅 IAM API 文档和账户文档。
有关 Squid 版本的更多详细信息,请查看 Laura Flores 的 博客文章
脚注 ¶
作者感谢 IBM 对社区的支持,为我们提供时间来创建这些帖子。