Ceph使用Cephx协议对客户端进行身份认证
Cephx 用于对ceph保存的数据进行认证访问和授权,用于对访问ceph的请求进行认证和授权监测,与mon通信的请求都要经过ceph认证通过,但是也可以在mon节点关闭cephx认证,但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性。
一、授权流程
每个mon节点都可以对客户端进行身份认证并分发密钥,因此多个mon节点就不存在单点故障和认证性能瓶颈。
mon节点会返回用户身份认证的数据结构,其中包含获取ceph服务时用到的session key
, session key
通过客户端密钥进行加密传输,而密钥是在客户端提前配置好的,保存在/etc/ceph/ceph.client.admin.keyring
文件中。
客户端使用sessionkey 向mon请求所需要的服务,mon想客户端提供一个tiket,用于向实际处理数据的OSD等服务验证客户端身份,mon和osd共享同一个secret,因此osd会信任所有的mon发放的tiket。
tiket存在有效期,过期后重新发放
注意:
Cephx身份验证功能仅限制在Ceph的各组件之间,不能扩展到非ceph组件
Ceph只负责认证授权,不能解决数据传输的加密问题
二、访问流程
不管ceph客户端是那种类型,例如块、对象存储、文件存储,ceph都会在存储池中将所有数据存储为对象:
ceph用户需要拥有存储池访问权限,才能读取和写入数据
ceph用户必须拥有执行权限才能使用ceph的管理命令
CephFS MDS 的访问流程:
三、Ceph用户
用户指个人(Ceph管理者)或系统参与者(Mon/OSD/MDS)
通过创建用户,可以控制用户或哪个参与者能够访问ceph存储集群、以及可访问的存储池及存储池中的数据。
ceph支持多种类型的用户,但可管理的用户都属于client类型
区分用户类型的原因在于,Mon/Osd/Mds 等系统组件使用Cephx协议,但是他们非客户端。
通过点号来分割用户类型和用户名,格式为TYPE.ID 例如client.admin
[root@ceph-node2 ~]# cat /etc/ceph/ceph.client.admin.keyring
[client.admin]
key = AQAGDKJfQk/dAxAA3Y+9xoE/p8in6QjoHeXmeg==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
列出指定用户信息
root@ceph-deploy:~# ceph auth get osd.10
[osd.10]
key = AQAOh81mFjxVDxAAQaIOklEU2W88yIj66SPZtg==
caps mgr = "allow profile osd"
caps mon = "allow profile osd"
caps osd = "allow *"
root@ceph-deploy:~# ceph auth get client.admin
[client.admin]
key = AQCncc1m+yLoLhAALvzfM1AlURwPTwvKnAQE6A==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
ceph 授权和使能
ceph 基于使能/能力(Capabilities,简称 caps )来描述用户可针对 MON/OSD 或 MDS 使用的授权范围或级别。
通用的语法格式:daemon-type ‘allow 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:授予用户引导元数据服务器的权限,授权部署工具权限,使其在引导元数据服务器时有权添加密钥。
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'
四、Ceph用户管理
用户管理功能可让 Ceph 集群管理员能够直接在 Ceph 集群中创建、更新和删除用户。在 Ceph 集群中创建或删除用户时,可能需要将密钥分发到客户端,以便将密钥添加到密钥环文件中/etc/ceph/ceph.client.admin.keyring,此文件中可以包含一个或者多个用户认证信息,凡是拥有此文件的节点,将具备访问 ceph 的权限,而且可以使用其中任何一个账户的权限,此文件类似于 linux 系统的中的/etc/passwd 文件。
列出用户
root@ceph-deploy:~# ceph auth list
mds.ceph-mgr1
key: AQByYdFmgToqDhAA3GC/gUfVhjgrPd1npRC+9A==
caps: [mds] allow
caps: [mon] allow profile mds
caps: [osd] allow rwx
osd.0
key: AQBLhs1mZIBIARAAEG2DkgZZWp3sdgalnvBeCQ==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
osd.1
key: AQB/hs1mw6psIBAA7WE+6COvw0RZ/g9u/h81vg==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
client.admin
key: AQCncc1m+yLoLhAALvzfM1AlURwPTwvKnAQE6A==
caps: [mds] allow *
caps: [mgr] allow *
caps: [mon] allow *
caps: [osd] allow *
client.bootstrap-mds
key: AQCncc1mHkHoLhAA1rz/MW3yrkJ0JWrXjY4u2w==
caps: [mon] allow profile bootstrap-mds
client.bootstrap-mgr
key: AQCncc1mglDoLhAAuynt1dT57T6g5fKC+UqpIw==
caps: [mon] allow profile bootstrap-mgr
client.bootstrap-osd
key: AQCncc1mvmDoLhAAjEEJLZXO9V8Iwy6/Jomx9w==
caps: [mon] allow profile bootstrap-osd
client.bootstrap-rbd
key: AQCncc1mn23oLhAAwyx0Hf4w0IPldlKhws3GZw==
caps: [mon] allow profile bootstrap-rbd
client.bootstrap-rbd-mirror
key: AQCncc1mEHroLhAAIHxbkdbO6kP3rw3nS1YvyQ==
caps: [mon] allow profile bootstrap-rbd-mirror
client.bootstrap-rgw
key: AQCncc1mO4boLhAAp5nR2KnhfBt9JsaApf720Q==
caps: [mon] allow profile bootstrap-rgw
client.rgw.ceph-mgr2
key: AQDnYNFml/jfEBAA1pTXr2sYPhKVTrz7MGAcEQ==
caps: [mon] allow rw
caps: [osd] allow rwx
mgr.ceph-mgr1
key: AQDmeM1mha0LNRAA1ZjBa+D0UXrM+z2wRSYoQA==
caps: [mds] allow *
caps: [mon] allow profile mgr
caps: [osd] allow *
mgr.ceph-mgr2
key: AQBWItFmxol7LhAAar46VWVplbWj8nOAqiEIFg==
caps: [mds] allow *
caps: [mon] allow profile mgr
caps: [osd] allow *
注意:TYPE.ID 表示法
针对用户采用TYPE.ID表示法,例如osd.0 指定是osd类并且ID为0的用户(节点),client.admin是client类型的用户,其ID为admin
每一项包含一个key=xxx项,以及一个或多个caps项
可以结合使用-o 文件名选项和 ceph auth list
将输出保存到某个文件
[cephadmin@ceph-deploy ceph-cluster]$ ceph auth list -o 123.key
用户管理
添加一个用户会创建用户名 (TYPE.ID)、机密密钥,以及包含在命令中用于创建该用户的所有能力,用户可使用其密钥向 Ceph 存储集群进行身份验证。用户的能力授予该用户在 Ceph monitor (mon)、Ceph OSD (osd) 或 Ceph 元数据服务器 (mds) 上进行读取、写入或执行的能力,可以使用以下几个命令来添加用户:
ceph auth add
此命令是添加用户的规范方法。它会创建用户、生成密钥。并添加所指定的能力
[cephadmin@ceph-deploy ceph-cluster]$ ceph auth -h
auth add <entity> {<caps> [<caps>...]}
#添加认证 key:
[cephadmin@ceph-deploy ceph-cluster]$ ceph auth add client.dujie mon 'allow r' osd 'allow rwx
pool=mypool' added key for client.tom
#验证 key
root@ceph-deploy:~# ceph auth get client.dujie
[client.dujie]
key = AQDkYNVmNx/OHBAADWOHI+cUhTNKgxo9V3z62w==
caps mon = "allow r"
caps osd = "allow rwx pool=mypool"
ceph auth get-or-create
ceph auth get-or-create 此命令是创建用户较为常见的方式之一,它会返回包含用户名(在方括号中)和密钥的密钥文,如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥,还可以使用 -o 指定文件名选项将输出保存到某个文件。
root@ceph-deploy:~# ceph auth get-or-create client.jack mon 'allow r' osd 'allow rwx pool=mypool'
[client.jack]
key = AQDmcNVmU4CKChAAFSajNWSssyRUvurDCDvn0g==
root@ceph-deploy:~#
root@ceph-deploy:~# ceph auth get client.jack
[client.jack]
key = AQDmcNVmU4CKChAAFSajNWSssyRUvurDCDvn0g==
caps mon = "allow r"
caps osd = "allow rwx pool=mypool"
ceph auth get-or-create-key
此命令是创建用户并仅返回用户密钥,对于只需要密钥的客户端(例如 libvirt),此命令非常有用。如果该用户已存在,此命令只返回密钥。可以使用 -o 文件名选项将输出保存到某个文件。
创建客户端用户时,可以创建不具有能力的用户。不具有能力的用户可以进行身份验证,但不能执行其他操作,此类客户端无法从监视器检索集群地图,但是,如果希望稍后再添加能力,可以使用 ceph auth caps 命令创建一个不具有能力的用户。
典型的用户至少对 Ceph monitor 具有读取功能,并对 Ceph OSD 具有读取和写入功能。此外,用户的 OSD 权限通常限制为只能访问特定的存储池。
root@ceph-deploy:~# ceph auth get-or-create-key client.jack mon 'allow r' osd 'allow rwx pool=mypool'
AQDmcNVmU4CKChAAFSajNWSssyRUvurDCDvn0g== # 用户有key就显示,没有就创建
ceph auth print-key
只获取单个指定用户的key信息
[cephadmin@ceph-deploy ceph-cluster]$ ceph auth print-key client.jack
AQDmcNVmU4CKChAAFSajNWSssyRUvurDCDvn0g==
修改用户能力
使用 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]’]
例如:
# 查看用户当前权限
root@ceph-deploy:~# ceph auth get client.dujie
[client.dujie]
key = AQDkYNVmNx/OHBAADWOHI+cUhTNKgxo9V3z62w==
caps mon = "allow r"
caps osd = "allow rwx pool=mypool"
# 修改用户权限
root@ceph-deploy:~# ceph auth caps client.dujie mon 'allow r' osd 'allow rw pool=mypool'
updated caps for client.dujie
# 再次验证权限
root@ceph-deploy:~# ceph auth get client.dujie
[client.dujie]
key = AQDkYNVmNx/OHBAADWOHI+cUhTNKgxo9V3z62w==
caps mon = "allow r"
caps osd = "allow rw pool=mypool"
删除用户
要删除用户使用 ceph auth del TYPE.ID,其中 TYPE 是 client、osd、mon 或 mds 之一,ID 是用户名或守护进程的 ID。
root@ceph-deploy:~# ceph auth del client.jack
五、密钥环管理
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 # 编译后的二进制文件
通过密钥环文件备份与恢复用户
使用 ceph auth add 等命令添加的用户还需要额外使用 ceph-authtool 命令为其创建用户秘钥环文件。
创建 keyring 文件命令格式:
ceph-authtool --create-keyring FILE
导出用户认证信息到keyring文件
将用户信息导出至 keyring 文件,对用户信息进行备份。
root@ceph-deploy:~# ceph auth get-or-create client.wangwu mon 'allow r' osd 'allow * pool=mypool'
[client.wangwu]
key = AQDLctVma52iOhAA6MeV/hCw+92219orj+JJ5A==
root@ceph-deploy:~# ceph auth get client.wangwu
[client.wangwu]
key = AQDLctVma52iOhAA6MeV/hCw+92219orj+JJ5A==
caps mon = "allow r"
caps osd = "allow * pool=mypool"
root@ceph-deploy:~# ceph-authtool --create-keyring ceph.client.wangwu.keyring
creating ceph.client.wangwu.keyring
root@ceph-deploy:~# cat ceph.client.wangwu.keyring
root@ceph-deploy:~# file ceph.client.wangwu.keyring
ceph.client.wangwu.keyring: empty
root@ceph-deploy:~# ceph auth get client.wangwu -o ceph.client.wangwu.keyring
root@ceph-deploy:~# cat ceph.client.wangwu.keyring
[client.wangwu]
key = AQDLctVma52iOhAA6MeV/hCw+92219orj+JJ5A==
caps mon = "allow r"
caps osd = "allow * pool=mypool"
在创建包含单个用户的密钥环时,通常建议使用 ceph 集群名称、用户类型和用户名及 keyring来 命 名 , 并 将 其 保 存 在 /etc/ceph 目 录 中 。 ·例 如 为 client.user1 用 户 创 建ceph.client.user1.keyring·。
从keyring文件恢复用户认证信息
可以使用 ceph auth import -i 指定 keyring 文件并导入到 ceph,其实就是起到用户备份和恢复的目的
root@ceph-deploy:~# cat ceph.client.wangwu.keyring
[client.wangwu]
key = AQDLctVma52iOhAA6MeV/hCw+92219orj+JJ5A==
caps mon = "allow r"
caps osd = "allow * pool=mypool"
root@ceph-deploy:~# ceph auth del client.wangwu
root@ceph-deploy:~# ceph auth get client.wangwu
Error ENOENT: failed to find client.wangwu in keyring
root@ceph-deploy:~# ceph auth import -i ceph.client.wangwu.keyring
root@ceph-deploy:~#
root@ceph-deploy:~# ceph auth get client.wangwu
[client.wangwu]
key = AQDLctVma52iOhAA6MeV/hCw+92219orj+JJ5A==
caps mon = "allow r"
caps osd = "allow * pool=mypool"
密钥环文件多用户
一个keyring文件中可以包含多个不同用户的认证文件
#创建 keyring 文件:
$ ceph-authtool --create-keyring ceph.client.user.keyring #创建空的 keyring 文件
creating ceph.client.user.keyring
#把指定的 admin 用户的 keyring 文件内容导入到 user 用户的 keyring 文件:
$ceph-authtool ./ceph.client.user.keyring --import-keyring ./ceph.client.admin.keyring
importing contents of ./ceph.client.admin.keyring into ./ceph.client.user.keyring
#验证 keyring 文件:
[cephadmin@ceph-deploy ceph-cluster]$ ceph-authtool -l ./ceph.client.user.keyring
[client.admin]
key = AQAGDKJfQk/dAxAA3Y+9xoE/p8in6QjoHeXmeg==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
#再导入一个其他用户的 keyring:
[cephadmin@ceph-deploy 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
#再次验证 keyring 文件是否包含多个用户的认证信息:
[cephadmin@ceph-deploy ceph-cluster]$ ceph-authtool -l ./ceph.client.user.keyring
[client.admin]
key = AQAGDKJfQk/dAxAA3Y+9xoE/p8in6QjoHeXmeg==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
[client.user1]
key = AQAUUchfjpMqGRAARV6h0ofdDEneuaRnxuHjoQ==
caps mon = "allow r"
caps osd = "allow * pool=mypool"