Ceph作为一个分布式存储系统,支持对象存储、块设备和文件系统。为了在网络传输中防止数据被篡改,做到较高程度的安全性,加入了Cephx加密认证协议。其目的是识别身份,加密、验证传输中的数据。
cephx 用于对ceph 保存的数据进行认证访问和授权,用于对访问ceph 的请求进行认证和授权检测,与mon 通信的请求都要经过ceph 认证通过,但是也可以在mon 节点关闭cephx认证,但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性。
Client与OSD必须先连接到mon上完成认证,Client才能读写数据。
下面为ceph.conf中的cephx的配置:
$vim /etc/ceph/ceph.conf auth_cluster_required = cephx auth_service_required = cephx auth_client_required = cephx
(1)每个mon 节点都可以对客户端进行身份认证并分发秘钥,因此多个mon 节点就不存在单点故障和认证性能瓶颈。
(2)mon 节点会返回用于身份认证的数据结构,其中包含获取ceph 服务时用到的session key,session key 通过客户端秘钥进行加密,秘钥是在客户端提前配置好的,/etc/ceph/ceph.client.admin.keyring。
(3)客户端使用session key 向mon 请求所需要的服务,mon 向客户端提供一个tiket,用于向实际处理数据的OSD 等服务验证客户端身份,MON 和OSD 共享同一个secret,因此OSD会信任所有MON 发放的tiket。
(4)tiket 存在有效期。
注意:
CephX 身份验证功能仅限制在Ceph 的各组件之间,不能扩展到其他非ceph 组件
Ceph 只负责认证授权,不能解决数据传输的加密问题
2、Ceph的访问流程
无论ceph 客户端是哪种类型,例如块设备、对象存储、文件系统,ceph 都会在存储池中将所有数据存储为对象。
ceph 用户需要拥有存储池pool访问权限,才能读取和写入数据。
ceph 用户必须拥有执行权限才能使用ceph 的管理命令。
(1)Client向mon申请一个有权限可以访问osd的用户,client和mon共享该用户权限信息。
(2)同时该用户也会给mon、mds和osd共享。
(3)Client拿到了授权用户开始向mon认证。
(4)mon通过认证后,会生成一个随机并加密的session key发送给Client.
(5)Client收到mon发送过来的session key并解密后,再向mon发起ticket申请请求。
(6)mon将ticket信息发送给client。
(7)Client接受到mon发来的ticke后,下面开始请求数据。
(8)如果Client访问的是cephfs,client会向mds发送请求;如果Client访问是块存储等设备,则直接向osd发送请求。
用户是指个人(ceph 管理者)或系统参与者(MON/OSD/MDS)。 通过创建用户,可以控制用户或哪个参与者能够访问ceph 存储集群、以及可访问的存储池及存储池中的数据。 ceph 支持多种类型的用户,但可管理的用户都属于client 类型区分用户类型的原因在于,MON/OSD/MDS 等系统组件特使用cephx 协议,但是它们为非客户端。
ceph@ceph-deploy:~$ cat /etc/ceph/ceph.client.admin.keyring [client.admin] key = AQAKyxthqvTaORAA/aUa9o2vAcfalDI+nWaoqg== #admin用户的加密密钥 #下面为admin用户对ceph集群各个组件的管理权限 caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *"
查看指定用户信息:
ceph@ceph-deploy:~$ ceph osd tree ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF -1 0.29228 root default -3 0.07794 host ceph-node01 16 hdd 0.01949 osd.16 up 1.00000 1.00000 17 hdd 0.01949 osd.17 up 1.00000 1.00000 18 hdd 0.01949 osd.18 up 1.00000 1.00000 19 hdd 0.01949 osd.19 up 1.00000 1.00000 -5 0.05846 host ceph-node02 4 hdd 0.01949 osd.4 up 1.00000 1.00000 5 hdd 0.01949 osd.5 up 1.00000 1.00000 6 hdd 0.01949 osd.6 up 1.00000 1.00000 -7 0.07794 host ceph-node03 8 hdd 0.01949 osd.8 up 1.00000 1.00000 9 hdd 0.01949 osd.9 up 1.00000 1.00000 10 hdd 0.01949 osd.10 up 1.00000 1.00000 11 hdd 0.01949 osd.11 up 1.00000 1.00000 -9 0.07794 host ceph-node04 12 hdd 0.01949 osd.12 up 1.00000 1.00000 13 hdd 0.01949 osd.13 up 1.00000 1.00000 14 hdd 0.01949 osd.14 up 1.00000 1.00000 15 hdd 0.01949 osd.15 up 1.00000 1.00000 ceph@ceph-deploy:~$ ceph auth get osd.10 [osd.10] key = AQCn3xth8E1QKhAAiNtNqTYia0PKroZrPTKkBw== caps mgr = "allow profile osd" caps mon = "allow profile osd" caps osd = "allow *" exported keyring for osd.10 #osd.10 用户类型为osd,id号为10 ceph@ceph-deploy:~$ ceph auth get client.admin [client.admin] key = AQAKyxthqvTaORAA/aUa9o2vAcfalDI+nWaoqg== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" exported keyring for client.admin
用户的授权,只有在授权之后,用户才可以使用权限范围内的 MON、OSD、MDS 的功能。
ceph 基于使能/能力(Capabilities,简称caps )来描述用户可针对MON/OSD 或MDS 使用的授权范围或级别。
通用的语法格式:daemon-type ‘allow caps’ [...]
能力一览表:
授权阶段分2种:访问授权和能力授权 访问授权: allow:在守护进程进行访问设置之前就已经具有特定权限,仅对 MDS 隐含 rw r:向用户授予读取权限。访问监视器(mon)以检索CRUSH 运行图时需具有此能力。 w:向用户授予针对对象的写入权限。 x:授予用户调用类方法(包括读取和写入)的能力,以及在监视器中执行auth 操作的能力。 *,all:授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力 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 时有权添加密钥。通常授予部署工具ceph-deploy,让它们在引导 OSD 时就有增加密钥的权限了. profile bootstrap-mds:授予用户引导元数据服务器的权限,授权部署工具权限,使其在引导元数据服务器时有权添加密钥。 profile bootstrap-rbd:授权用户引导 RBD 守护进程的能力,同上 profile bootstrap-rbd-mirror:授权用户引导 rbd-mirror守护进程的能力,同上 profile rbd:授权一个用户可以操作rbd image的权限 profile rbd-mirror:授权一个用户可以操作rbd image的权限和获得osd Mirroring配置秘钥 profile rbd-read-only:授权一个用户只读rbd image的权限
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 集群中创建或删除用户时,可能需要将密钥分发到客户端,以便将密钥添加到密钥环中/etc/ceph/ceph.client.admin.keyring,此文件中可以包含一个或者多个用户认证信息,凡是拥有此文件的节点,将具备访问ceph 的权限,而且可以使用其中任何一个账户的权限,此文件类似于linux 系统的中的/etc/passwd 文件。
1创建用户的流程
要使用 Cephx,集群的管理员(administrator),也就是 client.admin,需要在集群中创建一个用户账号(user account)。要创建用户账号,client.admin 需要调用 ceph auth get-or-create 命令。Ceph 用户验证子系统会产生一 个用户名(username)和一个密钥(secret key),并将它们保存在Ceph monitor 上,再将用户密钥返回给client.admin。Ceph 系统管理员需要将用户名和密码提供给需要安全地访问 Ceph 存储服务的客户端。
ceph@ceph-deploy:~$ ceph auth list osd.10 key: AQCn3xth8E1QKhAAiNtNqTYia0PKroZrPTKkBw== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.11 key: AQC73xthe8HdLhAAPn3Odus1lnVgS33FTKMsOw== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.12 key: AQDY3xthEimIJhAAZBtxRVnGk7lQ4ePrQX/IFg== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.13 key: AQDu3xthFw/BAxAA188g6znSfBhVp0KS2rfuDw== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.14 key: AQBW4BthbLItCRAAZToVdPYXX3OioYSk7drN2A== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.15 key: AQBJ4Rth1J7yEhAAEBjhszfv+/l8Sn8oC5CIwQ== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.16 key: AQDUohxhNOYfFhAAvia7vpPfuAHTJkH+Y//a6g== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.17 key: AQD2ohxheYwbNBAAUJeYKzBkG3DdEytc3oJ04g== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.18 key: AQAioxxhX99KKxAApi1oYobuhiNob/Sya1dHZw== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.19 key: AQBLoxxhNQU1GxAAr9hDPMy/szq/4fEvkcLucQ== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.4 key: AQAe3xthhdCRJRAAB/pYzWMaoBImp79bS0FDWg== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.5 key: AQA03xthXTvYJRAAqkRD4AAo7mlYD7C+u5AmpQ== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.6 key: AQBJ3xthAu98ABAAYjUZPZLY9dc0G+2tyzPHSA== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.8 key: AQB+3xthHQYTABAAVGRxMD3LtfSuCkuasVrLAQ== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * osd.9 key: AQCS3xthK5WJOBAAXQomcwWHG7wgQe/AZrtcLw== caps: [mgr] allow profile osd caps: [mon] allow profile osd caps: [osd] allow * client.admin key: AQAKyxthqvTaORAA/aUa9o2vAcfalDI+nWaoqg== caps: [mds] allow * caps: [mgr] allow * caps: [mon] allow * caps: [osd] allow * client.bootstrap-mds key: AQAKyxthbBHbORAARZ9YWc91MsEpI47n4bBiaQ== caps: [mon] allow profile bootstrap-mds client.bootstrap-mgr key: AQAKyxthhCbbORAAAU6l1aSb76vYWU/U8Ow++w== caps: [mon] allow profile bootstrap-mgr client.bootstrap-osd key: AQAKyxthJzrbORAAeoL4+iqegTQqAAhg51yEYg== caps: [mon] allow profile bootstrap-osd client.bootstrap-rbd key: AQAKyxth+EzbORAABONpnXhO6FmRXZmrQTRqaw== caps: [mon] allow profile bootstrap-rbd client.bootstrap-rbd-mirror key: AQAKyxthNF/bORAAuO3Tx8uZOEOelSW1V2U2sQ== caps: [mon] allow profile bootstrap-rbd-mirror client.bootstrap-rgw key: AQAKyxthNHDbORAARVjOD8xlmwg8pRnG/gdr0g== caps: [mon] allow profile bootstrap-rgw mgr.ceph-mgr01 key: AQB50Bthh1XKDxAAigNmg5O8ROcafDZysfJCgg== caps: [mds] allow * caps: [mon] allow profile mgr caps: [osd] allow * mgr.ceph-mgr02 key: AQCuqxxhtqofCRAAJ4HdN+6Bmv2k8zF8REcIjQ== caps: [mds] allow * caps: [mon] allow profile mgr caps: [osd] allow * installed auth entries:
ceph@ceph-deploy:~$ ceph auth list -o /tmp/ceph_user.key
3用户管理命令
添加一个用户会创建用户名(TYPE.ID)、机密密钥,以及包含在命令中用于创建该用户的所有能力,用户可使用其密钥向Ceph 存储集群进行身份验证。用户的能力授予该用户在Ceph monitor (mon)、Ceph OSD (osd) 或Ceph 元数据服务器(mds) 上进行读取、写入或执行的能力,可以使用以下几个命令来添加用户。
3.1创建用户及获取用户信息
3.1.1 ceph auth add
此命令是添加用户的规范方法。它会创建用户、生成密钥,并添加所有指定的能力。
ceph@ceph-deploy:~$ ceph auth add -h auth add <entity> {<caps> [<caps>...]} ceph@ceph-deploy:~$ ceph osd pool ls device_health_metrics myrbd1 #给pool=myrbd1创建一个client的ywx用户,对mon有r权限,对myrbd1地址池有rwx权限 ceph@ceph-deploy:~$ ceph auth add client.ywx mon ‘allow r‘ osd ‘allow rwx pool=myrbd1‘ added key for client.ywx ceph@ceph-deploy:~$ ceph auth get client.ywx [client.ywx] key = AQAjNCJhFgTkCBAA+Xzg30Mu0F1k7eqGOvEaMw== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1" exported keyring for client.ywx
3.1.2 ceph auth get-or-create
#创建kaka用户 ceph@ceph-deploy:~$ ceph auth get-or-create client.kaka mon ‘allow r‘ osd ‘allow rwx pool=myrbd1‘ [client.kaka] key = AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ== ceph@ceph-deploy:~$ ceph auth get client.kaka [client.kaka] key = AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1" exported keyring for client.kaka #再次创建kaka用户 ceph@ceph-deploy:~$ ceph auth get-or-create client.kaka mon ‘allow r‘ osd ‘allow rwx pool=myrbd1‘ [client.kaka] key = AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ== #注意:该命令为没有创建的用户,则创建用户并显示用户名(在方括号中)和密钥的密钥文;创建的用户已存在,则直接显示用户名(在方括号中)和密钥的密钥文。
3.1.3 ceph auth get-or-create-key
ceph@ceph-deploy:~$ ceph auth get-or-create-key client.kaka mon ‘allow r‘ osd ‘allow rwx pool=myrbd1‘ AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ== #1、仅仅只显示用户密钥key #2、用户有key就显示,没有key就创建
3.1.4 ceph auth print-key
ceph@ceph-deploy:~$ ceph auth print-key client.kaka AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ==
使用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]‘]
案例
#查看上面创建的kaka用户权限 ceph@ceph-deploy:~$ ceph auth get client.kaka [client.kaka] key = AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1" exported keyring for client.kaka #将mon权限改为rw,osd权限改为rw ceph@ceph-deploy:~$ ceph auth caps client.kaka mon ‘allow rw‘ osd ‘allow rw pool=myrbd1‘ updated caps for client.kaka #验证权限 ceph@ceph-deploy:~$ ceph auth get client.kaka [client.kaka] key = AQDBNCJhJAYrFBAAHcvwhjqqUzQuSlNVm8sWWQ== caps mon = "allow rw" caps osd = "allow rw pool=myrbd1" exported keyring for client.kaka
要删除用户使用ceph auth del TYPE.ID,其中TYPE 是client、osd、mon 或mds 之一,ID 是用户名或守护进程的ID。
#删除kaka用户 ceph@ceph-deploy:~$ ceph auth del client.kaka updated ceph@ceph-deploy:~$ ceph auth get client.kaka Error ENOENT: failed to find client.kaka in keyring #无kaka用户
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 #编译后的二进制文件
密钥环文件的创建分为:用户创建--->空的keyring文件创建--->把用户信息导入keyring文件。
#1、创建一个user1的用户文件 ceph@ceph-deploy:~$ ceph auth get-or-create client.user1 mon ‘allow r‘ osd ‘allow rwx pool=myrbd1‘ [client.user1] key = AQCbOyJhNlfvKhAAQz3KBvxKKbOMQi8PJKX3lw== ceph@ceph-deploy:~$ ceph auth get client.user1 [client.user1] key = AQCbOyJhNlfvKhAAQz3KBvxKKbOMQi8PJKX3lw== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1" exported keyring for client.user1 #2、创建一个名为ceph.client.user1.keyring的空的密钥环文件 ceph@ceph-deploy:~$ ceph-authtool --create-keyring ceph.client.user1.keyring creating ceph.client.user1.keyring #是个空文件 ceph@ceph-deploy:~$ file ceph.client.user1.keyring ceph.client.user1.keyring: empty #3、导出user1信息之指定的keyring文件 ceph@ceph-deploy:~$ ceph auth get client.user1 -o ceph.client.user1.keyring exported keyring for client.user1 ceph@ceph-deploy:~$ cat ceph.client.user1.keyring [client.user1] key = AQCbOyJhNlfvKhAAQz3KBvxKKbOMQi8PJKX3lw== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1"
6.2从keyring文件恢复删除的用户认证信息
#1、删除client.user1用户 ceph@ceph-deploy:~$ ceph auth get client.user1 [client.user1] key = AQCbOyJhNlfvKhAAQz3KBvxKKbOMQi8PJKX3lw== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1" exported keyring for client.user1 #删除client.use1 ceph@ceph-deploy:~$ ceph auth del client.user1 updated #验证client.user1用户被删除 ceph@ceph-deploy:~$ ceph auth get client.user1 Error ENOENT: failed to find client.user1 in keyring #2、使用client.user1的keyring恢复用户client.user1的认证信息 ceph@ceph-deploy:~$ ceph auth import -i ceph.client.user1.keyring imported keyring #client.user1信息被恢复 ceph@ceph-deploy:~$ ceph auth get client.user1 [client.user1] key = AQCbOyJhNlfvKhAAQz3KBvxKKbOMQi8PJKX3lw== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1" exported keyring for client.user1
#1、创建一个空的keyring 文件: ceph@ceph-deploy:~$ ceph-authtool --create-keyring ceph.client.user.keyring creating ceph.client.user.keyring #2、将admin用户keyring文件内容导入到user的keyring文件 ceph@ceph-deploy:~$ ceph-authtool --create-keyring ceph.client.user.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring creating ceph.client.user.keyring importing contents of /etc/ceph/ceph.client.admin.keyring into ceph.client.user.keyring #3、验证ceph.client.user.keyring文件 ceph@ceph-deploy:~$ ceph-authtool -l ./ceph.client.user.keyring [client.admin] key = AQAKyxthqvTaORAA/aUa9o2vAcfalDI+nWaoqg== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" #4、再把ceph.client.user1.keyring文件内容信息导入到user的keyrig文件中 ceph@ceph-deploy:~$ ceph-authtool ./ceph.client.user.keyring --import-keyring ./ceph.client.user1.keyring importing contents of ./ceph.client.user1.keyring into ./ceph.client.user.keyring #5、验证ceph.client.user.keyring文件信息 ceph@ceph-deploy:~$ ceph-authtool -l ./ceph.client.user.keyring [client.admin] key = AQAKyxthqvTaORAA/aUa9o2vAcfalDI+nWaoqg== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" [client.user1] key = AQCbOyJhNlfvKhAAQz3KBvxKKbOMQi8PJKX3lw== caps mon = "allow r" caps osd = "allow rwx pool=myrbd1"