ceph(二)CephX认证授权、用户管理和keyring

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只负责认证授权,不能解决数据传输的加密问题

2. 访问流程

无论ceph客户端是哪种类型,例如块设备、对象存储、文件系统,ceph都会在存储池中将所有数据存储为对象:

  • ceph用户需要拥有存储池访问权限,才能读取和写入数据;
  • ceph用户必须拥有执行权限才能使用ceph 的管理命令。


3. ceph用户

用户是指个人(ceph 管理者)或系统参与者(MON/OSD/MDS)。通过创建用户,可以控制用户或哪个参与者能够访问ceph存储集群、以及可访问的存储池及存储池中的数据。

ceph支持多种类型的用户,但可管理的用户都属于client类型。区分用户类型的原因在于,MON/OSD/MDS等系统组件特使用cephx协议,但是它们为非客户端。

通过点号分割用户类型和用户名,格式为TYPE.ID,例如:client.admin。

[root@ceph-deploy ~]#cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQDaQAtlGUUQAhAA7kJdEwwNvuC4SDd3Xt731g==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"

4. ceph授权和使能

ceph基于使能/能力(caps)来描述用户可针对MON/OSD或MDS使用的授权范围或级别。能力也用于限制对某一存储池内的数据或某个命名空间的访问。 Ceph 管理员用户可在创建或更新普通用户时赋予他相应的能力。

Ceph 把数据以对象的形式存于各存储池中。Ceph 用户必须具有访问存储池的权限才能够读写数据。另外,Ceph 用户必须具有执行权限才能够使用 Ceph 的管理命令。

通常的语法格式为:

{daemon-type} 'allow {capability}' [{daemon-type} 'allow {capability}']

能力说明

r: 向用户授予读取权限。访问监视器(mon)以检索CRUSH 运行图时需具有此能力。
w: 向用户授予针对对象的写入权限。
x: 授予用户调用类方法(包括读取和写入)的能力,以及在监视器中执行auth操作的能力。
*: 授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力。
class-read: 授予用户调用类读取方法的能力,属于是x能力的子集.
class-write:授予用户调用类写入方法的能力,属于是×能力的子集.
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 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]
  • MDS能力

只需要allow或空都表示允许

mds 'allow'

5. 用户管理

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

5.1 列出用户

ceph auth list

Ceph 会列出集群中的所有用户,示例:

[root@ceph-deploy ~]#ceph auth list
osd.0
key: AQDdSQtl7f1OChAAOW/v2ZtHNC7w7eqWsqjSfA==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
osd.1
key: AQDuSQtlO3xkIBAAoJqPQxHsOl8AYsbLi4enhQ==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
...
client.admin
key: AQDaQAtlGUUQAhAA7kJdEwwNvuC4SDd3Xt731g==
caps: [mds] allow *
caps: [mgr] allow *
caps: [mon] allow *
caps: [osd] allow *
client.bootstrap-mds
key: AQDaQAtl8A4RAhAA9SlyrQsa2UuxgP1oNConAQ==
caps: [mon] allow profile bootstrap-mds
client.bootstrap-osd
key: AQDaQAtlLDIRAhAAP7lE/Z41rsS6Nx5HgegNmA==
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​将输出保存到某个文件。

cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth list -o 123.key

5.2 获取用户

列出指定某一用户信息

ceph auth get {TYPE.ID}

示例:

[root@ceph-deploy ~]#ceph auth get osd.10
[osd.10]
key = AQDvVgtleVZTIhAAXvXYNHQJTkb+x9T7FSxGnA==
caps mgr = "allow profile osd"
caps mon = "allow profile osd"
caps osd = "allow *"
exported keyring for osd.10
# 还可以给命令加上 -o {filename} 选项把输入保存到一个文件中。
[root@ceph-deploy ~]#ceph auth get client.admin -o 123.key
[client.admin]
key = AQDaQAtlGUUQAhAA7kJdEwwNvuC4SDd3Xt731g==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
exported keyring for client.admin

5.3 添加用户

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

  1. ceph auth add

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

# 添加用户
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth add client.tom mon 'allow r' osd 'allow rwx pool=mypool'
added key for client.tom
# 查看
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get client.tom
[client.tom]
key = AQBc2A1l6Cq6IRAA2yPaF3tIliEd0u/uT1NuGQ==
caps mon = "allow r"
caps osd = "allow rwx pool=mypool"
exported keyring for client.tom
  1. ceph auth get-or-create

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

# 创建用户
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get-or-create client.mike mon 'allow r' osd 'allow rwx pool=mypool'
[client.mike]
key = AQBJ2Q1lT67BAhAACnZZl5BIROQKAVSYVDCCXA==
# 验证用户
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get client.mike
[client.mike]
key = AQBJ2Q1lT67BAhAACnZZl5BIROQKAVSYVDCCXA==
caps mon = "allow r"
caps osd = "allow rwx pool=mypool"
exported keyring for client.mike
# 再次创建用户
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get-or-create client.mike mon 'allow r' osd 'allow rwx pool=mypool'
[client.mike]
key = AQBJ2Q1lT67BAhAACnZZl5BIROQKAVSYVDCCXA==
  1. ceph auth get-or-create-key

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

# 只返回密钥信息
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get-or-create-key client.tom mon 'allow r' osd 'allow rwx pool=mypool'
AQBc2A1l6Cq6IRAA2yPaF3tIliEd0u/uT1NuGQ==

5.4 打印用户的密钥

ceph auth print-key

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

cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth print-key client.tom
AQBc2A1l6Cq6IRAA2yPaF3tIliEd0u/uT1NuGQ==

5.5 修改用户能力

使用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]']

示例:

# 查看用户当前权限
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get client.tom
[client.tom]
key = AQBc2A1l6Cq6IRAA2yPaF3tIliEd0u/uT1NuGQ==
caps mon = "allow r"
caps osd = "allow rwx pool=mypool"
exported keyring for client.tom
# 修改用户权限
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth caps client.tom mon 'allow rw' osd 'allow rw pool=mypool'
updated caps for client.tom
# 查看修改后权限
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get client.tom
[client.tom]
key = AQBc2A1l6Cq6IRAA2yPaF3tIliEd0u/uT1NuGQ==
caps mon = "allow rw" # 权限变为rw
caps osd = "allow rw pool=mypool" # 权限变为rw
exported keyring for client.tom

5.6 删除用户

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

示例:

# 删除
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth del client.tom
updated
# 查询
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get client.tom
Error ENOENT: failed to find client.tom in keyring

5.7 导入用户

使用 ceph auth import 命令并指定密钥文件,可以导入一个或多个用户

ceph auth import -i /path/to/keyring

6. 秘钥环管理

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

当客户端访问ceph集群时,Ceph 客户端会使用本地的 keyring 文件。默认使用下列路径和名称的 keyring 文件:

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

也可以在 ceph.conf 中另行指定 keyring 的路径,但不推荐这样做。

6.1 使用keyring备份用户

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

ceph-authtool --create-keyring FILE

导出用户认证信息至keyring文件

# 创建用户
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get-or-create client.user1 mon 'allow r' osd 'allow * pool=mypool'
[client.user1]
key = AQAK8w1lRIOeORAABhGZRrTX1BcCLLSI8Lz4Hg==
# 验证用户
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get client.user1
[client.user1]
key = AQAK8w1lRIOeORAABhGZRrTX1BcCLLSI8Lz4Hg==
caps mon = "allow r"
caps osd = "allow * pool=mypool"
exported keyring for client.user1
# 创建一个空的 keyring 文件,使用 --create-keyring 或 -C 选项
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph-authtool --create-keyring ceph.client.user1.keyring
creating ceph.client.user1.keyring
# 查看keyring文件,为空文件
cephadmin@ceph-deploy:/data/ceph-cluster$ cat ceph.client.user1.keyring
cephadmin@ceph-deploy:/data/ceph-cluster$ file ceph.client.user1.keyring
ceph.client.user1.keyring: empty
# 导出keyring至指定文件
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get client.user1 -o ceph.client.user1.keyring
exported keyring for client.user1
# 查看指定用户的keyring文件
cephadmin@ceph-deploy:/data/ceph-cluster$ cat ceph.client.user1.keyring
[client.user1]
key = AQAK8w1lRIOeORAABhGZRrTX1BcCLLSI8Lz4Hg==
caps mon = "allow r"
caps osd = "allow * pool=mypool"

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

6.2 使用keyring恢复用户

可以使用ceph auth import -i {filename}​ 指定keyring文件并导入到ceph,起到用户备份和恢复的作用。

# 查看用户认证文件
cephadmin@ceph-deploy:/data/ceph-cluster$ cat ceph.client.user1.keyring
[client.user1]
key = AQAK8w1lRIOeORAABhGZRrTX1BcCLLSI8Lz4Hg==
caps mon = "allow r"
caps osd = "allow * pool=mypool"
# 删除用户
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth del client.user1
updated
# 确认用户被删
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get client.user1
Error ENOENT: failed to find client.user1 in keyring
# 导入用户
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth import -i ceph.client.user1.keyring
imported keyring
# 查看用户已恢复
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph auth get client.user1
[client.user1]
key = AQAK8w1lRIOeORAABhGZRrTX1BcCLLSI8Lz4Hg==
caps mon = "allow r"
caps osd = "allow * pool=mypool"
exported keyring for client.user1

6.3 秘钥环文件多用户

一个keyring文件中可以包含多个不同用户的认证文件。

将多用户导出至秘钥环:

# 创建空的keyring文件
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph-authtool --create-keyring ceph.client.user.keyring
creating ceph.client.user.keyring
# 把admin用户的keyring文件内容导入到user用户的keyring文件
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph-authtool ./ceph.client.user.keyring --import-keyring ./ceph.client.admin.keyring
importing contents of ./ceph.client.admin.keyring into ./ceph.client.user.keyring
# 查看user用户keyring文件内容
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph-authtool -l ./ceph.client.user.keyring
[client.admin]
key = AQDaQAtlGUUQAhAA7kJdEwwNvuC4SDd3Xt731g==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
# 再将user1的keyring导入到user中
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph-authtool ./ceph.client.user.keyring --import-keyring ./ceph.client.user1.keyring
importing contents of ./ceph.client.user1.keyring into ./ceph.client.user.keyring
# 查看user的keyring文件,包含多个用户的认证信息
cephadmin@ceph-deploy:/data/ceph-cluster$ ceph-authtool -l ./ceph.client.user.keyring
[client.admin]
key = AQDaQAtlGUUQAhAA7kJdEwwNvuC4SDd3Xt731g==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
[client.user1]
key = AQAK8w1lRIOeORAABhGZRrTX1BcCLLSI8Lz4Hg==
caps mon = "allow r"
caps osd = "allow * pool=mypool"

posted @   areke  阅读(957)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示