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