CephX 认证机制

Ceph 使用 cephx 协议对客户端进行身份认证。

cephx 用于对 ceph 保存的数据进行认证访问和授权,用于对访问 ceph 的请求进行认证和授权检测,与 mon 通信的请求都要经过 ceph 认证通过,但是也可以在 mon 节点关闭 cephx认证,但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性。

1、授权流程

每个 mon 节点都可以对客户端进行身份认证并分发秘钥,因此多个 mon 节点就不存在单点故障和认证性能瓶颈。
mon 节点会返回用于身份认证的数据结构,其中包含获取 ceph 服务时用到的 session key, session key通过客户端秘钥进行加密,秘钥是在客户端提前配置好的,/etc/ceph/ceph.client.admin.keyring。
客户端使用 session key 向 mon 请求所需要的服务,mon 向客户端提供一个 tiket,用于向实际处理数据的 OSD 等服务验证客户端身份,MON 和 OSD 共享同一个 secret,因此 OSD会信任有 MON 发放的 tiket。
tiket 存在有效期

注意:

  • CephX 身份验证功能仅限制在 Ceph 的各组件之间,不能扩展到其他非 ceph 组件
  • Ceph 只负责认证授权,不能解决数据传输的加密问题
图片[1]-CephX 认证机制-李佳程的个人主页

2、访问流程

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

图片[2]-CephX 认证机制-李佳程的个人主页
图片[3]-CephX 认证机制-李佳程的个人主页

3、ceph 用户

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

[root@node01 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
	key = AQDhgLdjRBCPMBAAkyoxeR9+x32tbapU/oPYyA==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"

4、ceph 授权和使能

ceph 基于使能/能力(Capabilities,简称 caps )来描述用户可针对 MON/OSD 或 MDS 使用的授权范围或级别。

通用的语法格式:daemon-type ‘allow caps’ [...]
能力一览表:
r:向用户授予读取权限。访问监视器以检索 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:授予用户引导元数据服务器的权限,授权部署工具权限,使其在引导
元数据服务器时有权添加密钥。

MON 能力

包括 r/w/x 和 allow profile

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'

5、ceph 用户管理

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

5.1、列出用户

[ceph@deploy ceph-cluster]$ ceph auth list
installed auth entries:

mds.mgr01
	key: AQAA0LdjbvXXNBAAdzuuFU191iPvWkn6DRZXdg==
	caps: [mds] allow
	caps: [mon] allow profile mds
	caps: [osd] allow rwx
osd.0
	key: AQBchrdjtgwnHhAAEJsFvN6hOPxHoMvMzUjghg==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
osd.1
	key: AQBkhrdjjg4hLhAA4tvQuAgGXOpvQnM/WgZ8Ww==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
............
client.admin
	key: AQDhgLdjRBCPMBAAkyoxeR9+x32tbapU/oPYyA==
	caps: [mds] allow *
	caps: [mgr] allow *
	caps: [mon] allow *
	caps: [osd] allow *

注意:TYPE.ID 表示法

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

另请注意,每个项包含一个 key: 值项,以及一个或多个 caps 项。
可以结合使用-o 文件名选项和 ceph auth list 将输出保存到某个文件。

[ceph@deploy ceph-cluster]$ ceph auth list -o test.key
installed auth entries:

[ceph@deploy ceph-cluster]$ cat test.key
mds.mgr01
	key: AQAA0LdjbvXXNBAAdzuuFU191iPvWkn6DRZXdg==
	caps: [mds] allow
	caps: [mon] allow profile mds
	caps: [osd] allow rwx
............

5.2、列出指定用户信息

[ceph@deploy ceph-cluster]$ ceph auth get osd.5
exported keyring for osd.5
[osd.5]
	key = AQCFhrdjd43xNhAA2qIm1BOQGdLSVeN3RaKrrQ==
	caps mgr = "allow profile osd"
	caps mon = "allow profile osd"
	caps osd = "allow *"
[ceph@deploy ceph-cluster]$ ceph auth get client.admin
exported keyring for client.admin
[client.admin]
	key = AQDhgLdjRBCPMBAAkyoxeR9+x32tbapU/oPYyA==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"

5.3、用户管理

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

ceph auth add

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

# 添加key
[ceph@deploy ceph-cluster]$ ceph auth add client.test1 mon 'allow r' osd 'allow rwx pool=mypool'
added key for client.test1

# 验证key
[ceph@deploy ceph-cluster]$ ceph auth get client.test1
2023-01-09 13:37:47.725 7f23ce07b700  0 -- 192.168.1.110:0/1570874750 >> 192.168.1.117:6800/1873 conn(0x7f23bc004b40 :-1 s=STATE_CONNECTING_WAIT_CONNECT_REPLY_AUTH pgs=0 cs=0 l=1).handle_connect_reply connect got BADAUTHORIZER
exported keyring for client.test1
[client.test1]
	key = AQDfp7tjByz0LhAADfBL1G9n2TuwBqmW8nUmHQ==
	caps mon = "allow r"
	caps osd = "allow rwx pool=mypool"

ceph auth get-or-create

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

# 创建用户
[ceph@deploy ceph-cluster]$ ceph auth get-or-create client.test2 mon 'allow r' osd 'allow rwx pool=mypool'
[client.test2]
	key = AQCsqLtjKn0YCRAAKNPGi+jNj1cTiYYVWHXWBA==

# 验证用户
[ceph@deploy ceph-cluster]$ ceph auth get client.test2
exported keyring for client.test2
[client.test2]
	key = AQCsqLtjKn0YCRAAKNPGi+jNj1cTiYYVWHXWBA==
	caps mon = "allow r"
	caps osd = "allow rwx pool=mypool"

# 再次创建用户
[ceph@deploy ceph-cluster]$ ceph auth get-or-create client.test2 mon 'allow r' osd 'allow rwx pool=mypool'
[client.test2]
	key = AQCsqLtjKn0YCRAAKNPGi+jNj1cTiYYVWHXWBA==

ceph auth get-or-create-key

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

[ceph@deploy ceph-cluster]$ ceph auth get-or-create-key client.test2 mon 'allow r' osd 'allow rwx pool=mypool'
AQCsqLtjKn0YCRAAKNPGi+jNj1cTiYYVWHXWBA==       # 用户有 key 就显示没有就创建

ceph auth print-key

只获取单个指定用户的 key 信息

[ceph@deploy ceph-cluster]$ ceph auth print-key client.test2
AQCsqLtjKn0YCRAAKNPGi+jNj1cTiYYVWHXWBA==

修改用户能力

使用 ceph auth caps 命令可以指定用户以及更改该用户的能力,设置新能力会完全覆盖当前的能力,因此要加上之前的用户已经拥有的能和新的能力,如果看当前能力,可以运行 ceph auth get USERTYPE.USERID,如果要添加能力,使用以下格式时还需要指定现有能力:

# 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]']
# 查看用户当前权限
[ceph@deploy ceph-cluster]$ ceph auth get client.test1
exported keyring for client.test1
[client.test1]
	key = AQDfp7tjByz0LhAADfBL1G9n2TuwBqmW8nUmHQ==
	caps mon = "allow r"
	caps osd = "allow rwx pool=mypool"

# 修改用户权限
[ceph@deploy ceph-cluster]$ ceph auth caps client.test1 mon 'allow r' osd 'allow rw pool=mypool'
updated caps for client.test1

# 再次验证权限
[ceph@deploy ceph-cluster]$ ceph auth get client.test1
exported keyring for client.test1
[client.test1]
	key = AQDfp7tjByz0LhAADfBL1G9n2TuwBqmW8nUmHQ==
	caps mon = "allow r"
	caps osd = "allow rw pool=mypool"

删除用户

要删除用户使用 ceph auth del TYPE.ID,其中 TYPE 是 client、osd、mon 或 mds 之一,ID 是用户名或守护进程的 ID。

[ceph@deploy ceph-cluster]$ ceph auth del client.test2
updated

导入用户

要导入一个或多个用户,请使用 ceph auth import 并指定密钥环

[ceph@deploy ceph-cluster]$ ceph auth import -i /etc/ceph/ceph.keyring

6、秘钥环管理

ceph 的秘钥环是一个保存了 secrets、password、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 

6.1、创建秘钥环文件

使用 ceph auth add 等命令添加的用户还需要额外使用 ceph-authtool 命令为期创建用户秘钥环。
ceph 客户端使用 keyring 文件查找用户并检索秘钥。
创建秒命令格式:

ceph-authtool --create-keyring FILE

导出用户 keyring 过程

# 创建用户
[ceph@deploy ceph-cluster]$ ceph auth get-or-create client.user1 mon 'allow r' osd 'allow * pool=mypool'
[client.user1]
	key = AQCKrLtjP3dUEBAAN97fYtTY3LVt9/ZwRk8pqw==

# 验证用户
[ceph@deploy ceph-cluster]$ ceph auth get client.user1
exported keyring for client.user1
[client.user1]
	key = AQCKrLtjP3dUEBAAN97fYtTY3LVt9/ZwRk8pqw==
	caps mon = "allow r"
	caps osd = "allow * pool=mypool"

# 创建 keyring 文件
[ceph@deploy ceph-cluster]$ ceph-authtool --create-keyring ceph.client.user1.keyring
creating ceph.client.user1.keyring

# 验证 keyring 文件
[ceph@deploy ceph-cluster]$ cat ceph.client.user1.keyring
[ceph@deploy ceph-cluster]$ file ceph.client.user1.keyring
ceph.client.user1.keyring: empty

# 导出 keyring 至指定文件
[ceph@deploy ceph-cluster]$ ceph auth get client.user1 -o ceph.client.user1.keyring
exported keyring for client.user1

# 验证指定用户的 keyring 文件
[ceph@deploy ceph-cluster]$ cat ceph.client.user1.keyring
[client.user1]
	key = AQCKrLtjP3dUEBAAN97fYtTY3LVt9/ZwRk8pqw==
	caps mon = "allow r"
	caps osd = "allow * pool=mypool"

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

将用户导入至秘钥环

# 创建 keyring 文件
[ceph@deploy ceph-cluster]$ ceph-authtool --create-keyring ceph.client.user2.keyring
creating ceph.client.user2.keyring

# 把指定用户的 keyring 文件内容导入到 user 用户的 keyring 文件
[ceph@deploy ceph-cluster]$ ceph-authtool ./ceph.client.user2.keyring --import-keyring ./ceph.client.admin.keyring
importing contents of ./ceph.client.admin.keyring into ./ceph.client.user2.keyring

# 验证 keyring 文件:
[ceph@deploy ceph-cluster]$ ceph-authtool -l ./ceph.client.user2.keyring
[client.admin]
	key = AQDhgLdjRBCPMBAAkyoxeR9+x32tbapU/oPYyA==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"

# 导入其他用户的 keyring
[ceph@deploy ceph-cluster]$ ceph-authtool ./ceph.client.user2.keyring --import-keyring ./ceph.client.user1.keyring
importing contents of ./ceph.client.user1.keyring into ./ceph.client.user2.keyring

# 再次验证 keyring 文件
[ceph@deploy ceph-cluster]$ ceph-authtool -l ./ceph.client.user2.keyring
[client.admin]
	key = AQDhgLdjRBCPMBAAkyoxeR9+x32tbapU/oPYyA==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"
[client.user1]
	key = AQCKrLtjP3dUEBAAN97fYtTY3LVt9/ZwRk8pqw==
	caps mon = "allow r"
	caps osd = "allow * pool=mypool"

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享