CephX 认证机制 (五)
Ceph使用cephx协议对客户端进行身份认证
cephx用于对ceph保存的数据进行认证访问和授权,用于对访问ceph的请求进行认证和授权检测,与mon通信的请求都要经过ceph认证通过,但是也可以在mon节点关闭cephx认证,但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性,
5.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 只负责认证授权,不能解决数据传输的加密问题
5.2 访问流程
无论ceph客户端是哪种类型,例如块设备、对象存储、文件系统,ceph 都会在存储池中将所有数据存储为对象:
ceph用户需要拥有存储池访问权限,才能读取和写入数据
ceph用户必须拥有执行权限才能使用ceph的管理命令
查看key
cephaceph-dep Loy:~/ ceph-cluster$ cat ceph. C lient . admin. key ring
[client. admin]
key = AQA3dhdhMd/UABAAr 2SNpJ+hcK1dD5 L2Hj 5XMg==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
5.3 ceph用户
用户是指个人(ceph管理者)或系统参与者**(MON/OSD/MDS)**.
通过创建用户,可以控制用户或哪个参与者能够访问ceph存储集群、以及可访问的存储池及存储池中的数据。
ceph支持多种类型的用户,但可管理的用户都属于client类型区分用户类型的原因在于, MON/OSD/MDS 等系统组件特使用cephx协议,但是它们为非客户端。
通过点号来分割用户类型和用户名,格式为TYPE.ID,例如client. admin 通常容器和服务器使用client类型
cephaceph-dep Loy:~/ ceph-cluster$ cat ceph.Client.admin.key ring
[client.admin]
key = AQA3dhdhMd/UABAAr 2SNpJ+hcK1dD5 L2Hj 5XMg==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
5.3.1 列出指定用户信息:
(ceph@ceph-deploy ceph-cluster]$ ceph auth get osd.10
exported keyring for osd.10
[osd.10]
key = AQCKF6JfL aEpBRAAbY/P +cHPFPUtnkzljruyXw==
caps mgr = "allow profile osd"
caps mon = "allow profile osd"
caps osd = "allow
[ceph@ceph-deploy ceph-cluter$ ceph auth get client.admin
exported keyring for client.admin
[client.admin]
key = AQAGDKJfQk/dAxAA3Y +9xoE/p8in6QjoHeXmeg==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
5.4 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 'llow capability' [pool=poolname] [namespace =namespace-name]
MDS能力:
只需要allow 或空都表示允许.
mds 'allow'
5.5 ceph用户管理
用户管理功能可让 Ceph集群管理员能够直接在 Ceph集群中创建更新和删除用户。
在Ceph集群中创建或删除用户时,可能需要将密钥分发到客户端,以便将密钥添加到密钥环文件中/etc/ceph/ceph.client.admin.keyring
,此文件中可以包含一个或 者多个用户认证信息,凡是拥有此文件的节点,将具备访问ceph的权限,而且可以使用其中任何一个账户的权限,此文件类似于linux系统的中的**/etc/passwd**文件.
注意: TYPEID 表示法针对用户采用TYPE.ID表示法 例如osd.0指定是osd类并且ID为0的用户(节点), client.admin是client类型的用户,其ID为admin, 另请注意,每个项包含一个 key=xxx项,以及一个或多个caps项。 可以结合使用-0文件名选项和ceph auth list 将输出保存到某个文件, [ceph@ceph-deploy ceph-cluster]$ ceph auth list -o 123.key
添加一个用户会 创建用户名(TYPE.ID). 机密密钥,以及包含在命令中用于创建该用户的所有能力,用户可使用其密钥向Ceph 存储集群进行身份验证。
用户的能力授予该用户在Ceph monitor (mon)、Ceph OSD (osd)或Ceph元数据服务器(mds) 上进行读取、写入或执行的能力,可以使用以下几个命令来添加用户:
5.5.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'
added key for client.tom
#tom用户 只能在mypool存储池对mon有读权限、对osd有读写执行权限
#验证key
[ceph@ceph-deploy ceph-cluster]$ ceph auth get client.tom
exported keyring for client.tom
[client.tom]
key = AQCErsdftuumL BAADUiAfQUI42ZIX1e/4PjpdA==
caps mon = "allow r"
caps osd = "allow rwx pool=mypool"
exported keyring for client.tom
5.5.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'
[client.jack]
key = AQAtr8dfi37XMhAADbHWEZOshY1QZ5A8eBpeoQ==
#验证用户
[ceph@ceph-deploy ceph-clusterI$ ceph auth get client.jack
exported keyring for cliet,jack
[client.jack]
key = AQAtr8dfi37XMhAADbHWEZOshY1QZ5A8eBpeoQ==
caps mon="allow r"
caps osd ="allow rwx pool=mypool"
#再次创建就不会创建了会打印key信息
[ceph@ceph-deploy ceph-cluster]$ ceph auth get-or-create client.jack mon 'allow r
osd 'allow rwx pool=mypool
[client.jack]
key = AQAtr8dfiI37XMhAADbHWEZ0shY1QZ5A8eBpeoQ==
5.5.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'
AQAtr8dfi37XMhAADbHWEZ0shY1QZ5A8eBpeoQ== #用户有key就显示没有就创建
5.5.4 ceph auth print-key
只获取单个指定用户的key信息
[ceph@ceph-deploy ceph-cluster$ ceph auth print-key client.jack
AQAtr8dfi37XMhAADbHWEZ0shY 1QZ5A8eBpeoQ==
5.5.5 修改用户能力
使用ceph auth caps
命令可以指定用户以及更改该用户的能力,设置新能力会完全覆盖当前的能力,因此要加上之前的用户已经拥有的能和新的能力,如果看当前能力,可以运行ceph auth get USERTYPE.USERID
,如果要添加能力,使用以下格式时还需要指定现有能力:
权限修改后立即生效
#查看用户当前权限
[ceph@ceph-deploy ceph-cluster]$ ceph auth get client.jack
exported keyring for client.jack
[client.jack]
key = AQAtr8dfi37XMhAADbHWEZ0shY1QZ5A8eBpeoQ==
caps mon = "allow r"
caps osd = "allw rwx pool=mypool"
#修改用户权限
[ceph@ceph-deploy ceph-cluster]$ ceph auth caps client.jack mon 'allow r' osd 'allow rw pool=mypool'
updated caps for client.jack
#再次验证权限
[ceph@ceph-deploy ceph-cluster]$ ceph auth get client.jack
exported keyring for client.jack
5.5.6 删除用户
要删除用户使用ceph auth del TYPE.ID
,其中TYPE是client. osd. mon 或mds之一,
ID是用户名或守护进程的ID.
[ceph@ceph-deploy ceph-cluster]$ ceph auth del client.tom
updated
5.6 秘钥环管理
ceph的秘钥环是一个保存了secrets、keys 、certificates并且能够让客户端通认证访问ceph
的keyring file(集合文件),一个keyring file可以保存一个或者多个认证信息,每一个 key都
有一个实体名称加权限,类型为:{client、mon、mds、osd)}.name
当客户端访问ceph集群时,ceph 会按顺序依次使用以下四个密钥环文件预设置密钥环设置:
集群名词 + 用户类型 +用户ID+固定后缀/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 通过秘钥环文件备份与恢复用户
如果误删除账号可以通过秘钥环恢复用户,主要是key不会变(k8s 几十几百个pod)
使用ceph auth add
等命令添加的用户还需要额外使用ceph-authtool
命令为其创建用户秘
钥环文件.
先创建空 keyring文件命令格式:
ceph-authtool --create-keyring FILE
导出用户认证信息至keyring文件:
将用户信息导出至keyring文件,对用户信息进行备份。
#创建用户:
(ceph@ceph-deploy ceph cluster]$ ceph auth get-or-create client.user1 mon 'allow r' osd 'allow *pool=mypool'
[client.user1]
key =AQAUUchfjpMqGRAARV6h0ofdDEneuaRnxuHjoQ==
#验证用户
[ceph@ceph-deploy ceph-clusterl$ ceph auth get client.user1
exported keyring for client.user1
[client.user1]
key = AQAUUchfjpMqGRAARV6hOofdDEneuaRnxuHjoQ==
caps mon = "allow r"
caps osd = "allow *pool=mypool"
#创建keyring文件:
(ceph@ceph-deploy ceph-cluster]$ ceph-authtool --create-keyring ceph.client.user1.keyring
#验证keyring文件:
[ceph@ceph-deploy ceph-cluster]$ cat ceph.client.user1.keyring
#是个空文件
[ceph@ceph-deploy ceph-cluster]$ file ceph.client.user1.keyring
ceph.client.user1.keyring: empty
#导出keyring至指定文件
[ceph@ceph-deploy ceph-cluster]$ceph auth get client.user1 -o ceph.client.user1.keyring
exported keyring for client.user1
#验证指定用户的keyring文件:
[ceph@ceph-deploy ceph-cluster]$ cat ceph.client.user1.keyring
[client.user1]
key = AQAUUchfjpMqGRAARV6hOofdDEneuaRnxuHjoQ==
caps mon = "allow r"
caps osd = "allow * pool=mypool"
在创建包含单个用户的密钥环时,通常建议使用ceph集群名称、用户类型和用户名及
keyring来命名,并将其保存在**/etc/ceph** 目录中,例如为client.user1用户创建
ceph.client.user1.keyring
5.6.2 从keyring文件恢复用户认证信息
可以使用ceph auth import +指定keyring文件并导人到ceph,其实就是起到用户备份和恢复的目的:
[ceph@ceph-deploy ceph-cluster]$ ceph auth import -i ceph.client.user1.keyring
#导入用户
5.6.3 秘钥环文件添加多用户
一个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文件:
[ceph@ceph-deploy ceph-cluster]$ ceph-authtool -I ./ceph.client.user.keyring
[client.admin]
key = AQAGDKJfQk/dAxAA3Y +9xoE/p8in6QjoHeXmeg==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"
#再导入一个其他用户的keyring:
(ceph@ceph-deploy ceph-cluster]$ceph-authtool ./ceph.client.user.keyring --import-kevring ./ceph.client.user1.kevring
#再次验证keyring文件是否包含多个用户的认证信息:
[ceph@ceph-deploy ceph-cluster]$ ceph- authtool -I ./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"