目录
1. Ceph的授权
- Ceph把数据以对象的方式存在与各个存储池中,ceph用户必须具有访问存储池的权限才能读写数据
-
ceph用caps来描述给予用户的的权限来使用mon和osd/mds,caps用来限制对某一个存储池的数据或者某个命名空间的访问
-
ceph管理员用户可以创建或者更新普通用户来赋予caps权限
用户
- 用户是指个人或系统参与者(例如应用)
- 通过创建用户,可以控制谁(或哪个参与者)能够访问Ceph存储集群、以及可访问的存储池及存储池中的数据
- Ceph支持多种类型的用户,但可管理的用户都属于Client类型
- 区分用户类型的原因在于,MON、OSD和MDS等系统组件也使用cephx协议,但它们非为客户端
- 通过点号来分隔用户类型和用户名,格式为TYPE.ID,例如client.admin等
示例
#查看所有的ceph用户权限
ceph auth list
#管理员用户(对所有组件拥有完全的管理员权限)
client.admin
key:AQA5+FZd7J90NBAAy3upDi1HsMCC55tUJWZzPW==
caps:[mds] allow *
caps:[mgr] allow *
caps:[mon] allow *
caps:[osd] allow *
1.1 Ceph的认证流程
- 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组件;
- 它并不解决数据传输加密的问题;
1.2 Ceph认证机制
- None:这种模式下,任何用户可以在不经过身份验证时就访问Ceph集群
auth_cluster_required = none
auth_service_required = none
auth_client_required = none
- Cephx:Cephx协议类似于Kerberos协议,它允许经过验证的客户端访问ceph集群
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx
1.3 Ceph常用权限说明
- 当需要给某个用户X权限时候必须授予RW权限
-
在ceph中认证和授权是一体的
具体参数项 | 参数解析 |
---|---|
r | 赋予用户读数据的权限,如果我们需要访问集群的任何信息,都需要先具有monitor的读权限 |
w | 赋予用户写数据的权限,如果需要在osd上存储或修改数据就需要为0SD授予写权限x|赋予用户调用对象方法的权限,包括读和写,以及在monitor上执行用户身份验证的权限 |
class-read | x的子集,允许用户调用类的read方法,通常用于rbd类型的池 |
class-write: | 的子集,允许用户调用类的write方法,通常用于rbd类型的池 |
* | 将一个指定存储池的完整权限(r、w和x)以及执行管理命令的权限授予用户 |
profile rbd | 授权管理rbd权限 |
profile osd | 授权一个用户以0SD身份连接其它OSD或者Monitor,用于0SD心跳和状态报告 |
profile mds | 授权一个用户以MDS身份连接其他MDS或者 |
Monitor profile bootstrap-osd | 允许用户引导0SD。比如ceph-deploy和ceph-disk工具都使用client.bootstrap-osd用户,该用户有权给0SD添加密钥和启动加载程序 |
profile bootstrap-mds | 允许用户引导MDS。比如ceph-deploy工具使用了client.bootstrap-mds用户,该用户有权给MDS添加密钥和启动加载程序 |
1.4 Ceph的授权操作
1.4.1 授权的基本语法规则
- profile osd
- 授予用户以某个OSD身份连接到其他OSD或监视器的权限
- 授予OSD权限,使OSD能够处理复制检测信号流量和状态报告
- profile mds
- 授予用户以某个MDS身份连接到其他MDS或监视器的权限
- profile bootstrap-osd
- 授予用户引导OSD的权限
- 授权给部署工具,使其在引导OSD时有权添加密钥
- profile bootstrap-mds
- 授予用户引导元数据服务器的权限
- 授权给部署工具,使其在引导元数据服务器时有权添加密钥
#授权语法:
{daemon-type} allow {capability}' [{daemon-type} 'allow {capability}']
#授权对象:
monitor caps,包括r、w、x参数以及allow profiles {cap}
mon 'allow rwx'
mon 'allow profile osd'
osd caps,包括r、w、x、class-read、class-write以及profile osd
osd 'allow rw'
osd 'allow rw pool=rbd'
mds
mds 'allow'
1.4.2 常用的授权语法
#普通授权
mon 'allow r' osd 'allow rw'
#基于存储池的授权
mon 'allow r' osd 'allow rw pool=Poolname'
#基于对象前缀授权
mon 'allow r' osd 'allow rw object_prefix pref'
#基于命名空间授权
mon 'allow r' osd 'allow rw pool=Poolname namespace=youNS'
#基于路径授权(只适用于CephFS,CephFS通过这种方式来限制对特定目录的访问)
mon 'allow r' osd 'allow rw pool=cephfs_data' mds 'allow rw path=/webcontent'
#限制用户只能使用特定的管理员指令(指定具体能使用的命令)
mon 'allow r, allow command "auth get-or-create", allow command "auth list"'
1.4.3 ceph用户命令规范
常规概念
#Ceph集群管理员能够直接在Ceph集群中创建、更新和删除用户
创建用户时,可能需要将密钥分发到客户端,以便将密钥添加到密钥环
#列出用户
命令:ceph auth list
用户标识:TYPE.ID,因此,osd.0表示OSD类型的用户,用户ID为0
#检索特定用户
命令:ceph auth get TYPE.ID或者ceph auth export TYPE.ID
#添加用户
ceph auth add:规范方法,它能够创建用户、生成密钥并添加指定的caps
ceph auth get-or-create:简便方法,创建用户并返回密钥文件格式的密钥信息,或者在用户存在时返回用户名及密钥文件格式的密钥信息
ceph auth get-or-create-key:简便方法,创建用户并返回密钥信息,或者在用户存在时返回密钥信息
注意:典型的用户至少对Ceph monitor 具有读取功能,并对Ceph OSD具有读取和写入功能;另外,用户的OSD权限通常应该限制为只能访问特定的存储池,否则,他将具有访问集群中所有存储池的权限
-
Ceph守护进程使用的帐户名与相关守护进程名称匹配:osd.1 或 mon.ceph-node1,这些用户默认会在安装时被创建
-
librados的客户端应用,帐户名以client.开头。例如,将OpenStack与Ceph集成时,常常会创建专用的client.openstack用户。另外,当部署 Ceph Object Gateway时,会创建client.rgw.帐户。如果要在librados基础上部署自定义软件,也应当创建特定帐户
-
Ceph客户端所使用的帐户名以client.开头,运行ceph和rados等命令时使用。安装程序会创建超级管理员client.admin,它具有访问所有内容及修改集群配置的功能。如果运行命令时不通过 –name 或 –id 明确指定用户名,Ceph默认使用client.admin
#两种访问方式
ceph -s --id admin
ceph -s --name client.admin
1.4.4 添加用户
- ceph auth add
- 当用户不存在,则创建用户并授权
- 当用户存在,当权限不变,则不进行任何输出
- 当用户存在,不支持修改权限
#示例
ceph auth add client.breeze mon "allow r" osd "allow rw pool=PoolName"
- ceph auth get-or-create
- 当用户不存在,则创建用户并授权并返回用户和key
- 当用户存在,权限不变,返回用户和key当用户存在,权限修改,则返回报错
#示例
ceph auth get-or-create client.tina mon "allow r" osd "allow rw pool=PoolName"
- ceph auth get-or-create-key
- 当用户不存在,则创建用户并授权只返回key
- 当用户存在,权限不变,只返回key
- 当用户存在,权限修改,则返回报错
- allow rw pool=mysecondpool?
#示例
ceph auth get-or-create client,bernie mon "allow r" osd
1.4.5 用户密钥的导入导出
- 将系统中的用户密钥环导入到ceph
ceph auth import -i /etc/ceph/ceph.client.username.keyring
- 将ceph中的用户导出到指定文件
ceph auth get clinet.username -o path(指定路径,规范为[ceph.client.username.keyring])
1.4.6 用户的查询与删除
#显示所有的用户信息
ceph auth list
#获取某个用户的详细信息
ceph auth get client.admin
#获取用户的key
ceph auth print-key client.admin
#删除指定用户
ceph auth del client.breeze
1.4.7 修改用户权限
- ceph auth caps 用户修改用户授权。如果给定的用户不存在,直接返回报错。如果用户存在,则使用新指定的权限覆盖现有权限。所以,如果只是给用户新增权限,则原来的权限需要原封不动的带上。如果需要删除原来的权限,只需要将该权限设定为空即可
#例子
ceph auth get clinet.username
#添加指定用户的权限
ceph auth caps clinet.username mon "allow r" osd "allow rw pool=PoolName"
#清空指定用户的权限
ceph auth caps clinet.username mon "" osd ""
1.5 推送用户至客户端
- 创建的用户主要用于客户端授权,所以需要将创建的用户推送至客户端。如果需要向同一个客户端推送多个用户,可以将多个用户的信息写入同一个文件,然后直接推送该文件
ceph-authtool -C /etc/ceph/ceph.keyring
ceph-authtool ceph.keyring --import-keyring ceph.client.username.keyring
ceph-authtool ceph.keyring --import-keyring ceph.client.username.keyring
1.6 通过命令行使用用户
- 默认情况下,我们直接在用户端执行ceph指令,使用的是client.admin用户。如果在客户端使用指定用户访问ceph集群,就需要在命令行中传递认证信息
ceph --id user --keyring /etc/ceph/ceph.keyring health
ceph --user user --keyring /etc/ceph/ceph.keyring health
ceph --name client.user --keyring /etc/ceph/ceph.keyring health
1.7 认证练习(管理ceph认证)
- one. 创建一个mypool的池
- two. 创建一个client.docedit的用户,为其赋于mypool的docs命名空间的存储及检索文档的权限
- three. 创建一个client.docget的用户,为其仅赋于mypool的docs命名空间的检索文档的权限
- four. 修改client.docget的权限,为其赋于一个不存在的池docarchive读写的权限,同时修改其mypool的权限为可读写
# 检查mypool是否存在,如果不存在,则需要创建
ceph osd pool ls
# ceph osd pool create mypool 64
# ceph osd pool application enable mypool rbd
# 创建用户并授权
ceph auth get-or-create client.docedit mon 'allow r' osd 'allow rw pool=mypool namespace=docs' -o /etc/ceph/ceph.client.docedit.keyring
ceph auth get-or-create cleint.docget mon 'allow r' osd 'allow r pool=mypool namespace=docs' -o /etc/ceph/ceph.client.docget.keyring
# 验证
ceph auth list
# 将密钥发往servera
scp /etc/ceph/ceph.client.docedit.keyring servera:/etc/ceph/
scp /etc/ceph/ceph.client.docget.keyring servera:/etc/ceph/
# servera上操作
rados --id docedit -p mypool -N docs put testdoc /etc/services
rados --id docget -p mypool -N docs get testdoc /tmp/test
diff /etc/services /tmp/test
# 下面操作会抛异常
rados --id docget -p mypool -N docs put mywritetest /etc/services
# serverc上操作
ceph auth caps client.docget mon 'allow r' osd 'allow rw pool=mypool namespace=docs, allow rw pool=docarchive'
rados --id docget -p mypool -N docs put mywritetest /etc/services
# 清理相关用户
# serverc上操作
rm /etc/ceph/ceph.client.docedit.keyring
ssh servera rm /etc/ceph/ceph.client.docedit.keyring
ceph auth del cleint.docedit
rm /etc/ceph/ceph.client.docget.keyring
ssh servera rm /etc/ceph/ceph.client.docget.keyring
ceph auth del cleint.docget