ceph用户与权限管理

当 Ceph 在启用身份验证和授权(默认启用)的情况下运行时,您必须指定用户名和包含指定用户密钥的密钥环(一般通过命令行),如果不指定用户名,Ceph 将使用client.admin默认用户名。如果您没有指定密钥环,Ceph 将通过 Ceph 配置/etc/ceph/ceph.client.admin.keyring中的keyring设置查找密钥环

例如:如果没有指定用户名和密钥环的情况下执行命令

ceph health

Ceph 对命令的解释如下:

ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health

ceph的块存储、文件存储、对象存储都将所有数据存储到池中,用户必须有权访问池才能读取和写入数据,同时用户必须具有执行权限才能使用ceph的管理命令

认证机制

Ceph 使用 cephx 协议对客户端进行身份认证。cephx 用于对 ceph 保存的数据进行认证访问和授权,用于对访问 ceph 的请求进行认证和授 权检测,与 mon 通信的请求都要经过 ceph 认证通过,但是也可以在 mon 节点关闭 cephx 认证,但是关闭认证之后任何访问都将被允许,因此无法保证数据的安全性。

 授权流程

首先客户端向 ceph-mon 服务请求数据,mon 节点会返回用于身份认证的数据结构,其中包含获取 ceph 服务时用到的 session key,session key 通过客户端秘钥进行加密,秘钥是在客户端提前配置好的,/etc/ceph/ceph.client.admin.keyring,客户端使用key解密后得到session key, 然后使用 session key 向 ceph-mon 请求所需要的服务,ceph-mon 收到请求后会向客户端提供一个 tiket,用于向实际处理数据的 OSD 等服务验证客户端身份, ceph-mon 和 ceph-osd 服务共享同一个 secret,因此 ceph-osd 会信任所有 ceph-mon 发放的 tiket,每个 ceph-mon 节点都可以对客户端进行身份认证并分发秘钥,因此多个 ceph-mon 节点就不存在单点故障和认证性能瓶颈。同时请注意,tiket 存在有效期,认证流程图如下:

用户管理

用户可以是个人(ceph管理者)、也可以是系统参与者(MON/OSD/MDS),比如应用程序通过创建用户,可以控制用户或哪个参与者能够访问 ceph 存储集群、以及可访问的存储池及存储池中的数据,ceph 支持多种类型的用户,但可管理的用户都属于 client 类型区分用户类型的原因在于,MON/OSD/MDS 等系统组件都使用 cephx 协议,但是它们不算是客户端。

查看全部用户信息:

查询指定用户信息,如图:

Ceph 有一个type用户的概念。出于用户管理的目的,类型将始终为client,通过点(.)分隔的形式识别用户,例如:client.admin、client.user1,如图:

Ceph 命令行允许您根据您的命令行使用情况指定有或没有类型的用户。如果指定–user 或 –id,则可以省略类型,例如上面命令通过–user或者–id参数可省略类型:

ceph --user admin --keyring=/etc/ceph/ceph.client.admin.keyring health

如果指定 –name或-n,则必须指定类型和名称,例如 client.admin。建议尽可能使用类型和名称作为最佳实践

二、权限管理

ceph 基于使能/能力(Capabilities,简称 caps )来描述用户可针对 MON/OSD 或 MDS 使用的授权范围或级别,通用语法格式为:

daemon-type 'allow caps' [...]

caps(能力)主要参数:

  • r:向用户授予读取权限。访问监视器(mon)以检索 CRUSH 运行图时需具有此能力
  • w:向用户授予针对对象的写入权限
  • x:授予用户调用类方法(包括读取和写入)的能力,以及在监视器中执行 auth 操作的能力
  • 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 时有权添加密钥
  • profile bootstrap-mds:授予用户引导元数据服务器的权限,授权部署工具权限,使其在引导元数据服务器时有权添加密钥

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 能力还允许进行存储池和名称空间设置。注:namespace可以不用指定
osd 'allow capability' [pool=poolname] [namespace=namespace-name]

MDS 能力

只需要 allow 或空都表示允许。
mds 'allow'
mds 'allow r,allow rw path=/test'   #指定当前用户对/test路径有读写权限,对其余路径只读

三、实战

1、创建用户client.test,对mon有r权限,对osd有rwx权限,存储池为temp-pool,如下:

ceph auth add命令

ceph auth add client.test mon 'allow r' osd 'allow rwx pool=temp-pool'

获取用户信息如下,可看到key以及权限设置:

ceph auth get-or-create命令

除了ceph auth add外,还可以使用ceph auth get-or-create命令,此命令是创建用户常见的方式之一,它会返回用户名和密钥文,如果该用户已存在,此命令只以密钥文件格式返回用户名和密钥, 还可以使用 -o 指定文件名选项将输出保存到某个文件

ceph auth get-or-create-key

此命令是创建用户并仅返回用户密钥,对于只需要密钥的客户端(例如 libvirt),此命令非常有用。如果该用户已存在,此命令只返回密钥,创建客户端用户时,可以创建不具有能力的用户。不具有能力的用户可以进行身份验证,但 不能执行其他操作,此类客户端无法从监视器检索集群地图,但是,如果希望稍后再添加能力,可以使用 ceph auth caps 命令创建一个不具有能力的用户

ceph auth get-or-create-key client.test mon 'allow r' osd 'allow rwx pool=temp-pool'

只获取单个指定用户的 key 信息:

ceph auth print-key client.test

2、修改用户能力

使用 ceph auth caps 命令可以指定用户以及更改该用户的能力,设置新能力会完全覆盖当前的能力

查看当前用户client.test的能力,如图:

执行如下命令修改能力,如下:

ceph auth caps client.test mon 'allow rw' osd 'allow rw pool=temp-pool'

再次查看用户client.test的能力,如图:

3、删除用户

ceph auth del client.test

4、密钥环管理

ceph 的秘钥环是一个保存了 secrets、keys、certificates 并且能够让客户端通认证访问 ceph 的 keyring file(集合文件),一个 keyring file 可以保存一个或者多个认证信息

当客户端访问 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                                     # 编译后的二进制文件

    使用 ceph auth add 等命令添加的用户还需要额外使用 ceph-authtool 命令为其创建用户秘钥环文件,格式如下:

    ceph-authtool --create-keyring FILE     #此命令创建的是空的keyring文件

    为上面创建的用户client.test创建对应的密钥环文件,执行命令如下:

    ceph-authtool --create-keyring ceph.client.test.keyring  #在/etc/ceph路径下可看到

    此时的ceph.client.test.keyring文件内容是空的,如图:

    导出keyring到文件ceph.client.test.keyring中,再次查看已经有内容,命令如下:

    ceph auth get client.test -o ceph.client.test.keyring
    注意:
    1、如果用户不小心被删除了(ceph auth del client.tests),可通过keyring来恢复用户,命令为
    ceph auth import -i ceph.client.test.keyring
    2、一个keyring文件可以包含多个不同用户的认证文件
    ceph-authtool --create-keyring ceph.client.all.keyring  #创建一个新的空的keyring
    ceph-authtool /etc/ceph/ceph.client.all.keyring --import-keyring /etc/ceph/ceph.client.admin.keyring   #将admin用户密钥环导入
    ceph-authtool /etc/ceph/ceph.client.all.keyring --import-keyring /etc/ceph/ceph.client.test.keyring    #将test用户密钥环导入
    ceph-authtool  -l /etc/ceph/ceph.client.all.keyring #验证导入结果

    标签