文章目录
ceph认证流程
ceph使用cephx协议对对客户端进行身份验证
所有对于ceph的访问请求都要经过cephx认证,ceph默认已经开启了cephx认证,也可以在mon节点关闭cephx认证,但是关闭认证后任何访问都将被允许,因此无法保证数据的安全性。
每个mon节点都可以对客户端进行身份认证并分发密码,因此多个mon节点就不存在单点故障和认证性能瓶颈。
认证过程中,mon节点会返回用于身份认证的数据结构,其中包括获取ceph服务时用到的session-key,session-key通过客户端密钥进行加密传输,而密钥是客户端提前配置好的,保存在客户端的keyring文件中
客户端使用session-key向mon请求所需服务,mon向客户端提供一个ticket,用于向实际处理数据的OSD等服务验证客户端身份,MON和其它ceph组件共享同一个secret,因此OSD会信任MON所发放的ticket。
需要注意两点:
- cephx的身份验证功能仅限制在Ceph的各组件之间,不能扩展到其它非ceph组件
- cephx不负责数据传输加密的问题
cephx认证流程如下面两图所示:
- 首先创建用户时,mon会为用户提供一个secret,并且将该secret与其它ceph组件(其它mon、mds、osds)共享,客户端收到该secret后一般将其保存在keyring文件中
- 之后客户端通过该用户的身份连接到mon进行认证
- mon返回一个加密的身份验证的数据结构,里边包含session-key
- 客户端通过keyring中保存的secret进行解密得到session-key
- 客户端携带session-key向mon请求一个ticket
- mon返回加密的ticket
- 客户端通过keyring中保存的secret进行解密得到ticket
- 客户端向OSD或MDS发起请求时携带此ticket即可验证身份
ceph授权
ceph客户端提交的数据最终都存储在pool中,因此ceph用户需要拥有存储池的访问权限才能读写数据。ceph用户必须拥有执行权限才能使用ceph的管理命令。
在ceph的授权体系中涉及到下面3个概念:
- 用户
- 授权
- 使能
用户
用户是指个人(ceph管理者)或系统参与者(mon、osd、mds)
通过创建用户,可以控制用户或哪个参与者能够访问ceph集群、以及可访问的存储池及存储池中的数据
ceph支持多种类型的用户,但可管理的用户都属于client类型。区分用户的原因在于,mon/mds/osd等系统组件也使用cephx协议,但它们为非客户端。
通常以点号来分割用户类型和用户名:TYPE.ID。例如client.admin、osd.10等
授权和使能
授权就是将使能赋予用户,使用户获得相应权限。
ceph基于使能(Capabilities,简称caps)来描述用户可针对mon、osd或mds能执行的操作和范围。
授权的通用语法格式为:daemon-type ‘allowcaps’ […]
目前可用的使能如下:
- r:向用户授予读取权限。访问mon获取CRUSH运行图时需要此能力
- w:向用户授予针对对象的写入权限
- x:授予用户调用类方法(包括读取和写入)的能力,以及在监视器中执行auth操作的能力
- *:授予用户对特定守护进程/存储池的读取、写入和执行权限,以及执行管理命令的能力
- class-read:属于x能力的子集,授予用户调用类读取方法的能力
- class-write:属于x能力的子集,授予用户调用类写入方法的能力
- profile osd:授予用户以某个osd身份连接到其它osd或监视器的权限。可以授予osd权限,使osd能够处理复制检测信号流量和状态报告(获取osd的状态信息)
- profile mds:授予用户以某个mds身份连接到其它mds或监视器的权限
- profile bootstarp-osd:授予用户引导osd的权限(初始化osd并将osd加入集群),可以授权给部署工具,使其在引导osd时有权添加密钥
- profile bootstart-mds:授予用户引导mds的权限,可以授权给部署工具,使其在引导mds时有权添加密钥
MON的使能:
包括r、w、x和allow profile cap
例如:
mon 'allow rwx'
mon 'allow profile osd'
OSD的使能:
包括r、w、x、class-read、class-write和profile osd,另外osd的使能还允许进行存储池和名称空间设置
例如:
osd 'allow rwx pool=test-pool'
MDS的使能:
只能设置allow或留空
例如:
mds 'allow'
ceph认证和授权常用命令
用户管理
列出所有用户
ceph auth list
获取指定用户的信息
ceph auth get client.admin #获取client.admin用户的信息
ceph auth get osd.9 #获取osd.9用户信息
创建用户
ceph auth add <username> [<caps> .....] #创建用户生成密钥并添加caps
例如:
ceph auth add client.tom mon 'allow r' osd 'allow rwx pool=mypool'
ceph auth get-or-create <username> [<caps> ....] #创建用户,添加密钥并设置caps,最后会返回用户认证信息,如果用户已存在则直接返回认证信息
例如:
ceph auth get-or-create client.jack mon 'allow r' osd 'allow rw pool=mypool'
ceph auth get-or-create client.jack mon 'allow r' osd 'allow rw pool=mypool' -o /etc/ceph.client.jack.keyring #还可以使用-o选项将用户的认证信息保存到keyring文件中
ceph auth get-or-create-key #创建用户,添加密钥并设置caps,最后会返回密钥信息,如果用户已存在则直接返回密钥信息,需要注意返回值只包含密钥
例如:
ceph auth get-or-create-key client.peter mon 'allow r' osd 'allow rw pool=mypool'
获取用户的密钥
ceph auth print-key <username> #获取用户的密钥
例如:
ceph auth print-key client.admin
删除用户
ceph auth del <username>
例如:
ceph auth del client.peter
修改用户的权限
ceph auth caps <username> [<new-caps> ....] #使用新的权限覆盖之前的权限,注意不是添加,是覆盖
例如:
ceph auth caps client.tom mon 'allow r' osd 'allow *'
keyring管理
keyring是用来保存用户认证信息的文件,一个keyring文件可以保存一个或多个用户的认证信息
当客户端访问ceph集群时,ceph会使用下4个密钥环文件预设置密钥环:
- /etc/ceph/<cluster-name>.<user-type>.<user-id>.keyring:保存单个用户的keyring
- /etc/ceph/<cluster-name>.keyring:保存同一个ceph集群多个用户的keyring
- /etc/ceph/keyring:保存未定义集群名称的多个用户的keyring
- /etc/ceph/keyring.bin:编译后的二进制文件
通过keyring文件备份和恢复用户
将用户信息导出至keyring文件,对用户进行备份
ceph auth get <username> -o <keyring-file>
例如:
ceph auth get client.tom -o /etc/ceph.client.tom.keyring
从keyring文件恢复用户信息
ceph auth import -i <keyring-file>
例如:
ceph auth del client.tom
ceph auth import -i /etc/ceph.client.tom.keyring
keyring文件合并
ceph auth-tool <keyring-file1> --import-keyring <keyring-file2> #会把后面keyring文件的内容追加到前面的keyring文件
例如:
ceph-authtool /etc/ceph.client.tom.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring