本文发布于Cylon的收藏册,转载请著名原文链接~
如果需要与osd打交道,需要通过mon检索集群运行图才能够访问的客户端,通常经由mon认证后才能访问ceph存储。Ceph本身实现了数据服务的认证访问和授权控制机制,CephX协议来实现
CephX Protocol
CephX本身只负责认证和授权检测,不处理通讯过程是否加密。一般来讲需要与moniotr交互的客户端组件(OSD
、RBD
、RGW
等)一般而言都经由CephX认证
CephX认证机制
Ceph使用cephx协议对客户端进行身份认证
- 每个MON都可以对客户端进行身份验正并分发密钥,不存在单点故障和性能瓶颈。(在集群模式下,任何一个monitor在实现认证时是无状态的,每个monitor都能完成身份检验的任务)
- MON会返回用于身份验正的数据结构,其包含获取Ceph服务时用到的session key
- session key通过客户端密钥进行加密,需事先有一个预共享秘钥存在
- 客户端使用session key向MON请求所需的服务。session key只是拿来做中间通讯使用。
- MON向客户端提供一个ticket,用于向实际处理数据的OSD等验正客户端身份。
- MON和OSD共享同一个secret,因此OSD会信任由MON发放的ticket
- ticket存在有效期限
注意:
- CephX身份验正功能仅限制Ceph的各组件之间,它不能扩展到其它非Ceph组件。
- 它并不解决数据传输加密的问题。
为了实现Cephx认证,Ceph服务器端一定会为每一个客户端事先生成一个密码
认证与授权
无论Ceph客户端时何类型,Ceph都会在存储池中将所有的数据存储为对象
Ceph用户需要拥有存储池访问权限才能读取和写入数据
Ceph用户必须拥有执行全年才能使用Ceph管理命令
相关概念
用户
- 用户是指个人或系统参与者(例如应用)
- 通过创建用户,可以控制谁(或哪个参与者)能够访问Ceph存储集群、以及可访问的存储池及存储池中的数据。
- Ceph支持多种类型的用户,单可管理的用户都属于Client类型
- 区分用户种类的原因在于,mon、osd、mds等系统组件也使用cephx协议,但它们非为客户端
- 通过点号来分隔用户类型和用户名,格式为
TYPE.ID
,例如:client.admin
等
授权
使能(Capabilities)
- Ceph基于"使能(caps)“来描述用户可针对MON、OSD或MDS使用的权限范围或级别。
- 通用语法格式:
daemon-type'allow caps[...]
- MON使能
- 包括r、w、x和allow profile cap
- 例如:mon
allow rwx
,以及monallow profile
osd’等。
- OSD使能
- 包括r、w、x、
class-read
、class-write
和profile osd
- 此外,OSD使能还允许进行存储池和名称空间设置。如为指定表示对所有OSD所有存储池都获得相关授权
- 包括r、w、x、
- MDS使能
- 只需要allow,或留空
各使能的意义
-
allow
- 需先于守护进程的访问设置指定
- 仅对MDS表示rw之意,其它的表示字面意义
-
r
:读取权限,访问MON以检索CRUSH时依赖此使能 -
w
:对象写入权限 -
x
:调用类方法(读取和写入)的能力,以及在MON上执行auth操作的能力。 -
class-read:x能力的子集,授予用户调用类读取方法的能力
-
class-write:x的子集,授予用户调用类写入方法的能力
-
·*
:授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力。 -
profile osd
- 授予用户以某个OSD身份连接到其他OSD或监视器的权限
- 授予OSD权限,使OSD能够处理复制检测信号流量和状态报告
-
profile mds
- 授予用户以某个MDS身份连接到其他MDS或监视器的权限
-
profile bootstrap-osd
- 授予用户引导OSD的权限
- 授权给部署工具,使其在OSD加入集群时,引导OSD时有权添加密钥
-
profile bootstrap-mds
- 授予用户引导元数据服务器的权限
- 授权给部署工具,使其在引导元数据服务器时有权添加密钥
用户管理
-
keyring 保存在ceph集群内部的整体信息,统一的账号存储文件,存放多个用户及其秘钥信息
-
keyring file:单独被导出的文件,如
ceph.client.admin.keyring
-
Ceph集群管理员能够直接在Ceph集群中创建、更新和删除用户·创建用户时,可能需要将密钥分发到客户端,以便将密钥添加到==密钥环==
-
列出用户
- 命令:
ceph auth list
- 用户标识:
TYPE.ID
,因此,osd.0表示OSD类型的用户 (osd专用于系统参与者不是真正客户端用户)。,用户ID为0
- 命令:
-
检索特定用户
- 命令:
ceph auth get TYPE.ID
或者ceph auth export TYPE.ID
- 命令:
-
添加用户
-
ceph auth add
:规范方法,它能够创建用户、生成密钥并添加指定的capsceph auth get-or-create
:简便方法,创建用户并返回密钥文件格式的密钥信息,或者在用户存在时返回用户名及密钥文件格式的密钥信息$ ceph auth add client.testuser mon 'allow r' osd 'allow rw pool=rbdpool' added key for client.testuser $ ceph auth get client.testuser exported keyring for client.testuser [client.testuser] key = AQBuyw5d+GcJBxAAYF3dkO4qcAA/B/gOt91T1Q== caps mon = "allow r" caps osd = "allow rw pool=rbdpool"
-
ceph auth get-or-create-key
:简便方法,创建用户并返回密钥信息,或者在用户存在时返回密钥信息
-
注意:典型的用户至少对Ceph monitor 具有读取功能,并对Ceph OSD具有读取和写入功能;另外,用户的OSD权限通常应该限制为只能访问特定的存储池,否则,他将具有访问集群中所有存储池的权限
-
列出用户秘钥
ceph auth print-key {TYPE.ID}
-
导入用户
ceph auth import
需要指定秘钥环
-
修改用户caps
ceph auth caps
- 会覆盖用户现有的caps,因此建立事先使用
ceph auth get {TYPE.ID}
命令查看用户的caps - 若是为添加caps,则无需先指定现有的caps
- 命令格式:
ceph auth caps {TYPE.ID} daemon 'allow [r|w|x|*|...] [{pool=pool-name}]
$ ceph auth caps client.testuser mon 'allow rw' osd 'allow rw pool=rbdpool' updated caps for client.testuser $ ceph auth get client.testuser exported keyring for client.testuser [client.testuser] key = AQBuyw5d+GcJBxAAYF3dkO4qcAA/B/gOt91T1Q== caps mon = "allow rw" caps osd = "allow rw pool=rbdpool"
-
删除用户
ceph auth del {TYPE.ID}
keyring
keyring是一个集合,能够同时存储secret、password、keys、certificates并且使得他们能够被某一个应用程序能用的文件的集合。
任何一个客户端在联系monitor时,会查找本地适用于当前应用程序的keyring文件,以获取自己能够认证的ceph集群的认证信息。
ceph-authtool
用来创建、修改、查看keyring文件的内容
访问Ceph集群时,客户端会于本地查找密钥环,默认情况下,Ceph会使用以下四个密钥环名称预设密钥环
- /etc/ceph/{cluster-name}.{user-name}.keyring: 保存单个用户的keyring
- /etc/ceph/cluster.keyring: 保存多个用户的keyring
- /etc/ceph/keyring
- /etc/ceph/keyring.bin:二进制格式,被编码后
{cluster-name}是为集群名称,{user-name}是为用户表示{TYPE.ID}
client.admin用户的在名为ceph的集群上的密钥环文件名为ceph.client.admin.keyring
管理keyring
创建keyring
ceph auth add
等命令添加的用户还需要额外使用ceph-authtool命令为其创建用户秘钥- ceph客户端通过keyring文件查找用户名并检索秘钥,命令:
ceph-authtool --create-keyring /path/to/keyring
注意
- keyring文件一般应该保存于
/etc/ceph
目录中,以便客户端能自动查找 - 创建包含多个用户的keyring文件时,应该使用`cluster-name.keyring``为文件名
- 创建仅包含单个用户的kerying文件时,应该使用cluster-name.user-name.keyring作为文件名
将用户添加至keyring
- 可将某个用户从包含多个用户的keyring中导出,并保存于一个专用的keyring文件,
- ==命令==:
ceph auth get TYPE.ID -o /etc/ceph/cluster-name.user-name.keyring
- ==命令==:
- 也可将用户的keyring合并至一个统一的keyring文件中,
- ==命令==:
ceph-authtool /etc/ceph/cluster-name.keyring -import-key /etc/ceph/cluster- name.user-name.keyring
- ==命令==:
使用ceph-authtool命令管理用户
ceph-authtool
命令可以直接创建用户、授权caps并创建keyring
ceph-authtool keyringfile
[-C | --create-keyring]
[-n | --name entityname] [--gen-key]
[-a | --add-key base64_key] [--cap | --caps capfile]
命令选项
-C,--create-keyring
:创建一个新的密钥环,覆盖任何现有的密钥环文件--gen-key
:将为指定的实体名生成新的密钥--add-key
:将为密钥环添加编码密钥--cap subsystem capability
将设置给定子系统cap文件的功能--caps capfile
将为所有子系统设置与给定密钥关联的所有功能
注意:此种方式添加的用户仅存在于keyring文件中,管理员还需要额外将其添加至Ceph集群上
- 命令:
ceph auth add {TYPE.ID} -i /PATH/TO/keyring
创建k8s使用的账号
$ ceph auth get-or-create client.kube mon 'allow r' osd 'allow * pool=kube'
[client.kube]
key = AQAwfA9dff8nGRAAMsF1VlKRPS/NEFOnB057OQ==
$ ceph auth get client.kube
exported keyring for client.kube
[client.kube]
key = AQAwfA9dff8nGRAAMsF1VlKRPS/NEFOnB057OQ==
caps mon = "allow r"
caps osd = "allow * pool=kube"
$ ceph auth get client.kube -o ./ceph.client.kube.keyring
exported keyring for client.kube
ceph-authtool --create-keyring cluster.keyring
ceph-authtool cluster.keyring --import-keyring ./ceph.client.kube.keyring
ceph-authtool cluster.keyring --import-keyring ./ceph.client.admin.keyring
本文发布于Cylon的收藏册,转载请著名原文链接~
链接:https://www.oomkill.com/2019/06/07-1-cephx/
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。