1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

用户身份验证

红帽 Ceph 存储会使用 cephx 协议来授权集群中客户端、应用和守护进程之间的通信。cephx 协议基于共享机密密钥运行。

Ceph 会使用用户帐户实现多种用途:

  • Ceph 守护进程之间的内部通信。

  • 通过 librados 库访问集群的客户端应用。

  • 集群管理员。

Ceph 守护进程使用的帐户具有与相关守护进程相匹配的名称osd.1 或 mgr.serverc,并在安装期间创建。

使用 librados 的客户端应用所用帐户的名称具有 client. 前缀。例如,在将 OpenStack 与 Ceph 集成时,常常会创建专用的 client.openstack 用户帐户

管理员帐户的名称 client.admin ,在您运行管理性命令时,Ceph 会使用 client.admin 帐户,除非您通过 --name 或 --id 选项明确指定了用户名。

需要注意,–id不需要指定前缀,而–name需要前缀

1
2
[root@serverc ~]# ceph health --id admin
[root@serverc ~]# ceph health --name client.admin

Ceph 感知应用的最终用户不在 Ceph 集群中拥有帐户。他们会访问应用,然后由应用代表他们访问 Ceph。从 Ceph 角度来看,应用就是客户端。应用可能会通过其他机制提供自己的用户身份验证。

Keyring 文件

为进行身份验证,客户端需要配置 Ceph 用户名,以及含有该用户机密密钥的密钥环文件。Ceph 会在用户帐户创建时,为每个用户帐户生成密钥环文件。

在运行ceph命令时,会自动加载以下位置的keyring  /etc/ceph/$cluster.$name.keyring,例如,对于 client.openstack 帐户,其密钥环文件为 /etc/ceph/ceph.client.openstack.keyring。如果keyring不在默认位置,就需要指定--keyring

客户端从监控器请求会话密钥。监控器会使用客户端的共享机密密钥加密会话密钥,再将会话密钥提供给客户端。由客户端解密会话密钥,然后再从监控器请求票据,以便对集群守护进程进行身份验证。这与 Kerberos 协议类似,cephx 密钥环文件与 Kerberos keytab 文件相当。

1
2
3
[root@serverc ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQA11VZhyq8VGRAAOus0I5xLWMSdAW/759e32A==

创建和查询Ceph用户

请注意,需要把keyring按照特定的格式放入特定的位置

1
2
3
4
5
6
7
8
[root@serverc ~]# ceph auth get-or-create client.lxh -o /etc/ceph/ceph.client.lxh.keyring
[root@serverc ~]# ceph auth get client.lxh
[client.lxh]
key = AQCekPtkgKknMRAAtvgjIY8kTC1wjx/C8MIPIQ==
exported keyring for client.lxh
[root@serverc ~]# cat /etc/ceph/ceph.client.lxh.keyring
[client.lxh]
key = AQCekPtkgKknMRAAtvgjIY8kTC1wjx/C8MIPIQ==

配置用户授权

您在创建新的用户帐户时,需授予足以授权用户集群任务的集群权限。cephx 中的权限称为功能,您通过守护进程类型(monosdmgr 或 mds)来授予它们。

Cephx Caps

在 cephx 内,对于每个守护进程类型来说,都有多项功能可用:

  • r 授予读取访问权限。每一用户帐户至少应在监控器上具有读取访问权限,以便能够检索 CRUSH 映射。

  • w 授予写入访问权限。客户端需要写入访问权限以在 OSD 上存储和修改对象。对于管理器 (MGR),w 授予启用或禁用模块的权限。

  • x 授予执行扩展对象类的权限。这使得客户端能够在对象上执行额外的操作,如使用 rados lock get 设置锁定或使用 rbd list 列出 RBD 镜像。

  • * 授予完整访问权限。

  • class-read 和 class-write 是 x 的子集。通常会用在 RBD 池中。

创建一个可以读取任何池数据的用户

1
2
3
4
5
6
7
8
9
[root@serverc ~]# ceph auth get-or-create client.lixiaohui mon 'allow r' osd 'allow rw'
[client.lixiaohui]
key = AQCukftkgQf2KxAAir2uDa+zGv1m8VBNd3kvnQ==
[root@serverc ~]# ceph auth get client.lixiaohui
[client.lixiaohui]
key = AQCukftkgQf2KxAAir2uDa+zGv1m8VBNd3kvnQ==
caps mon = "allow r"
caps osd = "allow rw"
exported keyring for client.lixiaohui

可使用配置文件来简化用户访问权限配置

1
2
3
4
5
6
7
8
9
[root@serverc ~]# ceph auth get-or-create client.zhangsan mon 'profile rbd' osd 'profile rbd'
[client.zhangsan]
key = AQAYkvtk56CgIBAABi82zTgmAL01VeW6frIgYA==
[root@serverc ~]# ceph auth get client.zhangsan
[client.zhangsan]
key = AQAYkvtk56CgIBAABi82zTgmAL01VeW6frIgYA==
caps mon = "profile rbd"
caps osd = "profile rbd"
exported keyring for client.zhangsan

配置文件还有很多,如下所示:

能力描述
allow在守护进程的访问权限设置之前。
r为用户提供读取权限。需要用监控器来检索 CRUSH 映射。
w授予用户对对象的写入权限。
x让用户能够调用类方法(即读取和写入)并对监控器执行身份验证操作。
class-read让用户能够调用类读取方法。x 的子集。
class-write让用户能够调用类写入方法。x 的子集。
*授予用户对特定守护进程或池的读取、写入和执行权限,并允许用户执行管理命令。
profile osd授予用户作为 OSD 连接其他 OSD 或监控器的权限。授予 OSD 以便 OSD 能够处理复制心跳流量和状态报告。
profile bootstrap-osd授予用户引导 OSD 的权限,以便他们在引导 OSD 时具有添加密钥的权限。
profile rbd授予用户对 Ceph 块设备的读写权限。
profile rbd-read-only授予用户对 Ceph 块设备的只读权限。

限制访问

下面的例子创建了lixiaohui用户,并给了他对lxhpool池的读写权限:

1
2
3
4
5
6
7
8
9
[root@serverc ~]# ceph auth get-or-create client.lixiaohui mon 'allow r' osd 'allow rw pool=lxhpool'
[client.lixiaohui]
key = AQCvkvtkFO5bLhAA1qPAP8FJpDm963qyKB7y0Q==
[root@serverc ~]# ceph auth get client.lixiaohui
[client.lixiaohui]
key = AQCvkvtkFO5bLhAA1qPAP8FJpDm963qyKB7y0Q==
caps mon = "allow r"
caps osd = "allow rw pool=lxhpool"
exported keyring for client.lixiaohui

通过对象名称前缀,下面的示例限制对任何池中名称以lxh开头的对象的访问

1
2
3
4
5
6
7
8
9
[root@serverc ~]# ceph auth get-or-create client.user2 mon 'allow r' osd 'allow rw object_prefix lxh'
[client.user2]
key = AQD9kvtkFYmzORAAsJ5mKGXbojBuKHEJ2nY98A==
[root@serverc ~]# ceph auth get client.user2
[client.user2]
key = AQD9kvtkFYmzORAAsJ5mKGXbojBuKHEJ2nY98A==
caps mon = "allow r"
caps osd = "allow rw object_prefix lxh"
exported keyring for client.user2

通过namespace,实现namespace来对池中的对象进行逻辑分组,然后可以将用户帐户限制为属于特定namespace的对象:

1
2
3
4
5
6
7
8
9
[root@serverc ~]# ceph auth get-or-create client.user3 mon 'allow r' osd 'allow rw namespace=lixiaohui'
[client.user3]
key = AQAXk/tkcB9RHxAAwwzzTmc9cMVNH39NGNtjaA==
[root@serverc ~]# ceph auth get client.user3
[client.user3]
key = AQAXk/tkcB9RHxAAwwzzTmc9cMVNH39NGNtjaA==
caps mon = "allow r"
caps osd = "allow rw namespace=lixiaohui"
exported keyring for client.user3

通过路径,Ceph文件系统(cepphfs)利用这种方法来限制对特定目录的访问,下面的例子创建了一个新的用户帐户user4,它只能访问/webcontent目录及其内容:

但这个要求你有一个运行中的文件系统

1
2
3
4
5
6
7
8
9
10
11
[root@serverc ~]# ceph fs volume create lxhfs
[root@serverc ~]# ceph fs authorize lxhfs client.user4 /webcontent rw
[client.user4]
key = AQDVk/tkUBcTDRAA8LcsgCV92U3Walt1loWsFA==
[root@serverc ~]# ceph auth get client.user4
[client.user4]
key = AQDVk/tkUBcTDRAA8LcsgCV92U3Walt1loWsFA==
caps mds = "allow rw fsname=lxhfs path=/webcontent"
caps mon = "allow r fsname=lxhfs"
caps osd = "allow rw tag cephfs data=lxhfs"
exported keyring for client.user4

通过monitor命令,这种方法将管理员限制在特定的命令列表中,创建user5用户帐户并限制其访问两个命令的示例如下:

1
2
3
4
5
6
7
8
[root@serverc ~]# ceph auth get-or-create client.user5 mon 'allow r, allow command "auth get-or-create", allow command "auth list"'
[client.user5]
key = AQAelPtkY5yZHBAAPV9UYuD5TdYzbJHD7CcG/g==
[root@serverc ~]# ceph auth get client.user5
[client.user5]
key = AQAelPtkY5yZHBAAPV9UYuD5TdYzbJHD7CcG/g==
caps mon = "allow r, allow command \"auth get-or-create\", allow command \"auth list\""
exported keyring for client.user5

用户管理命令汇总

ceph auth list 查询现有用户

1
2
3
4
5
6
7
8
[root@serverc ~]# ceph auth list | more
installed auth entries:

mds.fs1.serverc.scwhcl
key: AQCFk/tkEVe6GBAAzMlgDnOn5VUIgLWc7MPOaw==
caps: [mds] allow
caps: [mon] profile mds
caps: [osd] allow rw tag cephfs *=*

ceph auth get 获取特定帐户的详细信息

1
2
3
4
5
6
[root@serverc ~]# ceph auth get client.user2
[client.user2]
key = AQD9kvtkFYmzORAAsJ5mKGXbojBuKHEJ2nY98A==
caps mon = "allow r"
caps osd = "allow rw object_prefix lxh"
exported keyring for client.user2

ceph auth print-key 显示用户密钥

1
2
[root@serverc ~]# ceph auth print-key client.user2
AQD9kvtkFYmzORAAsJ5mKGXbojBuKHEJ2nY98A==

ceph auth export、ceph auth import导出以及导入账号

1
2
3
4
5
[root@serverc ~]# ceph auth export client.user2 > user2.dat
export auth(key=AQD9kvtkFYmzORAAsJ5mKGXbojBuKHEJ2nY98A==)

[root@serverc ~]# ceph auth import -i user2.dat
imported keyring

ceph auth get-or-create 创建一个新用户帐户并生成它的密钥,通常会添加-o选项保存密钥,不然只是显示不保存

1
2
3
4
5
6
7
[root@serverc ~]# ceph auth get-or-create client.user7 mon 'allow r' osd 'allow rw' -o /etc/ceph/ceph.client.user7.keyring
[root@serverc ~]# ceph auth get client.user7
[client.user7]
key = AQAHlftk+zzWBRAAByoEqAAQ7sfII62ivz/CQg==
caps mon = "allow r"
caps osd = "allow rw"
exported keyring for client.user7

ceph auth caps 修改用户Caps

将user6的osd中w权限去掉了,定义一个空字符串可以删除所有功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@serverc ~]# ceph auth get client.user6
[client.user6]
key = AQDvlPtk8ColExAARZUl1JhEVBaJjtcL+BJdDg==
caps mon = "allow r"
caps osd = "allow rw"
exported keyring for client.user6
[root@serverc ~]# ceph auth caps client.user6 mon 'allow r' osd 'allow r'
updated caps for client.user6
[root@serverc ~]# ceph auth get client.user6
[client.user6]
key = AQDvlPtk8ColExAARZUl1JhEVBaJjtcL+BJdDg==
caps mon = "allow r"
caps osd = "allow r"
exported keyring for client.user6

ceph auth del 删除用户帐号

1
2
3
[root@serverc ~]# ceph auth del client.user6
updated