Ceph 用户管理
参考:https://docs.ceph.com/en/pacific/rados/operations/user-management/
本文档描述Ceph 客户端用户,以及他们使用Ceph 存储集群的身份验证和授权。用户是个人或系统参与者,例如应用程序,它们使用 Ceph 客户端与 Ceph 存储集群守护进程进行交互。
当 Ceph 在启用身份验证和授权(默认启用)的情况下运行时,您必须指定用户名和包含指定用户密钥的密钥环(通常通过命令行)。如果不指定用户名,Ceph 将使用client.admin默认用户名。如果您没有指定密钥环,Ceph 将通过 Ceph 配置中的keyring设置查找密钥环。例如,如果您在未指定用户或密钥环的情况下执行命令:
ceph health
Ceph 对命令的解释如下:
ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health
或者,您可以使用CEPH_ARGS环境变量来避免重新输入用户名和密码。
背景
无论 Ceph 客户端的类型(例如,块设备、对象存储、文件系统、原生 API 等)如何,Ceph 都将所有数据作为对象存储在池中。Ceph 用户必须有权访问池才能读取和写入数据。此外,Ceph 用户必须具有执行权限才能使用 Ceph 的管理命令。以下概念将帮助您了解 Ceph 用户管理。
用户
用户可以是个人,也可以是系统参与者,例如应用程序。创建用户允许您控制谁(或什么)可以访问您的 Ceph 存储集群、它的池以及池中的数据。
Ceph 有一个type用户的概念。出于用户管理的目的,类型将始终为client。 Ceph 以句点 (.) 分隔的形式识别用户,由用户类型和用户 ID 组成:例如, TYPE.ID、client.admin或client.user1。用户键入类型的原因是 Ceph 监视器、OSD 和元数据服务器也使用 Cephx 协议,但它们不是客户端。区分用户类型有助于区分客户端用户和其他用户——简化访问控制、用户监控和可追溯性。
有时 Ceph 的用户类型可能看起来令人困惑,因为 Ceph 命令行允许您根据您的命令行使用情况指定有或没有类型的用户。如果指定--user 或 --id,则可以省略类型。所以client.user1可以简单地输入为user1。如果指定 --name或-n,则必须指定类型和名称,例如 client.user1。我们建议尽可能使用类型和名称作为最佳实践。
授权(能力)
Ceph 使用术语“能力”(caps)来描述授权经过身份验证的用户行使监视器、OSD 和元数据服务器的功能。功能还可以根据应用程序标签限制对池中的数据、池中的命名空间或一组池的访问。Ceph 管理用户在创建或更新用户时设置用户的能力。
能力语法遵循以下形式:
{daemon-type} '{cap-spec}[, {cap-spec} ...]'
- 监视器:监视器功能包括r、w、x访问设置或profile {name}。例如:
mon 'allow {access-spec} [network {network/prefix}]'
mon 'profile {name}'
{access-spec}语法如下:
* | all | [r][w][x]
可选的{network/prefix}是 CIDR 表示法中的标准网络名称和前缀长度(例如,10.3.0.0/16)。如果存在,则此功能的使用仅限于从该网络连接的客户端。
- OSD: OSD 功能包括r、w、x、class-read、 class-write访问设置或profile {name}. 此外,OSD 功能还允许设置池和命名空间。
osd 'allow {access-spec} [{match-spec}] [network {network/prefix}]'
osd 'profile {name} [pool={pool-name} [namespace={namespace-name}]] [network {network/prefix}]'
{access-spec}语法是以下之一:
* | all | [r][w][x] [class-read] [class-write]
class {class name} [{method name}]
可选的{match-spec}语法是以下之一:
pool={pool-name} [namespace={namespace-name}] [object_prefix {prefix}]
[namespace={namespace-name}] tag {application} {key}={value}
可选的{network/prefix}是 CIDR 表示法中的标准网络名称和前缀长度(例如,10.3.0.0/16)。如果存在,则此功能的使用仅限于从该网络连接的客户端。
- Manager Caps: Manager ( ceph-mgr) 功能包括 r、w、x访问设置或profile {name}。例如:
mgr 'allow {access-spec} [network {network/prefix}]'
mgr 'profile {name} [{key1} {match-type} {value1} ...] [network {network/prefix}]'
还可以为特定命令、内置管理器服务导出的所有命令或特定附加模块导出的所有命令指定管理器功能。例如:
mgr 'allow command "{command-prefix}" [with {key1} {match-type} {value1} ...] [network {network/prefix}]'
mgr 'allow service {service-name} {access-spec} [network {network/prefix}]'
mgr 'allow module {module-name} [with {key1} {match-type} {value1} ...] {access-spec} [network {network/prefix}]'
{access-spec}语法如下:
* | all | [r][w][x]
{service-name}是以下之一:
mgr | osd | pg | py
{match-type}是以下之一:
= | prefix | regex
- 元数据服务器:对于管理员,请使用allow *. 对于所有其他用户,例如 CephFS 客户端,请参阅CephFS 客户端功能。
Ceph 对象网关守护进程 ( radosgw) 是 Ceph 存储集群的客户端,因此它不表示为 Ceph 存储集群守护进程类型。
池
池是用户存储数据的逻辑分区。在 Ceph 部署中,通常会创建一个池作为类似类型数据的逻辑分区。例如,当将 Ceph 部署为 OpenStack 的后端时,典型的部署将具有用于存储卷、映像、备份和虚拟机的池,以及诸如client.glance 、client.cinder 等用户的池。
应用标签
访问权限可能仅限于由其应用程序元数据定义的特定池。通配符 * 可用于key参数、 value参数或两者。all是 * 的同义词。
命名空间
池中的对象可以关联到命名空间——池中的一组逻辑对象。用户对池的访问可以与命名空间相关联,这样用户的读写操作仅发生在命名空间内。写入池中命名空间的对象只能由有权访问该命名空间的用户访问。
命名空间的基本原理是,池可能是一种计算成本高昂的分离数据集的方法,目的是授权单独的用户集。例如,一个池的每个 OSD 应该有大约 100 个归置组。因此,具有 1000 个 OSD 的示例集群将有 100,000 个归置组用于一个池。每个池将在示例集群中创建另外 100,000 个归置组。相比之下,将对象写入命名空间只是将命名空间与对象名称相关联,而没有单独池的计算开销。您可以使用命名空间,而不是为一个用户或一组用户创建一个单独的池。注意:目前只能使用librados。
使用该功能可以将访问限制在特定的 RADOS 名称空间namespace 。支持有限的名称空间;如果指定命名空间的最后一个字符是*,则授予对以提供的参数开头的任何命名空间的访问权限。
管理用户
用户管理功能为 Ceph 存储集群管理员提供了直接在 Ceph 存储集群中创建、更新和删除用户的能力。
在 Ceph 存储集群中创建或删除用户时,您可能需要将密钥分发给客户端,以便将它们添加到密钥环中。
列出用户
要列出集群中的用户,请执行以下命令:
ceph auth ls
Ceph 将列出集群中的所有用户。例如,在一个两节点示例集群中,将输出如下所示的内容:
installed auth entries:
osd.0
key: AQCvCbtToC6MDhAATtuT70Sl+DymPCfDSsyV4w==
caps: [mon] allow profile osd
caps: [osd] allow *
osd.1
key: AQC4CbtTCFJBChAAVq5spj0ff4eHZICxIOVZeA==
caps: [mon] allow profile osd
caps: [osd] allow *
client.admin
key: AQBHCbtT6APDHhAA5W00cBchwkQjh3dkKsyPjw==
caps: [mds] allow
caps: [mon] allow *
caps: [osd] allow *
client.bootstrap-mds
key: AQBICbtTOK9uGBAAdbe5zcIGHZL3T/u2g6EBww==
caps: [mon] allow profile bootstrap-mds
client.bootstrap-osd
key: AQBHCbtT4GxqORAADE5u7RkpCN/oo4e5W0uBtw==
caps: [mon] allow profile bootstrap-osd
请注意,用户的TYPE.ID表示法适用于类型为osd.0的用户,osd其 ID 为0,client.admin类型为用户, client其 ID 为admin(即默认client.admin用户)。另请注意,每个条目都有一个key:
您可以使用-o {filename}选项将输出保存到文件中。
获取用户
要检索特定用户、密钥和功能,请执行以下操作:
ceph auth get {TYPE.ID}
例如:
ceph auth get client.admin
您也可以使用-o {filename}选项将输出保存到文件中。开发人员还可以执行以下操作:
ceph auth export {TYPE.ID}
该命令与 auth get 相同。
添加用户
添加用户会创建用户名(即TYPE.ID)、密钥以及用于创建用户的命令中包含的任何功能。
用户的密钥使用户能够通过 Ceph 存储集群进行身份验证。mon用户的能力授权用户在 Ceph 监视器 ( )、Ceph OSD ( osd) 或 Ceph 元数据服务器 ( )上读取、写入或执行mds。
添加用户有几种方法:
-
ceph auth add:此命令是添加用户的规范方法。它将创建用户、生成密钥并添加任何指定的功能。
-
ceph auth get-or-create:此命令通常是创建用户最方便的方法,因为它返回带有用户名(在括号中)和密钥的密钥文件格式。如果用户已经存在,则此命令仅以密钥文件格式返回用户名和密钥。您可以使用-o {filename}选项将输出保存到文件中。
-
ceph auth get-or-create-key:此命令是创建用户并仅仅返回用户密钥的便捷方式。这对于只需要密钥的客户端(例如,libvirt)很有用。如果用户已经存在,此命令只返回密钥。您可以使用-o {filename}选项将输出保存到文件中。
创建客户端用户时,您可能会创建一个没有能力的用户。没有能力的用户除了身份验证之外毫无用处,因为客户端无法从监视器中检索集群映射。但是,如果您希望稍后使用ceph auth caps命令延迟添加功能,则可以创建一个没有功能的用户。
一个典型的用户至少在 Ceph 监视器上具有读取能力,在 Ceph OSD 上具有读写能力。此外,用户的 OSD 权限通常仅限于访问特定池。
ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool'
ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool'
ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring
ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key
重要:如果您为用户提供 OSD 的功能,但您不限制对特定池的访问,则该用户将有权访问集群中的所有池!
修改用户能力
ceph auth caps命令允许您指定用户并更改用户的能力。设置新功能将覆盖当前功能。要查看当前功能,请运行ceph auth get USERTYPE.USERID。要添加功能,您还应该在使用表单时指定现有功能:
ceph auth caps USERTYPE.USERID {daemon} 'allow [r|w|x|*|...] [pool={pool-name}] [namespace={namespace-name}]' [{daemon} 'allow [r|w|x|*|...] [pool={pool-name}] [namespace={namespace-name}]']
例如:
ceph auth get client.john
ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool'
ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool'
ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'
删除用户
要删除用户,请使用:
ceph auth del {TYPE}.{ID}
其中{TYPE}是client 、osd 、 mon或mds 之一,并且{ID}是守护程序的用户名或 ID。
打印用户密钥
要将用户的身份验证密钥打印到标准输出,请执行以下命令:
ceph auth print-key {TYPE}.{ID}
其中{TYPE}是client 、osd 、 mon或mds 之一,并且{ID}是守护程序的用户名或 ID。
当您需要使用用户密钥(例如,libvirt)填充客户端软件时,打印用户密钥很有用。
mount -t ceph serverhost:/ mountpoint -o name=client.user,secret=`ceph auth print-key client.user`
导入用户
要导入一个或多个用户,请使用ceph auth import并指定一个密钥环:
ceph auth import -i /path/to/keyring
例如:
sudo ceph auth import -i /etc/ceph/ceph.keyring
Ceph 存储集群将添加新用户、他们的密钥和他们的能力,并将更新现有用户、他们的密钥和他们的能力。
密钥环管理
当您通过 Ceph 客户端访问 Ceph 时,Ceph 客户端将查找本地密钥环。Ceph默认使用以下四个密钥环名称预设设置keyring,因此您不必在 Ceph 配置文件中设置它们,除非您想覆盖默认值(不推荐):
/etc/ceph/$cluster.$name.keyring
/etc/ceph/$cluster.keyring
/etc/ceph/keyring
/etc/ceph/keyring.bin
元变量$cluster是您的Ceph 集群名称,由 Ceph 配置文件的名称定义(即,ceph.conf表示集群名称是ceph;因此,ceph.keyring)。元变量$name是用户类型和用户 ID(例如,client.admin;因此,ceph.client.admin.keyring)。
创建用户(例如client.ringo)后,您必须获取密钥并将其添加到 Ceph 客户端上的密钥环中,以便用户可以访问 Ceph 存储集群。
用户管理部分详细介绍了如何在Ceph 存储集群中直接列出、获取、添加、修改和删除用户。但是,Ceph 还提供了 ceph-authtool 实用程序,允许您从 Ceph 客户端管理密钥环。
创建密钥环
当您使用管理用户部分中的过程创建用户时,您需要向 Ceph 客户端提供用户密钥,以便 Ceph 客户端可以检索指定用户的密钥并通过 Ceph 存储集群进行身份验证。Ceph 客户端访问密钥环以查找用户名并检索用户的密钥。
该ceph-authtool实用程序允许您创建密钥环。要创建一个空密钥环,请使用--create-keyring或-C。例如:
ceph-authtool --create-keyring /path/to/keyring
在创建多用户密钥环时,我们建议使用集群名称(例如,$cluster.keyring)作为密钥环文件名并将其保存在 /etc/ceph目录中,以便keyring配置默认设置将获取文件名,而无需您在本地副本中指定它你的 Ceph 配置文件。例如,通过执行以下命令创建ceph.keyring:
sudo ceph-authtool -C /etc/ceph/ceph.keyring
使用单个用户创建密钥环时,我们建议使用集群名称、用户类型和用户名并将其保存在/etc/ceph目录中。例如,对于client.admin用户,为ceph.client.admin.keyring。
要在 /etc/ceph 中创建密钥环,您必须这样做。这意味着该文件将仅对用户root具有rw权限,这在密钥环包含管理员密钥时是合适的。但是,如果您打算将密钥环用于特定用户或用户组,请确保您执行chown或chmod建立适当的密钥环所有权和访问权限。
将用户添加到密钥环
将 用户添加到 Ceph 存储集群时,可以使用获取用户过程来检索用户、密钥和功能,并将用户保存到密钥环。
当您只想为每个密钥环使用一个用户时,带有-o选项的获取用户过程将以密钥环文件格式保存输出。例如,要为client.admin用户创建密钥环,请执行以下命令:
sudo ceph auth get client.admin -o /etc/ceph/ceph.client.admin.keyring
请注意,我们为单个用户使用推荐的文件格式。
当您要将用户导入密钥环时,可以使用ceph-authtool 指定目标密钥环和源密钥环。例如:
sudo ceph-authtool /etc/ceph/ceph.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring
创建用户
Ceph 提供了添加用户功能,可以直接在 Ceph 存储集群中创建用户。但是,您也可以直接在 Ceph 客户端密钥环上创建用户、密钥和功能。然后,您可以将用户导入 Ceph 存储集群。例如:
sudo ceph-authtool -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.keyring
您还可以创建密钥环并同时将新用户添加到密钥环。例如:
sudo ceph-authtool -C /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' --gen-key
在上述场景中,新用户client.ringo仅在密钥环中。要将新用户添加到 Ceph 存储集群,您仍必须将新用户添加到 Ceph 存储集群。
sudo ceph auth add client.ringo -i /etc/ceph/ceph.keyring
修改用户
要修改密钥环中用户记录的能力,请指定密钥环和用户,然后是能力。例如:
sudo ceph-authtool /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx'
要将用户更新到 Ceph 存储集群,您必须将密钥环中的用户更新为 Ceph 存储集群中的用户条目。
sudo ceph auth import -i /etc/ceph/ceph.keyring
有关从密钥环更新 Ceph 存储集群用户的详细信息,请参阅导入用户。
您也可以直接在集群中修改用户能力,将结果存储到密钥环文件中;然后,将密钥环导入您的主 ceph.keyring 文件。
命令行用法
Ceph 支持以下用户名和密码用法:
- --id|--user
描述:Ceph 使用类型和 ID(例如,TYPE.ID或 client.admin,client.user1)来识别用户。id,name 和 -n 选项使您能够指定用户名id的ID 部分(例如,admin、user1、foo等 )。您可以使用 --id 指定用户并省略类型。例如,要指定用户 client.foo,请输入以下内容:
ceph --id foo --keyring /path/to/keyring health
ceph --user foo --keyring /path/to/keyring health
- --name|-n
描述:Ceph 使用类型和 ID(例如,TYPE.ID或 client.admin,client.user1)来识别用户。--name 和 -n 选项使您能够指定完全限定的用户名。您必须为用户 ID 指定用户类型(通常为client)。例如:
ceph --name client.foo --keyring /path/to/keyring health
ceph -n client.foo --keyring /path/to/keyring health
- --keyring
描述:包含一个或多个用户名和密码的密钥环的路径。该--secret选项提供了相同的功能,但它不适用于 --secret用于其他目的的 Ceph RADOS 网关。您可以检索密钥环 ceph auth get-or-create 并将其存储在本地。这是首选方法,因为您可以在不切换密钥环路径的情况下切换用户名。例如:
sudo rbd map --id foo --keyring /path/to/keyring mypool/myimage
限制
该cephx协议相互验证 Ceph 客户端和服务器。它不旨在处理人类用户或代表他们运行的应用程序的身份验证。如果需要这种效果来处理您的访问控制需求,您必须有另一种机制,它可能特定于用于访问 Ceph 对象存储的前端。这种其他机制的作用是确保只有可接受的用户和程序才能在 Ceph 允许访问其对象存储的机器上运行。
用于验证 Ceph 客户端和服务器的密钥通常存储在受信任主机中具有适当权限的纯文本文件中。
重要:将密钥存储在明文文件中存在安全缺陷,但鉴于 Ceph 在后台使用的基本身份验证方法,它们很难避免。那些设置 Ceph 系统的人应该意识到这些缺点。
特别是,任意用户机器,尤其是便携式机器,不应配置为直接与 Ceph 交互,因为这种使用模式需要在不安全的机器上存储明文身份验证密钥。任何偷走该机器或秘密访问该机器的人都可以获得允许他们向 Ceph 验证自己的机器的密钥。
与其允许可能不安全的机器直接访问 Ceph 对象存储,不如要求用户使用为您的目的提供足够安全性的方法登录到您环境中的受信任机器。该受信任的机器将为人类用户存储明文 Ceph 密钥。Ceph 的未来版本可能会更全面地解决这些特定的身份验证问题。
目前,没有任何 Ceph 身份验证协议为传输中的消息提供保密性。因此,网络上的窃听者可以听到并理解 Ceph 中客户端和服务器之间发送的所有数据,即使它无法创建或更改它们。此外,Ceph 不包括在对象存储中加密用户数据的选项。当然,用户可以手动加密并将自己的数据存储在 Ceph 对象存储中,但 Ceph 本身不提供执行对象加密的功能。那些在 Ceph 中存储敏感数据的人应该考虑在将数据提供给 Ceph 系统之前对其进行加密。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!