-
Ceph IAM多租户功能介绍与实践
介 绍
在本文中,我们将探讨如何通过引入 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在多租户环境中的灵活性和安全性得到了显著提升。我们期待这一新功能能够为用户带来更好的体验,并帮助用户在复杂的多租户环境中更高效地管理存储资源。
如有相关问题,请在文章后面给小编留言,小编安排作者第一时间和您联系,为您答疑解惑。