本文发布于Cylon的收藏册,转载请著名原文链接~

如果需要与osd打交道,需要通过mon检索集群运行图才能够访问的客户端,通常经由mon认证后才能访问ceph存储。Ceph本身实现了数据服务的认证访问和授权控制机制,CephX协议来实现

CephX Protocol

CephX本身只负责认证和授权检测,不处理通讯过程是否加密。一般来讲需要与moniotr交互的客户端组件(OSDRBDRGW等)一般而言都经由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服务器端一定会为每一个客户端事先生成一个密码

image-20240511130549971

image-20240511130516753

认证与授权

无论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,以及mon allow profile osd’等。
  • OSD使能
    • 包括r、w、x、class-readclass-writeprofile osd
    • 此外,OSD使能还允许进行存储池和名称空间设置。如为指定表示对所有OSD所有存储池都获得相关授权
  • 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:规范方法,它能够创建用户、生成密钥并添加指定的caps ceph auth get-or-create:简便方法,创建用户并返回密钥文件格式的密钥信息,或者在用户存在时返回用户名及密钥文件格式的密钥信息

      1
      2
      3
      4
      5
      6
      7
      8
      9
      
      $ 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}]
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    $ 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

1
2
3
4
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使用的账号

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ 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
1
2
3
4
5
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的收藏册,转载请著名原文链接~

链接:Ceph安全 - CephX

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。