30 cephx
身份验证 #
为了识别客户端并防范中间人攻击,Ceph 提供了 cephx
身份验证系统。在此环境中,客户端表示人类用户(例如 admin 用户)或 Ceph 相关的服务/守护进程(例如 OSD、Monitor 或对象网关)。
cephx
协议不会处理 TLS/SSL 之类的传输中数据加密。
30.1 身份验证体系结构 #
cephx
使用共享秘密密钥进行身份验证,这意味着客户端和 Ceph Monitor 都有客户端秘密密钥的副本。身份验证协议可让双方互相证明各自持有密钥的副本,且无需真正透露密钥。这样就实现了相互身份验证,即,集群可确保用户拥有秘密密钥,而用户亦可确保集群持有秘密密钥的副本。
Ceph 的一项重要可伸缩性功能就是可免于通过集中式界面与 Ceph 对象存储交互。这意味着,Ceph 客户端可直接与 OSD 交互。为了保护数据,Ceph 提供了 cephx
身份验证系统来对 Ceph 客户端进行身份验证。
每个 Monitor 都可对客户端进行身份验证并分发密钥,因此,在使用 cephx
时,不会出现单一故障点或瓶颈。Monitor 会返回身份验证数据结构,其中包含获取 Ceph 服务时要用到的会话密钥。此会话密钥本身已使用客户端的永久秘密密钥进行了加密,因此,只有客户端才能向 Ceph Monitor 请求服务。然后,客户端使用会话密钥向 Monitor 请求所需的服务,Monitor 会为客户端提供一个票据,用于向实际处理数据的 OSD 验证客户端身份。Ceph Monitor 和 OSD 共享一个机密,因此,客户端使用 Monitor 提供的票据向集群中的任何 OSD 或元数据服务器表明身份。cephx
票据有失效时间,因此,攻击者无法使用已失效的票据或以不当方式获取的会话密钥。
要使用 cephx
,管理员必须先设置客户端/用户。在下图中,client.admin
用户从命令行调用 ceph auth get-or-create-key
来生成用户名和秘密密钥。Ceph 的 auth
子系统会生成该用户名和密钥,在 Monitor 中存储一个副本,并将该用户的机密传回给 client.admin
用户。这意味着,客户端和 Monitor 共享一个秘密密钥。
cephx
身份验证 #要在 Monitor 中进行身份验证,客户端需将用户名传递给 Monitor。Monitor 会生成一个会话密钥,并使用与该用户名关联的秘密密钥来加密该会话密钥,然后将加密的票据传回给客户端。之后,客户端会使用共享的秘密密钥解密数据,以获取会话密钥。会话密钥可识别当前会话的用户。然后,客户端请求与该用户相关、由会话密钥签名的票据。Monitor 会生成一个票据,使用用户的秘密密钥进行加密,然后将其传回给客户端。客户端解密该票据,并使用它对发往整个集群中的 OSD 和元数据服务器的请求进行签名。
cephx
authentication #
cephx
协议会对客户端计算机与 Ceph 服务器之间进行的通讯进行身份验证。完成初始身份验证后,将使用 Monitor、OSD 和元数据服务器可通过共享密钥进行校验的票据,来对客户端与服务器之间发送的每条消息进行签名。
cephx
身份验证 - MDS 和 OSD #这种身份验证提供的保护仅限于 Ceph 客户端与 Ceph 集群主机之间,身份验证不会扩展到 Ceph 客户端以外。如果用户从远程主机访问 Ceph 客户端,则不会对用户主机与客户端主机之间的连接应用 Ceph 身份验证。
30.2 主要管理 #
本节介绍 Ceph 客户端用户,以及如何在 Ceph 存储集群中对其进行身份验证和授权。用户是指使用 Ceph 客户端来与 Ceph 存储集群守护进程交互的个人或系统参与者(例如应用)。
Ceph 在启用身份验证和授权(默认启用)的情况下运行时,您必须指定一个用户名,以及包含所指定用户的秘密密钥的密钥环(通常通过命令行指定)。如果您未指定用户名,Ceph 将使用 client.admin
作为默认用户名。如果您未指定密钥环,Ceph 将通过 Ceph 配置文件中的密钥环设置来查找密钥环。例如,如果您在未指定用户名或密钥环的情况下执行 ceph health
命令,Ceph 将按如下所示解释该命令:
cephuser@adm >
ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health
或者,您可以使用 CEPH_ARGS
环境变量来避免重复输入用户名和机密。
30.2.1 背景信息 #
无论 Ceph 客户端是何类型(例如,块设备、对象存储、文件系统、本机 API),Ceph 都会在存储池中将所有数据存储为对象。Ceph 用户需要拥有存储池访问权限才能读取和写入数据。此外,Ceph 用户必须拥有执行权限才能使用 Ceph 的管理命令。以下概念可帮助您理解 Ceph 用户管理。
30.2.1.1 用户 #
用户是指个人或系统参与者(例如应用)。通过创建用户,可以控制谁(或哪个参与者)能够访问您的 Ceph 存储集群、其存储池及存储池中的数据。
Ceph 使用多种类型的用户。进行用户管理时,将始终使用 client
类型。Ceph 通过句点 (.)分隔格式来标识用户,该格式由用户类型和用户 ID 组成。例如,TYPE.ID
、client.admin
或 client.user1
。区分用户类型的原因在于,Ceph Monitor、OSD 和元数据服务器也使用 cephx 协议,但它们并非客户端。区分用户类型有助于将客户端用户与其他用户区分开来,从而简化访问控制、用户监视和可追溯性。
有时,Ceph 的用户类型可能会令人混淆,因为根据命令行用法的不同,Ceph 命令行允许您指定具有类型的用户或不具有类型的用户。如果您指定 --user
或 --id
,则可以省略类型。因此,可将 client.user1
简单地输入为 user1
。如果您指定的是 --name
或 -n
,则必须指定类型和名称,例如 client.user1
。作为最佳实践,我们建议尽可能使用类型和名称。
Ceph 存储集群用户与 Ceph 对象存储用户或 Ceph 文件系统用户均不同。Ceph 对象网关使用 Ceph 存储集群用户在网关守护进程与存储集群之间通讯,但网关有自己的用户管理功能来管理最终用户。Ceph 文件系统使用 POSIX 语义。与它关联的用户空间与 Ceph 存储集群用户不同。
30.2.1.2 授权和用户权限 #
Ceph 使用“用户权限”(caps) 术语来描述对已经过身份验证的用户授权,允许其运用 Monitor、OSD 和元数据服务器的功能。用户权限还可限制对存储池或存储池名称空间内的数据的访问。Ceph 管理用户可在创建或更新用户时设置用户的权限。
用户权限语法的格式如下:
daemon-type 'allow capability' [...]
下面是每个服务类型的用户权限列表:
- Monitor 用户权限
包括
r
、w
、x
和allow profile cap
。mon 'allow rwx' mon 'allow profile osd'
- OSD 用户权限
包括
r
、w
、x
、class-read
、class-write
和profile osd
。此外,OSD 用户权限还允许进行存储池和名称空间设置。osd 'allow capability' [pool=poolname] [namespace=namespace-name]
- MDS 用户权限
只需要
allow
,或留空。mds 'allow'
以下各项描述了每项用户权限:
- allow
需先于守护进程的访问设置指定。仅对 MDS 表示
rw
。- r
向用户授予读取权限。访问 Monitor 以检索 CRUSH 索引时需具有此用户权限。
- w
向用户授予针对对象的写入权限。
- x
授予用户调用类方法(包括读取和写入)的能力,以及在 Monitor 中执行
auth
操作的能力。- class-read
授予用户调用类读取方法的能力。
x
的子集。- class-write
授予用户调用类写入方法的能力。
x
的子集。- *
授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力。
- profile osd
授予用户以某个 OSD 身份连接到其他 OSD 或 Monitor 的权限。授予 OSD 权限,使 OSD 能够处理复制检测信号流量和状态报告。
- profile mds
授予用户以某个 MDS 身份连接到其他 MDS 或 Monitor 的权限。
- profile bootstrap-osd
授予用户引导 OSD 的权限。授权给部署工具,使其在引导 OSD 时有权添加密钥。
- profile bootstrap-mds
授予用户引导元数据服务器的权限。授权给部署工具,使其在引导元数据服务器时有权添加密钥。
30.2.1.3 存储池 #
存储池是指用户在其中存储数据的逻辑分区。在 Ceph 部署中,常见的做法是为相似类型的数据创建一个存储池作为逻辑分区。例如,将 Ceph 部署为 OpenStack 的后端时,典型的部署方式是为卷、映像、备份和虚拟机以及用户(如 client.glance
或 client.cinder
)创建相应的存储池。
30.2.2 管理用户 #
用户管理功能可让 Ceph 集群管理员能够直接在 Ceph 集群中创建、更新和删除用户。
在 Ceph 集群中创建或删除用户时,可能需要将密钥分发到客户端,以便将密钥添加到密钥环。有关详细信息,请参见第 30.2.3 节 “管理密钥环”。
30.2.2.1 列出用户 #
要列出集群中的用户,请执行以下命令:
cephuser@adm >
ceph auth list
Ceph 将列出您集群中的所有用户。例如,在包含两个节点的集群中,ceph auth list
输出类似下方所示:
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
。另请注意,每个项包含一个 key: value
项,以及一个或多个 caps:
项。
可以结合使用 -o 文件名
选项和 ceph auth list
将输出保存到某个文件。
30.2.2.2 获取有关用户的信息 #
要检索特定的用户、密钥和用户权限,请执行以下命令:
cephuser@adm >
ceph auth get TYPE.ID
例如:
cephuser@adm >
ceph auth get client.admin
exported keyring for client.admin
[client.admin]
key = AQA19uZUqIwkHxAAFuUwvq0eJD4S173oFRxe0g==
caps mds = "allow"
caps mon = "allow *"
caps osd = "allow *"
开发人员也可以执行以下命令:
cephuser@adm >
ceph auth export TYPE.ID
auth export
命令与 auth get
相同,不过它还会列显内部身份验证 ID。
30.2.2.3 添加用户 #
添加一个用户会创建用户名 (TYPE.ID
)、秘密密钥,以及包含在命令中用于创建该用户的所有用户权限。
用户可使用其密钥向 Ceph 存储集群进行身份验证。用户的用户权限授予该用户在 Ceph Monitor (mon)、Ceph OSD (osd) 或 Ceph 元数据服务器 (mds) 上进行读取、写入或执行的能力。
可以使用以下几个命令来添加用户:
ceph auth add
此命令是添加用户的规范方法。它会创建用户、生成密钥,并添加所有指定的用户权限。
ceph auth get-or-create
此命令往往是创建用户的最简便方式,因为它会返回包含用户名(在方括号中)和密钥的密钥文件格式。如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥。您可以使用
-o filename
选项将输出保存到某个文件。ceph auth get-or-create-key
此命令是创建用户并仅返回用户密钥的简便方式。对于只需要密钥的客户端(例如
libvirt
),此命令非常有用。如果该用户已存在,此命令只返回密钥。您可以使用-o filename
选项将输出保存到某个文件。
创建客户端用户时,可以创建不具有用户权限的用户。不具有用户权限的用户可以进行身份验证,但不能执行其他操作。此类客户端无法从 Monitor 检索集群索引。但是,如果您希望稍后再添加用户权限,可以使用 ceph auth caps
命令创建一个不具有用户权限的用户。
典型的用户至少对 Ceph Monitor 具有读取功能,并对 Ceph OSD 具有读取和写入功能。此外,用户的 OSD 权限通常限制为只能访问特定的存储池。
cephuser@adm >
ceph auth add client.john mon 'allow r' osd \ 'allow rw pool=liverpool'cephuser@adm >
ceph auth get-or-create client.paul mon 'allow r' osd \ 'allow rw pool=liverpool'cephuser@adm >
ceph auth get-or-create client.george mon 'allow r' osd \ 'allow rw pool=liverpool' -o george.keyringcephuser@adm >
ceph auth get-or-create-key client.ringo mon 'allow r' osd \ 'allow rw pool=liverpool' -o ringo.key
如果您为某个用户提供了对 OSD 的用户权限,但未限制只能访问特定存储池,则该用户将有权访问集群中的所有存储池。
30.2.2.4 修改用户权限 #
使用 ceph auth caps
命令可以指定用户以及更改该用户的权限。设置新用户权限会重写当前的用户权限。要查看当前用户权限,请运行 ceph auth get USERTYPE.USERID
。要添加用户权限,使用以下格式时还需要指定现有用户权限:
cephuser@adm >
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]']
例如:
cephuser@adm >
ceph auth get client.johncephuser@adm >
ceph auth caps client.john mon 'allow r' osd 'allow rw pool=prague'cephuser@adm >
ceph auth caps client.paul mon 'allow rw' osd 'allow r pool=prague'cephuser@adm >
ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'
要删除某个用户权限,可重设置该用户权限。如果希望用户无权访问以前设置的特定守护进程,请指定一个空字符串:
cephuser@adm >
ceph auth caps client.ringo mon ' ' osd ' '
30.2.2.5 删除用户 #
要删除用户,请使用 ceph auth del
:
cephuser@adm >
ceph auth del TYPE.ID
其中,TYPE 是 client
、osd
、mon
或 mds
之一,ID 是用户名或守护进程的 ID。
如果您创建了仅对不再存在的存储池具有许可权限的用户,则应该考虑也删除那些用户。
30.2.2.6 列显用户的密钥 #
要将用户的身份验证密钥列显到标准输出,请执行以下命令:
cephuser@adm >
ceph auth print-key TYPE.ID
其中,TYPE 是 client
、osd
、mon
或 mds
之一,ID 是用户名或守护进程的 ID。
需要在客户端软件(例如 libvirt
)中填充某个用户的密钥时,列显用户的密钥非常有帮助,如以下示例所示:
#
mount -t ceph host:/ mount_point \
-o name=client.user,secret=`ceph auth print-key client.user`
30.2.2.7 导入用户 #
要导入一个或多个用户,请使用 ceph auth import
并指定密钥环:
cephuser@adm >
ceph auth import -i /etc/ceph/ceph.keyring
Ceph 存储集群将添加新用户及其密钥和用户权限,并更新现有用户及其密钥和用户权限。
30.2.3 管理密钥环 #
当您通过 Ceph 客户端访问 Ceph 时,该客户端会查找本地密钥环。默认情况下,Ceph 会使用以下四个密钥环名称预设置密钥环设置,因此,除非您要覆盖默认值,否则无需在 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 存储集群。
第 30.2 节 “主要管理”详细介绍了如何直接在 Ceph 存储集群中列出、获取、添加、修改和删除用户。不过,Ceph 还提供了 ceph-authtool
实用程序,可让您从 Ceph 客户端管理密钥环。
30.2.3.1 创建密钥环 #
当您执行第 30.2 节 “主要管理”中的过程创建用户时,需要向 Ceph 客户端提供用户密钥,以使客户端能检索指定用户的密钥,并向 Ceph 存储集群进行身份验证。Ceph 客户端将访问钥环,以查找用户名并检索用户的密钥:
cephuser@adm >
ceph-authtool --create-keyring /path/to/keyring
创建包含多个用户的密钥环时,我们建议使用集群名称(例如 cluster.keyring)作为密钥环文件名,并将其保存在 /etc/ceph
目录中,如此,您无需在 Ceph 配置文件的本地副本中指定文件名,密钥环配置默认设置就会选取正确的文件名。例如,可执行以下命令创建 ceph.keyring
:
cephuser@adm >
ceph-authtool -C /etc/ceph/ceph.keyring
创建包含单个用户的密钥环时,我们建议使用集群名称、用户类型和用户名,并将其保存在 /etc/ceph
目录中。例如,为 用户创建
ceph.client.admin.keyringclient.admin
。
30.2.3.2 将用户添加到密钥环 #
将某个用户添加到 Ceph 存储集群时(请参见第 30.2.2.3 节 “添加用户”),可以检索该用户、密钥和用户权限,并将该用户保存到密钥环。
如果您只想对每个密钥环使用一个用户,可以结合 -o
选项使用 ceph auth get
命令以密钥环文件格式保存输出。例如,要为 client.admin
用户创建密钥环,请执行以下命令:
cephuser@adm >
ceph auth get client.admin -o /etc/ceph/ceph.client.admin.keyring
想要将用户导入到密钥环时,可以使用 ceph-authtool
指定目标密钥环和源密钥环:
cephuser@adm >
ceph-authtool /etc/ceph/ceph.keyring \
--import-keyring /etc/ceph/ceph.client.admin.keyring
如果您的密钥环遭到入侵,请从 /etc/ceph
目录中删除您的密钥,并使用第 30.2.3.1 节 “创建密钥环”中的相同说明重新创建新密钥。
30.2.3.3 创建用户 #
Ceph 提供 ceph auth add
命令用于直接在 Ceph 存储集群中创建用户。但是,您也可以直接在 Ceph 客户端密钥环中创建用户、密钥和用户权限。然后,可将用户导入到 Ceph 存储集群:
cephuser@adm >
ceph-authtool -n client.ringo --cap osd 'allow rwx' \
--cap mon 'allow rwx' /etc/ceph/ceph.keyring
您也可以在创建密钥环的同时将新用户添加到该密钥环:
cephuser@adm >
ceph-authtool -C /etc/ceph/ceph.keyring -n client.ringo \
--cap osd 'allow rwx' --cap mon 'allow rwx' --gen-key
在前面的方案中,新用户 client.ringo
仅存放在密钥环中。要将该新用户添加到 Ceph 存储集群,仍必须手动添加:
cephuser@adm >
ceph auth add client.ringo -i /etc/ceph/ceph.keyring
30.2.3.4 修改用户 #
要修改密钥环中某条用户记录的用户权限,请指定该密钥环和用户,然后指定用户权限:
cephuser@adm >
ceph-authtool /etc/ceph/ceph.keyring -n client.ringo \
--cap osd 'allow rwx' --cap mon 'allow rwx'
要在 Ceph 集群环境中更新已修改的用户,必须将密钥环中的更改导入到 Ceph 集群中的用户项:
cephuser@adm >
ceph auth import -i /etc/ceph/ceph.keyring
请参见第 30.2.2.7 节 “导入用户”,了解有关根据密钥环更新 Ceph 存储集群用户的详细信息。
30.2.4 命令行用法 #
ceph
命令支持以下与用户名和机密操作相关的选项:
--id
或--user
Ceph 使用类型和 ID(TYPE.ID,例如
client.admin
或client.user1
)来标识用户。使用id
、name
和-n
选项可以指定用户名的 ID 部分(例如admin
或user1
)。可以使用 --id 指定用户,并省略类型。例如,要指定用户 client.foo,请输入以下命令:cephuser@adm >
ceph --id foo --keyring /path/to/keyring healthcephuser@adm >
ceph --user foo --keyring /path/to/keyring health--name
或-n
Ceph 使用类型和 ID(TYPE.ID,例如
client.admin
或client.user1
)来标识用户。使用--name
和-n
选项可以指定完全限定的用户名。必须指定用户类型(通常是client
)和用户 ID:cephuser@adm >
ceph --name client.foo --keyring /path/to/keyring healthcephuser@adm >
ceph -n client.foo --keyring /path/to/keyring health--keyring
包含一个或多个用户名和机密的密钥环的路径。
--secret
选项提供相同的功能,但它不适用于对象网关,该网关将--secret
用于其他目的。可以使用ceph auth get-or-create
检索密钥环并将其存储在本地。这是首选的做法,因为无需切换密钥环路径就能切换用户名:cephuser@adm >
rbd map --id foo --keyring /path/to/keyring mypool/myimage