1、CephX是什么

CephX是一种对称秘钥加密协议,加密算法使用AES,Ceph集群通过CephX协议对客户端进行身份认证。

2、CephX认证机制

  • 每个Monitor都可以对客户端进行身份验证并分发秘钥,此过程是无状态的,不存在单点故障和性能瓶颈。
  • Monitor会返回身份验证的数据结构,其包含获取Ceph服务时用到的session key。
    • session key通过客户端秘钥进行加密。
    • 客户端使用session key向Monitor发起请求。
    • Monitor向客户端提供一个用session key加密过的ticket。
    • 客户端使用此ticket用于向实际处理数据的OSD验证客户端身份。
    • Monitor和OSD共享同一个secret,因此OSD信任Monitor发放的ticket。
    • ticket存在有效期。
  • CephX身份验证功能仅限于Ceph各组件之间,不能扩展到非Ceph组件(如radosgw是否认证客户端,需要由应用程序保证。)
  • 不能解决数据传输加密的问题。

    3、CephX身份验证流程

    image.png
  1. 管理员在Monitor创建一个用户账号,将账号信息共享给MDS和OSD,并将账号预共享秘钥传给Client。
  2. Client使用此账号对Monitor发起请求,完成认证,获取SessionKey。
  3. Client请求获取ticket,Minotir将生成ticket并发送给Client。
  4. Client使用此ticket向MDS或OSD发起访问。
  5. MDS或OSD解密ticket,认证通过处理请求。

    4、CephX用户认证与授权

    4.1、用户

    用户是指个人或系统参与者(如Ceph集群中的其他组件应用)
    通过用户控制用户是否能否访问Ceph存储集群、以及可访问的存储池及存储池中的数据
    Ceph支持多种类型的用户,可管理的用户都属于Client类型
  • 区分类型的原因在于Monitor、OSD、MDS等服务也使用CephX协议,但它们并不是Client
  • Ceph以句点(.)标识用户,由用户类型和用户ID组成,格式为TYPE.ID,例如client.admin。

    4.2、授权和能力

    Ceph用能力(capabilities,caps)这个术语来描述认证用户的权限,这样来限制Monitor、OSD或MDS的权限范围或级别。
    caps的语法格式:

    1. {daemon-type} 'allow {capability}' [{daemon-type} 'allow {capability}']

    daemon-type:表示应用类型,如mon表示客户端操作mon的权限,可以一次授权多个类型。
    allow:允许哪些授权
    capability:授予的权限

    4.2.1、Mon支持的能力
  • 允许r、w、x和’allow profile osd’

  • 如mon ‘allow rw’或mon ‘allow profile osd’

    4.2.2、OSD支持的能力
  • 允许r、w、x和class-read 、 class-write 和 profile osd

  • OSD 能力还支持存储池和命名空间的配置

    4.2.3、MDS支持的能力
  • MDS能力比较简单,只需要 allow 或者空白

    4.2.4、各项能力的描述
  • 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的权限,授予部署工具
  • profile bootstrap-mds:授权用户引导MDS的权限,授予像ceph-deploy部署工具

    5、用户管理

    用户管理功能为 Ceph 存储集群管理员提供了在 Ceph 存储集群中创建、更新和删除用户的能力。
    在Ceph集群中创建删除用户时,可能需要将秘钥分发给客户端,以便将秘钥添加到秘钥环keyting中。

  • keyring:存放一个或多个用户及其秘钥信息。

    5.1、用户管理常用指令

  • 列出用户

    1. ]$ ceph auth list
    2. mds.ceph-mon1 # 用户标识
    3. key: AQCsmxhh5aSfDBAAMaFWbKAKYbjk6CYQbMiO5A==
    4. caps: [mds] allow
    5. caps: [mon] allow profile mds
    6. caps: [osd] allow rwx
    7. osd.0
    8. key: AQDK4RdhrkftDBAAMU841pbG/eIDMMCApMGt9A==
    9. caps: [mgr] allow profile osd
    10. caps: [mon] allow profile osd
    11. caps: [osd] allow *
  • 获取特定用户

    1. ]$ ceph auth get client.admin
  • 添加用户

    • ceph auth add:此命令是添加用户的规范方式。它将创建用户、生成密钥并添加任何指定的功能。
    • ceph auth get-or-create:简单方法,用户不存在会创建用户返回一个包含用户名和密钥的密钥文件格式。如果用户已存在,此命令仅以密钥文件格式返回用户名和密钥。
    • ceph auth get-or-create-key:创建用户并返回密钥。如果用户已存在,返回密钥。

创建用户时,可以创建一个没有能力的用户,但此用户只能认证,没有检索集群运行图的能力,因此一个典型用户应该至少包含mon监视器上的读取能力和osd的读写能力。

  • 获取用户秘钥

    1. ]$ ceph auth print-key TYPE.ID
  • 导入用户

需要指定秘钥环。

  1. ]$ ceph auth import -i /path/to/keyring
  • 修改用户能力caps

修改用户能力会覆盖现用的caps,因此修改前应该先使用ceph auth get TYPE.ID查看用户的caps,在此基础上进行修改。

  1. # 命令格式
  2. ]$ 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}]']
  3. # 示例,设置用户rbduser拥有对存储池rbddata的mon的rw和osd的rwx权限
  4. ]$ ]$ ceph auth add client.rbduser mon 'allow rw' osd 'allow rw pool=rbddata'
  5. added key for client.rbduser
  • 删除用户

    1. ceph auth del {TYPE}.{ID}

    6、秘钥环管理

    当您通过 Ceph 客户端访问 Ceph 时,Ceph 客户端将查找本地密钥环。Ceph默认使用以下四个密钥环名称预设密钥环设置。

  • /etc/ceph/$cluster.$name.keyring # 保存单个用户的keyring

  • /etc/ceph/$cluster.keyring # 保存多个用户的keyring
  • /etc/ceph/keyring
  • /etc/ceph/keyring.bin

cluster是为集群名称,user是为用户标识(TYPE.ID)
client.admin用户的在名为ceph的集群上的密钥环文件名为ceph.client.admin.keyring

6.1、创建keyring

  • ceph auth add等命令添加的用户还需要额外使用ceph-authtool命令为其创建用户密钥环
  • ceph客户端通过keyring文件查找用户名并检索密钥
  • 可以使用命令:ceph-authtool —create-keyring /path/to/kerying创建keyring文件

    1. ]$ ceph-authtool --create-keyring cluster.keyring
    2. creating cluster.keyring
    • keyring文件一般应该保存于/etc/ceph目录中,以便客户端能自动查找
    • 创建包含多个用户的keyring文件时,应该使用cluster-name.keyring作为文件名
    • 创建仅包含单个用户的kerying文件时,应该使用cluster-name.user-name.keyring作为文件名

      6.2、将用户添加至keyring

  • 可将某个用户从包含多个用户的keyring中导出,并保存于一个专用的keyring文件

    • 命令:ceph auth get TYPE.ID -o /etc/ceph/cluster-name.user-name.keyring
      1. ]$ ceph auth get client.rbduser -o ceph.client.rbduser.keyring
      2. exported keyring for client.rbduser
  • 也可将用户的keyring合并至一个统一的keyring文件中

    • ceph-authtool /etc/ceph/cluster-name.keyring —import-key /etc/ceph/cluster-name.user-name.keyring
      1. # 将rbduser和admin合并到一个秘钥环
      2. ]$ ceph-authtool cluster.keyring --import-keyring ceph.client.rbduser.keyring
      3. importing contents of ceph.client.rbduser.keyring into cluster.keyring
      4. ]$ ceph-authtool cluster.keyring --import-keyring ceph.client.admin.keyring
      5. importing contents of ceph.client.admin.keyring into cluster.keyring

      6.3、使用ceph-authtool管理用户

      ceph-authtool命令可直接创建用户、授予caps并创建keyring,命令格式如下:
      1. ceph-authtool keyringfile [-C | --create-keyring] [-n | --name entityname] [--gen- key] [-a | --add-key base64_key] [--cap | --caps capfile]
  • 命令选项:

    • -c:将创建一个新的keyring,覆盖现有的keyring文件
    • —gen-key:为指定的用户生成新的秘钥
    • —add-key:将向keyring添加编码密钥
  • 注意:此种方式添加的用户仅存在于keyring文件中,管理员还需要额外将其添加至Ceph集群上;
    • 命令: ceph auth add TYPE.ID -i /PATH/TO/keyring