9.16. Identity and Access Management (IAM) (技术预览)


重要

Identity and Access Management (IAM)功能只是一个技术预览功能。红帽产品服务级别协议(SLA)不支持技术预览功能,且其功能可能并不完善,因此红帽不建议在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。如需了解更多详细信息,请参阅红帽技术预览功能的支持范围。

Ceph 对象网关支持用户帐户作为可选功能,以启用用户、组和角色(IAM)中的自助服务管理。

帐户 root 用户

每个帐户都由帐户 root 用户管理。与普通用户和角色一样,管理员必须使用 radosgw-admin 或 Admin Ops API 创建帐户和帐户 root 用户。帐户 root 用户对帐户拥有的所有资源具有默认权限。root 用户的凭证(访问和 secret 密钥)可以与 Ceph 对象网关 IAM API 一起使用,以创建用于 Ceph 对象网关 S3 API 的额外 IAM 用户和角色,以及管理其关联的访问密钥和策略。

建议帐户所有者仅使用此帐户 root 用户进行管理,并创建对特定应用程序的精细权限。

注意

虽然帐户 root 用户不需要 IAM 策略访问帐户中的资源,但可以添加拒绝其访问权限的策略。请谨慎使用 Deny 语句。

资源所有权

当正常(非帐户)用户创建存储桶并上传对象时,这些资源归用户所有。用户作为所有者和组和授权的关联 S3 ACL 名称,这些存储桶仅对 s3:ListBuckets 请求中的所属用户可见。相反,当用户或角色属于帐户时,其创建的资源由帐户本身所有。关联的 S3 ACL 将帐户 id 命名为 owner 和 grantee,这些存储桶对 s3:ListBuckets 请求可见,由该帐户中的任何用户或角色发送。

由于资源归帐户而不是其用户所有,因此所有用量统计和配额强制都作为整个帐户(而不是其个人用户)应用到帐户。

帐户 ID

帐户标识符可以在多个位置使用,否则接受用户 ID 或租户名称,因此帐户 ID 使用特殊格式来避免不确定性:字符串 RGW 后跟 17 个数字,如 RGW33567154695143645。如果未指定帐户,则这种格式中的帐户 ID 会在帐户创建时随机生成。

帐户 ID 通常在 IAM 策略文档的 Amazon 资源名称(ARN)中找到。例如,arn:aws:iam::RGW33567154695143645:user/A 代表该帐户中名为 A 的 IAM 用户。Ceph 对象网关也支持该位置中的租户名称。帐户 ID 也可以用于 ACL 中类型为 CanonicalUser 的授予者。此处还支持用户 ID。

IAM 策略

虽然非帐户用户默认允许创建存储桶并上传对象,但帐户用户完全在没有权限的情况下启动。在 IAM 用户可以执行 API 操作前,必须添加一些策略才能允许它。帐户 root 用户可以以多种方式向其用户添加身份策略。使用 iam:PutUserPolicyiam:AttachUserPoliicy 操作直接向用户添加策略。使用 iam:PutGroupPolicyiam:AttachGroupPoliicy 操作创建一个 IAM 组并添加组策略。添加到具有 iam:AddUserToGroup 操作的组的用户将继承组的所有策略。创建一个 IAM 角色,并使用 iam:PutRolePolicy 和 iam:AttachRolePoliicy 操作添加角色策略。假设此角色的用户具有sts:AssumeRole 和 sts:AssumeRoleWithWebIdentity 操作,将继承所有角色的策略。这些身份策略根据在单个帐户和跨帐户策略评估逻辑中评估策略的规则进行评估。

主体

策略文档中的"Principal" ARN 是指属于帐户时不同的用户。在帐户之外,用户主体由用户 ID 命名,如 arn:aws:iam:::user/uid 或 arn:aws:iam::tenantname:user/uid,其中 uid 对应于 radosgw-admin 中的-- uid 参数。

在一个帐户中,用户主体使用用户名,如 arn:aws:iam::RGW33567154695143645:user/name,其中 name 对应于 radosgw-admin 中的 --display-name 参数。帐户用户继续与租户表单匹配,以便在将用户迁移到帐户时现有策略将继续工作。

租户隔离

与用户一样,帐户可以选择性地属于租户,以进行存储桶的命名空间隔离。例如,一个名为"acct"的帐户可以存在于租户"a"下,另一个名为"acct"的帐户则存在于租户"b"下。

租户帐户只能包含具有相同租户名称的用户。无论租户如何,帐户 ID 和电子邮件地址都必须全局唯一。

9.16.1. 创建帐户

  • 要创建 IAM 用户,请使用 radosgw-admin 帐户。

    注意

    您必须指定用户 ID 和显示名称。您也可以指定一个电子邮件地址。

    语法

    radosgw-admin account create [--account-name={name}] [--account-id={id}] [--email={email}]

    Example

    radosgw-admin account create --account-name=user1 --account-id=12345 --email=user1@example.com

9.16.2. 创建帐户 root 用户

  • 要创建 IAM 用户,请使用 radosgw-admin user create 命令。

    注意

    您必须指定用户 ID 和显示名称。您也可以指定一个电子邮件地址。root 用户是一个特权 IAM 用户,对帐户具有完全访问权限,并可执行所有操作,包括管理其他用户。

    语法

    radosgw-admin user create --uid={userid} --display-name={name} --account-id={accountid} --account-root --gen-secret --gen-access-key

    Example

    radosgw-admin user create --uid=rootuser1 --display-name="Root User One" --account-id=account123 --account-root --gen-secret --gen-access-key

9.16.3. 删除帐户

  • 要删除 IAM 用户,请使用 radosgw-admin rm 命令。删除用户会从系统中删除用户。

    语法

    radosgw-admin account rm --account-id={accountid}

    Example

    radosgw-admin account rm --account-id=account123

9.16.4. 启用和查看帐户统计信息和配额

您可以检索特定帐户的详细统计信息,如存储使用量和对象计数。您还可以在帐户上定义和启用存储配额,并在帐户中的特定存储桶上设置并启用配额,限制可在该存储桶中存储的最大对象数量。

流程

  • 查看帐户统计信息。

    语法

    radosgw-admin account stats --account-id={accountid} --sync-stats

    Example

    {
      "account": "account123",
      "data_size": 3145728000,        # Total size in bytes (3 GB)
      "num_objects": 12000,           # Total number of objects
      "num_buckets": 5,               # Total number of buckets
      "usage": {
        "total_size": 3145728000,     # Total size in bytes (3 GB)
        "num_objects": 12000
      }
    }

  • 启用帐户配额:

    语法

    radosgw-admin quota set --quota-scope=account --account-id={accountid} --max-size=10G
    radosgw-admin quota enable --quota-scope=account --account-id={accountid}

    Example

    {
      "status": "OK",
      "message": "Quota enabled for account account123"
    }

  • 为帐户启用存储桶配额。

    语法

    radosgw-admin quota set --quota-scope=bucket --account-id={accountid} --max-objects=1000000
    radosgw-admin quota enable --quota-scope=bucket --account-id={accountid}

    Example

    {
      "status": "OK",
      "message": "Quota enabled for bucket in account account123"
    }

  • 要更改 bucket、角色、用户或机密的配额,请使用 account modify 命令。

    Example

    [root@magna045 ~]# radosgw-admin quota set --quota-scope=account --account-id RGW12345678901234568 --max-buckets 10000
    {
        "id": "RGW12345678901234568",
        "tenant": "tenant1",
        "name": "account1",
        "email": "tenataccount1",
        "quota": {
            "enabled": true,
            "check_on_raw": false,
            "max_size": 10737418240,
            "max_size_kb": 10485760,
            "max_objects": 100
        },
        "bucket_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "max_users": 1000,
        "max_roles": 1000,
        "max_groups": 1000,
        "max_buckets": 1000,
        "max_access_keys": 4
    }
    [root@magna045 ~]# radosgw-admin quota enable --quota-scope=account --account-id RGW12345678901234568
    {
        "id": "RGW12345678901234568",
        "tenant": "tenant1",
        "name": "account1",
        "email": "tenataccount1",
        "quota": {
            "enabled": true,
            "check_on_raw": false,
            "max_size": 10737418240,
            "max_size_kb": 10485760,
            "max_objects": 100
        },
        "bucket_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "max_users": 1000,
        "max_roles": 1000,
        "max_groups": 1000,
        "max_buckets": 1000,
        "max_access_keys": 4
    }
    [root@magna045 ~]# radosgw-admin account get --account-id RGW12345678901234568
    {
        "id": "RGW12345678901234568",
        "tenant": "tenant1",
        "name": "account1",
        "email": "tenataccount1",
        "quota": {
            "enabled": true,
            "check_on_raw": false,
            "max_size": 10737418240,
            "max_size_kb": 10485760,
            "max_objects": 100
        },
        "bucket_quota": {
            "enabled": false,
            "check_on_raw": false,
            "max_size": -1,
            "max_size_kb": 0,
            "max_objects": -1
        },
        "max_users": 1000,
        "max_roles": 1000,
        "max_groups": 1000,
        "max_buckets": 1000,
        "max_access_keys": 4
    }
    [root@magna045 ~]#
    
    [root@magna045 ~]# ceph versions
    {
        "mon": {
            "ceph version 19.1.1-63.el9cp (8fa7b56d5e9f208c4233b0a8273665087bded8ae) squid (rc)": 3
        },
        "mgr": {
            "ceph version 19.1.1-63.el9cp (8fa7b56d5e9f208c4233b0a8273665087bded8ae) squid (rc)": 3
        },
        "osd": {
            "ceph version 19.1.1-63.el9cp (8fa7b56d5e9f208c4233b0a8273665087bded8ae) squid (rc)": 9
        },
        "rgw": {
            "ceph version 19.1.1-63.el9cp (8fa7b56d5e9f208c4233b0a8273665087bded8ae) squid (rc)": 3
        },
        "overall": {
            "ceph version 19.1.1-63.el9cp (8fa7b56d5e9f208c4233b0a8273665087bded8ae) squid (rc)": 18
        }
    }

9.16.5. 将现有用户迁移到帐户

您可以使用 radosgw-admin user modify 命令来修改现有 IAM 用户帐户。当您创建与 Ceph 对象网关帐户关联的角色时,您可以使用 radosgw-admin role list-- account-id <RGWaccountID& gt; 命令列出它。

流程

  • 修改现有用户 IAM 帐户:

    语法

    radosgw-admin user modify --uid={userid} --account-id={accountid}

由于帐户用户默认没有权限,因此您需要添加身份策略来恢复用户的原始权限。或者,也可以为每个现有用户创建新帐户。执行此操作时,添加 --account-root 选项,使每个用户成为其帐户的 root 用户。

注意

所有用户 bucket 的所有权都将被传输到帐户。

注意

帐户成员资格为永久。添加后,无法从其帐户中删除用户。

警告

用户通知主题的所有权不会传送到帐户。通知将继续工作,但主题将不再对 SNS 主题 API 可见。

迁移通知主题

只有在启用了 notification_v2 功能时,才支持帐户主题。

当非帐户用户迁移到帐户时,现有的通知主题可以通过 RadosGW admin API 访问,但用户通过 SNS Topic API 丢失对它们的访问。尽管如此,但主题保持正常,但 bucket 通知将继续按预期交付。

重新创建主题 用户应使用相同的名称重新创建主题。旧的主题(现在无法访问)和新的帐户拥有的主题将在不干扰的情况下共存。

更新已订阅至旧用户拥有的主题的 Bucket 通知配置 Bucket 应该更新为使用新的帐户拥有的主题。要防止重复的通知,请维护相同的通知 ID。

例如,如果存储桶的现有通知配置是:

{"TopicConfigurations": [{ "Id": "ID1", "TopicArn": "arn:aws:sns:default::topic1", "Events": ["s3:ObjectCreated:*"]}]}

更新的配置将是:

{"TopicConfigurations": [{ "Id": "ID1", "TopicArn": "arn:aws:sns:default:RGW00000000000000001:topic1", "Events": ["s3:ObjectCreated:*"]}]}

在本例中,RGW000000001 是帐户 ID,topic1 是主题名称,ID1 是通知 ID。

删除旧的 主题 后,没有存储桶订阅旧的用户拥有的主题,管理员也可以删除它们:

$ radosgw-admin topic rm --topic topic1

将用户从非帐户迁移到 RGW 帐户

将用户从非帐户迁移到 RGW 帐户时,请按照以下步骤确保无缝的 IO 迁移和适当的 IAM 配置:

  1. 在用户迁移期间分配 account-root 标志。确保在将用户迁移到帐户时添加 account-root 标志。这会授予用户迁移所需的特权。

    radosgw-admin user modify --uid <user_ID> --account-id <Account_ID> --account-root
  2. 附加 S3 访问策略。迁移用户后,附加适当的 IAM 策略以授予用户 S3 访问权限。在这种情况下,我们会分配 AmazonS3FullAccess 策略。

    radosgw-admin user policy attach --uid <user_ID> --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess
  3. 删除 account-root 特权。在迁移并授予必要的访问权限后,从用户中删除 account-root 特权,以限制其权限的范围。

    radosgw-admin user modify --uid <user_ID> --account-root=0
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.