注意
本文档适用于 Ceph 的开发版本。
用户管理
本文档描述了Ceph 客户端用户,并描述了他们执行身份验证和授权以访问Ceph 存储集群的过程。用户可以是个人或系统角色(例如应用程序),他们使用 Ceph 客户端与 Ceph 存储集群守护程序进行交互。
当 Ceph 在启用身份验证和授权的情况下运行时(默认都启用),你必须指定一个用户名和一个包含指定用户密钥的密钥环(通常通过命令行指定)。如果你未指定用户名,Ceph 将使用 client.admin 作为默认用户名。如果你未指定密钥环,Ceph 将通过 Ceph 配置中的 keyring 设置来查找密钥环。例如,如果你执行 ceph health 命令而未指定用户或密钥环,Ceph 将假定密钥环位于 /etc/ceph/ceph.client.admin.keyring 并尝试使用该密钥环。下面说明了这种行为
ceph health
Ceph 将按如下方式解释该命令
ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health
或者,你可以使用 CEPH_ARGS 环境变量来避免重复输入用户名和密钥。
有关配置 Ceph 存储集群以使用身份验证的详细信息,请参阅CephX 配置参考。有关 Cephx 架构的详细信息,请参阅高可用性身份验证。
背景
无论使用哪种类型的 Ceph 客户端(例如:块设备、对象存储、文件系统、原生 API),Ceph 都将所有数据存储为 池中的 RADOS 对象。Ceph 用户必须有权访问给定的池才能读取和写入数据,并且 Ceph 用户必须具有执行权限才能使用 Ceph 的管理命令。以下概念将帮助你理解 Ceph[的]用户管理。
用户
用户可以是个人或系统角色(例如应用程序)。创建用户允许你控制谁(或什么)可以访问你的 Ceph 存储集群、它的池以及这些池中的数据。
Ceph 具有用户 type 的概念。出于用户管理的目的,类型将始终是 client。Ceph 以“句点分隔形式”识别用户,该形式由用户类型和用户 ID 组成:例如 TYPE.ID、client.admin 或 client.user1。使用用户类型的原因是 Cephx 协议不仅被客户端使用,也被非客户端(例如 Ceph Monitors、OSD 和 Metadata Servers)使用。区分用户类型有助于区分客户端用户和其他用户。这种区分简化了访问控制、用户监控和可追溯性。
有时 Ceph 的用户类型可能看起来令人困惑,因为 Ceph 命令行允许你指定带或不带类型的用户,具体取决于你的命令行用法。如果你指定 --user 或 --id,你可以省略类型。例如,client.user1 可以简单地输入为 user1。另一方面,如果你指定 --name 或 -n,你必须提供类型和名称:例如 client.user1。我们建议尽可能使用类型和名称作为最佳实践。
注意
Ceph 存储集群用户与 Ceph 对象存储用户或 Ceph 文件系统用户不同。Ceph 对象网关使用 Ceph 存储集群用户在网关守护程序和存储集群之间进行通信,但 Ceph 对象网关有其自己的针对最终用户的用户管理功能。Ceph 文件系统使用 POSIX 语义,与 Ceph 文件系统关联的用户空间与与 Ceph 存储集群用户关联的用户空间不同。
池
池是用户存储数据的逻辑分区。在 Ceph 部署中,通常创建一个池作为类似类型数据的逻辑分区。例如,当将 Ceph 部署为 OpenStack 后端时,典型的部署将为卷、镜像、备份和虚拟机设置池,以及诸如 client.glance 和 client.cinder 之类的用户。
命名空间
池中的对象可以与命名空间相关联:即与池中对象的逻辑组相关联。用户对池的访问可以与命名空间相关联,以便用户进行的读取和写入只能在命名空间内进行。写入到池中命名空间的对象只能由有权访问该命名空间的用户访问。
注意
命名空间主要用于在 librados 之上编写的应用程序。在这种情况下,命名空间提供的逻辑分组可以避免创建不同池的需要。在 Luminous 及更高版本中,Ceph 对象网关将命名空间用于各种元数据对象。
命名空间的基本原理是:命名空间的计算开销相对低于池,池是一种在不同授权用户之间隔离数据集的计算开销大的方法。
例如,一个池应该托管大约 100 个 OSD 的放置组副本。这意味着一个拥有 1000 个 OSD 和三个 3R 复制池的集群将(在一个池中)拥有 100,000 个放置组副本,这意味着它有 33,333 个放置组。
相比之下,将对象写入命名空间只是将命名空间与对象名称相关联,而不会产生单独池的计算开销。你可以使用命名空间,而不是为用户或一组用户创建单独的池。
注意
命名空间仅在使用 librados 时可用。
可以使用 namespace capability 限制对特定 RADOS 命名空间的访问。支持有限的命名空间通配(即使用通配符 (*)):如果指定命名空间的最后一个字符是 *,则授予访问权限给以提供参数开头的任何命名空间。
管理用户
用户管理功能为 Ceph 存储集群管理员提供了直接在 Ceph 存储集群中创建、更新和删除用户的能力。
当你在 Ceph 存储集群中创建或删除用户时,你可能需要将密钥分发给客户端,以便将它们添加到密钥环中。有关详细信息,请参阅密钥环管理。
列出用户
要列出集群中的用户,请运行以下命令
ceph auth ls
Ceph 将列出集群中的所有用户。例如,在双节点集群中,ceph auth ls 将提供类似于以下的输出
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: <value> 条目,并且还具有一个或多个 caps: 条目。
要将 ceph auth ls 的输出保存到文件中,请使用 -o {filename} 选项。
获取用户
要检索特定用户、密钥和 capabilities,请运行以下命令
ceph auth get {TYPE.ID}
例如
ceph auth get client.admin
要将 ceph auth get 的输出保存到文件中,请使用 -o {filename} 选项。开发人员也可以运行以下命令
ceph auth export {TYPE.ID}
auth export 命令与 auth get 相同。
添加用户
添加用户将创建一个用户名(即 TYPE.ID)、一个密钥以及在创建用户的命令中指定的任何 capabilities。
用户的密钥允许用户使用 Ceph 存储集群进行身份验证。用户的 capabilities 授权用户在 Ceph monitors (mon)、Ceph OSD (osd) 或 Ceph Metadata Servers (mds) 上进行读取、写入或执行。
有几种方法可以添加用户
ceph auth add:此命令是添加用户的规范方式。它将创建用户、生成密钥并添加任何指定的 capabilities。ceph auth get-or-create:此命令通常是创建用户最方便的方式,因为它返回一个包含用户名(在括号中)和密钥的 keyfile 格式。如果用户已存在,此命令只会返回 keyfile 格式的用户名和密钥。要将输出保存到文件中,请使用-o {filename}选项。ceph auth get-or-create-key:此命令是创建用户并仅返回用户密钥的便捷方式。这对于只需要密钥的客户端(例如 libvirt)很有用。如果用户已存在,此命令只会返回密钥。要将输出保存到文件中,请使用-o {filename}选项。
在创建客户端用户时,可以创建没有 capabilities 的用户。没有 capabilities 的用户除了身份验证之外毫无用处,因为客户端无法从 monitor 检索集群 map。但是,你可能希望创建一个没有 capabilities 的用户,稍后使用 ceph auth caps 命令为该用户添加 capabilities。
典型的用户至少具有对 Ceph monitor 的读取 capabilities 和对 Ceph OSD 的读取和写入 capabilities。用户的 OSD 权限通常受到限制,以便用户只能访问一个特定的池。在以下示例中,命令 (1) 添加一个名为 john 的客户端,该客户端具有对 Ceph monitor 的读取 capabilities 和对名为 liverpool 的池的读取和写入 capabilities,(2) 授权名为 paul 的客户端具有对 Ceph monitor 的读取 capabilities 和对名为 liverpool 的池的读取和写入 capabilities,(3) 授权名为 george 的客户端具有对 Ceph monitor 的读取 capabilities 和对名为 liverpool 的池的读取和写入 capabilities,并使用名为 george.keyring 的密钥环进行此授权,以及 (4) 授权名为 ringo 的客户端具有对 Ceph monitor 的读取 capabilities 和对名为 liverpool 的池的读取和写入 capabilities,并使用名为 ringo.key 的密钥进行此授权
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 具有 capabilities 的用户都将有权访问集群中的所有池,除非该用户的访问权限已被限制为集群中池的适当子集。
修改用户 Capabilities
ceph auth caps 命令允许你指定一个用户并更改该用户的 capabilities。设置新的 capabilities 将覆盖当前的 capabilities。要查看当前的 capabilities,请运行 ceph auth get USERTYPE.USERID。要添加 capabilities,请运行以下形式的命令(并确保指定现有 capabilities)
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 *'
有关 capabilities 的更多详细信息,请参阅授权(Capabilities)。
删除用户
要删除用户,请使用 ceph auth del
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 存储集群将添加新用户、他们的密钥和 capabilities,并将更新现有用户、他们的密钥和 capabilities。
密钥环管理
当你通过 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 配置文件名为 ceph.conf,则你的 Ceph 集群名称为 ceph,上面的第二个名称将是 ceph.keyring。 $name 元变量是用户类型和用户 ID:例如,给定用户 client.admin,上面的第一个名称将是 ceph.client.admin.keyring。
注意
当运行读取或写入 /etc/ceph 的命令时,你可能需要使用 sudo 以 root 身份运行命令。
创建用户(例如 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 身份执行此操作。这意味着该文件将只有 root 用户具有 rw 权限,这在密钥环包含管理员密钥时是适当的。但是,如果你打算将密钥环用于特定用户或用户组,请务必使用 chown 或 chmod 来建立适当的密钥环所有权和访问权限。
将用户添加到密钥环
当你将 用户添加到 Ceph 存储集群时,你可以使用 获取用户过程检索用户、密钥和 capabilities,然后将用户保存到密钥环中。
如果你想每个密钥环只使用一个用户,带有 -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 客户端密钥环上创建用户、密钥和 capabilities,然后将用户导入 Ceph 存储集群。例如
sudo ceph-authtool -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.keyring
有关 capabilities 的更多详细信息,请参阅授权(Capabilities)。
你也可以同时创建密钥环并将新用户添加到密钥环中。例如
sudo ceph-authtool -C /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' --gen-key
在上述示例中,新用户 client.ringo 仅被添加到密钥环中。新用户尚未被添加到 Ceph 存储集群中。
要将新用户 client.ringo 添加到 Ceph 存储集群,请运行以下命令
sudo ceph auth add client.ringo -i /etc/ceph/ceph.keyring
修改用户
要修改密钥环中用户记录的 capabilities,请指定密钥环和用户,然后指定 capabilities。例如
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 存储集群用户的详细信息,请参阅导入用户
你也可以直接在集群中修改用户 capabilities,将结果存储到密钥环文件中,然后将密钥环导入到你的主 ceph.keyring 文件中。
密钥轮换
要轮换实体的密钥,请使用
ceph auth rotate <entity>
这避免了在密钥受到威胁、丢失或安排轮换时删除和重新创建实体的需要。
命令行用法
Ceph 支持以下用于用户名和密钥的用法
--id | --user
- 描述:
Ceph 使用类型和 ID 来识别用户:此用户标识的形式是
TYPE.ID,类型和 ID 的示例是client.admin和client.user1。id、name和-n选项允许你指定用户名的 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,类型和 ID 的示例是client.admin和client.user1。--name和-n选项允许你指定完全限定的用户名。你需要指定用户类型(通常是client)和用户 ID。例如ceph --name client.foo --keyring /path/to/keyring health ceph -n client.foo --keyring /path/to/keyring health
--keyring
- 描述:
包含一个或多个用户名和密钥的密钥环的路径。
--secret选项提供相同的功能,但它不适用于 Ceph RADOS Gateway,后者将--secret用于其他目的。你可以使用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 系统之前对其进行加密。