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

Daniel Parkes, Anthony D'Atri (IBM)

简介

在大型对象存储系统中,高效的多租户环境管理至关重要。在 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 对社区的支持,为我们提供时间来创建这些帖子。