跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Enterprise Storage 7 文档 / 操作和管理指南 / 配置集群 / 使用 cephx 进行身份验证
适用范围 SUSE Enterprise Storage 7

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 基本身份验证
图 30.1︰ cephx 基本身份验证

要在 Monitor 中进行身份验证,客户端需将用户名传递给 Monitor。Monitor 会生成一个会话密钥,并使用与该用户名关联的秘密密钥来加密该会话密钥,然后将加密的票据传回给客户端。之后,客户端会使用共享的秘密密钥解密数据,以获取会话密钥。会话密钥可识别当前会话的用户。然后,客户端请求与该用户相关、由会话密钥签名的票据。Monitor 会生成一个票据,使用用户的秘密密钥进行加密,然后将其传回给客户端。客户端解密该票据,并使用它对发往整个集群中的 OSD 和元数据服务器的请求进行签名。

cephx 身份验证
图 30.2︰ cephx 身份验证

cephx 协议会对客户端计算机与 Ceph 服务器之间进行的通讯进行身份验证。完成初始身份验证后,将使用 Monitor、OSD 和元数据服务器可通过共享密钥进行校验的票据,来对客户端与服务器之间发送的每条讯息进行签名。

cephx 身份验证 - MDS 和 OSD
图 30.3︰ 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.IDclient.adminclient.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 用户权限

包括 rwxallow profile cap

mon 'allow rwx'
mon 'allow profile osd'
OSD 用户权限

包括 rwxclass-readclass-writeprofile 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.glanceclient.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 表示法

请注意,针对用户采用 TYPE.ID 表示法,例如,osd.0 指定 osd 类型的用户,其 ID 为 0client.adminclient 类型的用户,其 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.keyring
cephuser@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.john
cephuser@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

其中,TYPEclientosdmonmds 之一,ID 是用户名或守护进程的 ID。

如果您创建了仅对不再存在的存储池具有许可权限的用户,则应该考虑也删除那些用户。

30.2.2.6 列显用户的密钥

要将用户的身份验证密钥列显到标准输出,请执行以下命令:

cephuser@adm > ceph auth print-key TYPE.ID

其中,TYPEclientosdmonmds 之一,ID 是用户名或守护进程的 ID。

需要在客户端软件(例如 libvirt)中填充某个用户的密钥时,列显用户的密钥非常有帮助,如以下示例所示:

root # 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.keyringname 元变量是用户类型和用户 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 目录中。例如,为 client.admin 用户创建 ceph.client.admin.keyring

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.adminclient.user1)来标识用户。使用 idname-n 选项可以指定用户名的 ID 部分(例如 adminuser1)。可以使用 --id 指定用户,并省略类型。例如,要指定用户 client.foo,请输入以下命令:

cephuser@adm > ceph --id foo --keyring /path/to/keyring health
cephuser@adm > ceph --user foo --keyring /path/to/keyring health
--name-n

Ceph 使用类型和 ID(TYPE.ID,例如 client.adminclient.user1)来标识用户。使用 --name-n 选项可以指定完全限定的用户名。必须指定用户类型(通常是 client)和用户 ID:

cephuser@adm > ceph --name client.foo --keyring /path/to/keyring health
cephuser@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