Ceph IAM多租户功能介绍与实践

存储 存储架构
在本文中,我们将探讨如何通过引入 IAM 账户来提升 Ceph 的多租户功能。Ceph 是一个开源的分布式存储系统,广泛用于大规模数据存储,提供高性能和高可靠性。随着多租户需求的增加,在 Ceph Squid 版本中,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在多租户环境中的灵活性和安全性得到了显著提升。我们期待这一新功能能够为用户带来更好的体验,并帮助用户在复杂的多租户环境中更高效地管理存储资源。

责任编辑:武晓燕 来源: 新钛云服
相关推荐

2020-10-16 08:57:51

云平台之多租户的实践

2020-09-15 07:00:00

SaaS架构架构

2024-06-11 12:35:50

2018-07-18 13:29:38

云计算云平台企业

2025-01-09 14:39:40

2021-05-06 21:26:00

BcacheCeph存储

2021-12-01 09:00:00

公共云云计算服务器

2023-11-06 08:26:11

Spring微服务架构

2021-11-22 16:21:28

Kubernetes 运维开源

2015-01-12 15:26:42

Cephweb管理云平台

2023-01-03 07:57:27

2022-07-08 08:07:14

SpringJavaMail

2022-06-20 09:09:26

IDaaSIAM身份即服务

2013-10-15 09:11:26

多租户云计算Overlay

2015-04-02 11:04:27

云应用SaaSOFBIZ

2015-08-12 15:46:02

SaaS多租户数据存储

2022-09-13 07:14:29

云计算SaaS多租户

2012-09-19 13:32:17

Windows Azu云主机服务Windows Ser
点赞
收藏

51CTO技术栈公众号