介 绍
在本文中,我们将探讨如何通过引入 IAM 账户来提升 Ceph 的多租户功能。Ceph 是一个开源的分布式存储系统,广泛用于大规模数据存储,提供高性能和高可靠性。随着多租户需求的增加,在 Ceph Squid 版本中,Ceph 通过 IAM 账户的引入,进一步增强了其在多租户环境中的管理。
Ceph 通过 IAM 账户的引入,提供了更精细的访问控制和资源管理。管理员可以为每个租户创建独立的 IAM 账户,并根据需要分配相应的权限。这种机制确保了资源的隔离,避免了租户之间的冲突和安全风险。
IAM API 与 AWS S3 完全兼容,并通过对象网关 API 端点提供。这样,IAM 帐户管理员(根帐户)不需要访问 Ceph 内部 radosgw-cli 或 adminOPS API 的权限,从而在保持安全性的同时增强访问能力。
随着 IAM 账户的引入,我们新增了一个用户角色,代表租户管理员,即 IAM 根账户用户。
- Ceph 对象存储管理员:负责系统范围的管理和创建 IAM 账户。
- IAM 根账户用户:账户管理员。管理特定租户/IAM 账户内的资源,使用通过 RGW 端点提供的 IAM API。
- S3 最终用户:在 root 账户用户授予的权限范围内进行操作。
图片
实践:在 Ceph 中使用 IAM 账户
前提条件:Ceph Squid 或更高版本,并运行 RGW/对象存储服务。
下面提供了一个 RGW 配置的案例文件,用于为 RGW 设置 RGW 服务和 Ingres 服务(负载均衡)。
# 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 ,该IP解析的域名为s3.zone1.cephlab.com 。
如何创建和设置 IAM账户作为对象存储管理员
下面将逐步完成配置 IAM 账户、创建用户和应用权限的步骤。
创建 IAM 账户
我们将会使用 radosgw-admin 命令行工具来创建一个 IAM 账户,用于分析 Web 应用程序;当然也可以使用 AdminOPS API。
在这个案例中,我们首先创建 IAM 账户,然后定义这个特定 IAM 账户可以从全局 RGW/对象存储系统中访问的资源。
# radosgw-admin account create --account-name=analytic_app
该命令创建一个名为`analytic_app`的账户。该账户使用默认配额和限制进行初始化,之后可能会进行调整。使用 IAM 账户时,会创建一个 RGW 账户 ID,当我们需要引用它时,它将成为主体 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 账户均由 root 用户管理,该用户对账户内的所有资源拥有默认权限。与普通用户和角色一样,帐户和帐户 root 用户必须由管理员使用 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 管理员权限即可执行的一些操作:
- 创建、修改和删除用户
- 管理账户用户访问和ak,sk密钥
- 管理 IAM 策略
- 管理 IAM 用户策略
- 管理 IAM 组
- 创建、修改和删除 OIDC providers
- 创建、修改和删除 Notification Topics
通过 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 用户添加到分析 IAM 账户:
# aws iam create-user --user-name analytics_frontend
为新用户分配访问的ak与sk密钥:
# aws iam create-access-key --user-name analytics_frontend
此时用户无法访问S3资源。下一步,我们将使用户能够访问资源。以下是尝试以analytics_frontend用户身份访问 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 角色以获取授予该角色的权限
示例 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 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"
}
}
确认两个用户都是该组的一部分:
# aws iam create-user --user-name static_ro
# aws iam create-access-key --user-name static_ro
示例 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:允许指定该策略授予权限。
- Action:包括 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"
]
}
结 论
在Ceph Squid 版本,IAM账户的引入将极大地提升Ceph在多租户环境中的表现。未来,社区计划进一步优化IAM账户的功能,提供更多的自定义选项和自动化工具,以满足不同用户的需求。
通过引入IAM账户,Ceph在多租户环境中的灵活性和安全性得到了显著提升。我们期待这一新功能能够为用户带来更好的体验,并帮助用户在复杂的多租户环境中更高效地管理存储资源。