Ceph认证和授权 CephX Protocol
Mon:元数据服务器,维护整个集群的运行图,PG等
OSD:每个磁盘一个OSD进程,管理这个磁盘的存取任务,向Mon报告等。
Mgr:新版本的Ceph、状态统计数据等任务,与Mon通信,无状态服务。
MDS:radows的客户端、接口、提供cephfs文件系统、是个服务。
RBD:库文件,块存储。
RGW:提供对象存储。
CephX Protocol:负责认证和授权检测
CephX认证机制:
Ceph使用cephx协议对客户端进行身份认证:
每个MON都可以对客户端进行身份验正并分发密钥, 不存在单点故障和性能瓶颈
MON会返回用于身份验正的数据结构, 其包含获取Ceph服务时用到的session key。
session key通过客户端密钥进行加密
客户端使用session key向MON请求所需的服务
MON向客户端提供一个ticket, 用于向实际处理数据的OSD等验正客户端身份
MON和OSD共享同一个secret, 因此OSD会信任由MON发放的ticket
ticket存在有效期限
注意:
CephX身份验正功能仅限制Ceph的各组件之间, 它不能扩展到其它非Ceph组件;
它并不解决数据传输加密的问题;
认证与授权:
无论Ceph客户端是何类型, Ceph都会在存储池中将所有数据存储为对象
Ceph用户需要拥有存储池访问权限才能读取和写入数据
Ceph用户必须拥有执行权限才能使用Ceph的管理命令
相关概念:
用户
授权
使能(Capabilities)
用户:
用户是指个人或系统参与者( 例如应用)
通过创建用户, 可以控制谁( 或哪个参与者) 能够访问Ceph存储集群、 以及可访问的存储池及存储池中的数据。
Ceph支持多种类型的用户, 但可管理的用户都属于Client类型
区分用户类型的原因在于, MON、 OSD和MDS等系统组件也使用cephx协议, 但它们非为客户端
通过点号来分隔用户类型和用户名, 格式为TYPE.ID, 例如client.admin等
授权和使能:
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-read、 class-write和profile 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时有权添加密钥
profile bootstrap-mds:
授予用户引导元数据服务器的权限
授权给部署工具, 使其在引导元数据服务器时有权添加密钥
用户管理
Ceph集群管理员能够直接在Ceph集群中创建、 更新和删除用户
创建用户时, 可能需要将密钥分发到客户端, 以便将密钥添加到密钥环
列出用户
命令:
ceph auth list
用户标识: TYPE.ID, 因此, osd.0表示OSD类型的用户, 用户ID为0
检索特定用户
命令:
ceph auth get TYPE.ID
或者
ceph auth export TYPE.ID
例:导出为配置文件
ceph auth get client.k8s > ceph.client.k8s.keyring exported keyring for client.k8s
添加用户:
ceph auth add: 规范方法,它能够创建用户、生成密钥并添加指定的caps。
例:添加用户,并分配权限
]$ 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 = AQBFFRheU6QwMhAA6DHO0F4wTOQ+x/r2x5dbpw== caps mon = "allow r" caps osd = "allow rw pool=rbdpool"
ceph auth get-or-create: 简便方法,创建用户并返回密钥文件格式的密钥信息, 或者在用户存在时返回用户名及密钥文件格式的密钥信息。
例:
]$ ceph auth get-or-create client.testuser [client.testuser] key = AQBFFRheU6QwMhAA6DHO0F4wTOQ+x/r2x5dbpw==
ceph auth get-or-create-key:简便方法,创建用户并返回密钥信息,或者在用户存在时返回密钥信息。
例:
]$ ceph auth get-or-create-key client.testuser AQBFFRheU6QwMhAA6DHO0F4wTOQ+x/r2x5dbpw==
注意: 典型的用户至少对 Ceph monitor 具有读取功能, 并对 Ceph OSD 具有读取和写入功能; 另外, 用户的 OSD 权限通常应该限制为只能访问特定的存储池, 否则, 他将具有访问集群中所有存储池的权限。
查看用户key:
ceph auth print-key TYPE.ID
例:
]$ ceph auth print-key client.testuser AQBFFRheU6QwMhAA6DHO0F4wTOQ+x/r2x5dbpw==[cephadm@ceph01 ceph-cluster]$
导入用户:需要指定密钥环,将其他ceph集群的账户秘钥导入到集群,使其拥有一样的用户和权限。
ceph auth import
修改用户权限:
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] [namespace=namespace-name]' ...
例:
]$ ceph auth caps client.testuser mon 'allow rw' osd 'allow rw pool=rbdpool' updated caps for client.testuser
删除用户:
ceph auth del TYPE.ID
例:
]$ ceph auth del client.testuser updated
keyring
keyring:秘钥环,同时存储秘钥、密码、key、证书并使某个应用程序可用的一类文件的集合。
ceph-authtool 管理keyring文件的命令,可以创建、查看、修改keyring文件的内容。ceph auth命令是通过进程来管理用户创建的,ceph-authtool是直接管理文件的。
client、osd、mds、mgr联系mon时都要本地的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/kerying
注意:
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
例:使用ceph auth创建账号并导出,只要将ceph.client.kube.keyring这个文件导入到k8s集群的每个节点就可读写执行存储池kube了。
]$ ceph auth get-or-create client.kube mon 'allow r' osd 'allow * pool=kube' [client.kube] key = AQAKNRheZ7bbJhAApDS8zchajEOahfRpWGKgWA== ]$ ceph auth get client.kube exported keyring for client.kube [client.kube] key = AQAKNRheZ7bbJhAApDS8zchajEOahfRpWGKgWA== caps mon = "allow r" caps osd = "allow * pool=kube" ]$ ceph auth get client.kube -o ceph.client.kube.keyring exported keyring for client.kube
二、也可将用户的keyring合并至一个统一的keyring文件中
ceph-authtool /etc/ceph/cluster-name.keyring --import-key /etc/ceph/clustername.user-name.keyring
例:将 ceph.client.admin.keyring 和 ceph.client.kube.keyring 导入到 cluster.keyring 文件中。
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 ]$ cat cluster.keyring [client.admin] key = AQBLTgtefg4aGBAACNWqns/twcuFgG/ObWO7Og== caps mds = "allow *" caps mgr = "allow *" caps mon = "allow *" caps osd = "allow *" [client.kube] key = AQAKNRheZ7bbJhAApDS8zchajEOahfRpWGKgWA== caps mon = "allow r" caps osd = "allow * pool=kube"
使用ceph-authtool命令管理用户:
ceph-authtool命令可直接创建用户、 授予caps并创建keyring
ceph-authtool keyringfile [-C | --create-keyring] [-n | --name entityname] [--genkey] [-a | --add-key base64_key] [--cap | --caps capfile]
命令选项:
-C, --create-keyring:will create a new keyring, overwriting any existing keyringfile
--gen-key:will generate a new secret key for the specified entityname
--add-key:will add an encoded key to the keyring
--cap subsystem capability:will set the capability for given subsystem
--caps capsfile:will set all of capabilities associated with a given key, for all subsystems
注意:此种方式添加的用户仅存在于keyring文件中,管理员还需要额外将其添加至Ceph集群上。
ceph auth add TYPE.ID -i /PATH/TO/keyring