袁党生博客

  • 主页
  • linux基础
  • SHELL
  • WEB
  • 负载
  • 企业级应用
  • 数据库
  • KVM
  • Docker
  • K8S
  • 监控
  • 存储
  • 博客搭建问题
  1. 首页
  2. 存储
  3. 正文

五、CephX 认证机制

2024年5月31日 2295点热度 8人点赞 0条评论


本章概述

  • 授权流程
  • 访问流程
  • ceph用户
  • ceph授权和使能
  • ceph用户管理
  • 秘钥环管理

前言
  Ceph 使用 cephx 协议对客户端进行身份认证。
  cephx 用于对 ceph 保存的数据进行认证访问和授权,用于对访问 ceph 的请求进行认证和授权检测,与 mon 通信的请求都要经过 ceph 认证通过,但是也可以在 mon 节点关闭 cephx认证,但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性。
备注:mon服务器负责ceph集群的认证

5.1 授权流程

  每个 mon 节点都可以对客户端进行身份认证并分发秘钥,因此多个 mon 节点就不存在单点故障和认证性能瓶颈
  mon 节点会返回用于身份认证的数据结构,其中包含获取 ceph 服务时用到的 session key,session key 通过客户端秘钥进行加密传输,而秘钥是在客户端提前配置好的,保存在/etc/ceph/ceph.client.admin.keyring 文件中(即下图中红框内的key)。如下图所示:

注意:该文件不仅存放客户端密钥key,而且对mds、mgr、mon、osd的权限做了定义,这里的”allow *”是指拥有所有权限
  客户端使用 session key 向 mon 请求所需要的服务,mon 向客户端提供一个 tiket,用于向实际处理数据的 OSD 等服务验证客户端身份,MON 和 OSD 共享同一个 secret,因此OSD 会信任所有 MON 发放的 tiket。(注:tiket 存在有效期,过期后会重新发放)
注意:
CephX 身份验证功能仅限制在 Ceph 的各组件之间,不能扩展到其他非 ceph 组件
Ceph 只负责认证授权,不能解决数据传输的加密问题

流程如下:
(1)客户端携带 /etc/ceph/ceph.client.admin.keyring 的 key 信息向 MON 节点请求认证,申请session key
(2)MON 节点生成 session key,并通过客户端提供的 key 加密 session key 发送给客户端
(3)客户端用 key 来解密获取 session key,利用session key向MON节点申请tiket
(4)MON 节点验证 session key 是否准确性,并且发放tiket
(5)客户端使用tiket访问OSD
(6)OSD向mon服务器验证tiket的有效性,并发送数据
注意:后续客户端和OSD(存储池pool)交互均使用tiket进行加密传输

5.2 访问流程

  无论 ceph 客户端是哪种类型,例如块设备、对象存储、文件系统,ceph 都会在存储池中将所有数据存储为对象:
  ceph 用户需要拥有存储池访问权限,才能读取和写入数据
  ceph 用户必须拥有执行权限才能使用 ceph 的管理命令


流程如下:
(1)客户端携带 /etc/ceph/ceph.client.admin.keyring 的 key 信息向 MON 节点请求认证,申请session key
(2)MON 节点生成 session key,并通过客户端提供的 key 加密 session key 发送给客户端
(3)客户端用 key 来解密获取 session key,利用session key向MON节点申请tiket
(4)MON 节点验证 session key 是否准确性,并且发放tiket
(5)客户端使用tiket访问OSD
(6)OSD向mon服务器验证tiket的有效性,并发送数据
注意:后续客户端和OSD交互均使用tiket进行加密传输

注意:如果使用了cephFS,验证过程中还需要向mds(metadata-server)进行请求认证,mds向mon服务器验证tiket有效性,验证通过后mds向客户端返回元数据,然后进行后续步骤。如果没有使用cephFS,使用的是块存储或对象存储网关,则不需要进行这一验证步骤

5.3 ceph用户

  用户是指个人(ceph 管理者)或系统参与者(MON/OSD/MDS)。
  通过创建用户,可以控制用户或哪个参与者能够访问 ceph 存储集群、以及可访问的存储池及存储池中的数据。
  ceph 支持多种类型的用户,但可管理的用户都属于 client 类型
  区分用户类型的原因在于,MON/OSD/MDS 等系统组件特使用 cephx 协议,但是它们为非客户端。
  通过点号来分割用户类型和用户名,格式为 TYPE.ID,例如 client.admin。

备注:ceph.client.admin.keyring文件命名格式为:
集群名  ceph       #如果集群名为ceph-cluster1,则文件名称为ceph-cluster. client.admin.keyring
类型  client
用户名 admin
固定后缀keyring

列出指定用户信息:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth get osd.4 #查看osd.4的用户信息

cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth get client.admin #查看admin用户信息

5.4 ceph授权和使能

ceph 基于使能/能力(Capabilities,简称 caps )来描述用户可针对 MON/OSD 或 MDS 使用的授权范围或级别。
通用的语法格式:daemon-type 'allow caps' [...]
能力(caps)一览表:

r:向用户授予读取权限。访问监视器(mon)以检索 CRUSH 运行图时需具有此能力。
w:向用户授予针对对象的写入权限。
x:授予用户调用类方法(包括读取和写入)的能力,以及在监视器中执行 auth 操作的能力。
*:授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力

备注:以下权限并不常用,了解即可
class-read:授予用户调用类读取方法的能力,属于是 x 能力的子集。
class-write:授予用户调用类写入方法的能力,属于是 x 能力的子集。
profile osd:授予用户以某个 OSD 身份连接到其他 OSD 或监视器的权限。授予 OSD 权限,使 OSD 能够处理复制检测信号流量和状态报告(获取 OSD 的状态信息)。
profile mds:授予用户以某个 MDS 身份连接到其他 MDS 或监视器的权限。
profile bootstrap-osd:授予用户引导 OSD 的权限(初始化 OSD 并将 OSD 加入 ceph 集群),授权给部署工具,使其在引导 OSD 时有权添加密钥。
profile bootstrap-mds:授予用户引导元数据服务器的权限,授权部署工具权限,使其在引导元数据服务器时有权添加密钥。

ceph各节点能力:

MON 能力:
包括 r/w/x 和 allow profile cap(ceph 的运行图)
例如:
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]     #namespace可以不写

MDS 能力:
只需要 allow 或空表示都允许。
mds 'allow'

5.5 ceph用户管理

  用户管理功能可让 Ceph 集群管理员能够直接在 Ceph 集群中创建、更新(侧重于更新用户权限)和删除用户。
  在 Ceph 集群中创建或删除用户时,可能需要将密钥分发到客户端,以便将密钥添加到密钥环文件中/etc/ceph/ceph.client.admin.keyring,此文件中可以包含一个或者多个用户认证信息,凡是拥有此文件的节点,将具备访问 ceph 的权限,而且可以使用其中任何一个账户的权限,此文件类似于 linux 系统的中的/etc/passwd 文件。

5.5.1 列出用户

cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth list

注意:TYPE.ID 表示法
针对用户采用 TYPE.ID 表示法,例如 osd.0 指定是 osd 类并且 ID 为 0 的用户(节点),client.admin 是 client 类型的用户,其 ID 为 admin

另请注意:每个项包含一个 key=xxxx 项,以及一个或多个 caps 项。
可以结合使用-o 文件名选项和 ceph auth list 将输出保存到某个文件。
[ceph@ceph-deploy ceph-cluster]$ ceph auth list -o 123.key
备注:通过重定向也可以备份该文件

5.5.2 用户管理

  添加一个用户会创建用户名 (TYPE.ID)、机密密钥,以及包含在命令中用于创建该用户的所有能力,用户可使用其密钥向 Ceph 存储集群进行身份验证。用户的能力授予该用户在Ceph monitor (mon)、Ceph OSD (osd) 或 Ceph 元数据服务器 (mds) 上进行读取、写入或执行的能力,可以使用以下几个命令来添加用户:

5.5.2.1 ceph auth add
此命令是添加用户的规范方法。它会创建用户、生成密钥,并添加所有指定的能力。
命令格式:

[ceph@ceph-deploy ceph-cluster]$ ceph auth -h
auth add <entity> {<caps> [<caps>...]}

添加认证 key:
[ceph@ceph-deploy ceph-cluster]$ ceph auth add client.tom mon 'allow r' osd 'allow rwx pool=mypool'

验证 key
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth get client.tom

5.5.2.2 ceph auth get-or-create
  ceph auth get-or-create 此命令是创建用户较为常见的方式之一,它会返回包含用户名(在方括号中)和密钥的密钥文,如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥,还可以使用 -o 指定文件名选项将输出保存到某个文件。

创建用户
[ceph@ceph-deploy ceph-cluster]$ ceph auth get-or-create client.jack mon 'allow r' osd 'allow rwx pool=mypool' #新建用户jack,该用户不存在,会立即创建账户

验证用户
[cephadmin@ceph-deploy: ceph-cluster]$ ceph auth get client.jack

再次创建用户:
[ceph@ceph-deploy ceph-cluster]$ ceph auth get-or-create client.jack mon 'allow r' osd 'allow rwx pool=mypool' #用户已存在,用户不再创建,只显示key值

5.5.2.3 ceph auth get-or-create-key
  此命令是创建用户并仅返回用户密钥,对于只需要密钥的客户端(例如 libvirt(虚拟化对应的块)),此命令非常有用。如果该用户已存在,此命令只返回密钥。您可以使用 -o 文件名选项将输出保存到某个文件。
  创建客户端用户时,可以创建不具有能力的用户。不具有能力的用户可以进行身份验证,但不能执行其他操作,此类客户端无法从监视器检索集群地图,但是,如果希望稍后再添加能力,可以使用 ceph auth caps 命令创建一个不具有能力的用户。
  典型的用户至少对 Ceph monitor 具有读取功能,并对 Ceph OSD 具有读取和写入功能。
  此外,用户的 OSD 权限通常限制为只能访问特定的存储池。
[ceph@ceph-deploy ceph-cluster]$ ceph auth get-or-create-key client.jack mon 'allow r' osd 'allow rwx pool=mypool'

5.5.2.4 ceph auth print-key
只获取单个指定用户的 key 信息
[ceph@ceph-deploy ceph-cluster]$ ceph auth print-key client.jack

5.5.2.5 修改用户能力
  使用 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]']

查看用户当前权限
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth get client.jack

修改用户权限
[ceph@ceph-deploy ceph-cluster]$ ceph auth caps client.jack mon 'allow r' osd 'allow r pool=mypool' #修改jack用户对osd只有只读权限

再次查看jack用户权限,权限已经修改为只读权限

5.5.2.6 删除用户
  要删除用户使用 ceph auth del TYPE.ID,其中 TYPE 是 client、osd、mon 或 mds 之一,ID 是用户名或守护进程的 ID。
删除用户tom
[ceph@ceph-deploy ceph-cluster]$ ceph auth del client.tom

再次查询tom用户,用户不存在

5.6 密钥环管理

  ceph 的秘钥环是一个保存了 secrets、keys、certificates 并且能够让客户端通认证访问 ceph的 keyring file(集合文件),一个 keyring file 可以保存一个或者多个认证信息,每一个 key 都有一个实体名称加权限,类型为:{client、mon、mds、osd}.name

当客户端访问 ceph 集群时,ceph 会使用以下四个密钥环文件预设置密钥环设置:(会对以下四个文件从上到下进行检查,一旦检查到某个文件,就不再检查后面的文件)

/etc/ceph/<$cluster name>.<user $type>.<user $id>.keyring   #保存单个用户的 keyring
/etc/ceph/cluster.keyring        #保存多个用户的 keyring
/etc/ceph/keyring           #未定义集群名称的多个用户的 keyring
/etc/ceph/keyring.bin         #编译后的二进制文件

5.6.1 通过秘钥环文件备份与恢复用户

使用 ceph auth add 等命令添加的用户还需要额外使用 ceph-authtool 命令为其创建用户秘钥环文件。
创建 keyring 文件命令格式:

ceph-authtool --create-keyring FILE

5.6.1.1 导出用户认证信息至 keyring 文件
将用户信息导出至 keyring 文件,对用户信息进行备份。
创建用户:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth get-or-create client.user1 mon 'allow r' osd 'allow * pool=mypool'

查看用户
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth get client.user1

创建 keyring 文件:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph-authtool --create-keyring ceph.client.user1.keyring
查看 keyring 文件:
cephadmin@ceph-deploy:~/ceph-cluster$ cat ceph.client.user1.keyring #是个空文件
cephadmin@ceph-deploy:~/ceph-cluster$ file ceph.client.user1.keyring

导出 keyring 至指定文件
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth get client.user1 -o ceph.client.user1.keyring

验证指定用户的 keyring 文件:
cephadmin@ceph-deploy:~/ceph-cluster$ cat ceph.client.user1.keyring

在创建包含单个用户的密钥环时,通常建议使用 ceph 集群名称、用户类型和用户名keyring来 命 名 , 并 将 其 保 存 在/etc/ceph目 录 中 。 例 如 为client.user1用 户 创 建ceph.client.user1.keyring。

5.6.1.2 从 keyring 文件恢复用户认证信息
可以使用 ceph auth import -i 指定 keyring 文件并导入到 ceph,其实就是起到用户备份和恢复的目的
验证用户的认证文件
cephadmin@ceph-deploy:~/ceph-cluster$ cat ceph.client.user1.keyring

演示误删除用户
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth del client.user1

确认用户被删除
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth get client.user1 #无法获取用户信息,说明用户已删除

使用备份文件导入用户,恢复已删除用户
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth import -i ceph.client.user1.keyring

验证用户是否已经恢复
cephadmin@ceph-deploy:~/ceph-cluster$ ceph auth get client.user1

5.6.2 秘钥环文件多用户

  一个 keyring 文件中可以包含多个不同用户的认证文件,因此可以将多个用户的认证信息导入到同一个keyring文件中(一般不采用这种方式保存用户认证信息)。

5.6.2.1 将多用户导出至秘钥环
创建 keyring 文件:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph-authtool --create-keyring ceph.client.user.keyring #创建空的 keyring 文件

把指定的 admin 用户的 keyring 文件内容导入到 user 用户的 keyring 文件:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph-authtool ./ceph.client.user.keyring --import-keyring ./ceph.client.admin.keyring

验证 keyring 文件:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph-authtool -l ./ceph.client.user.keyring

再导入一个其他用户的 keyring:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph-authtool ./ceph.client.user.keyring --import-keyring ./ceph.client.user1.keyring

再次验证 keyring 文件是否包含多个用户的认证信息:
cephadmin@ceph-deploy:~/ceph-cluster$ ceph-authtool -l ./ceph.client.user.keyring

标签: ceph
最后更新:2024年5月31日

袁党生

这个人很懒,什么都没留下

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

COPYRIGHT © 2023 linux学习. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

豫ICP备18039507号-1