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.keyringCeph 存储集群将添加新用户及其密钥和用户权限,并更新现有用户及其密钥和用户权限。
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.keyring30.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.keyring30.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 health- cephuser@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 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


