目录

前言

常规的身份认证系统无非三点:

  • 账户
  • 角色权限
  • 认证鉴权

本篇也从这三个角度来解析 Ceph 的用户管理与认证。

Ceph 的用户管理



Ceph 的用户可以是一个具体的人或系统角色(e.g. 应用程序),Ceph 管理员通过创建用户并设置权限来控制谁可以访问、操作 Ceph Cluster、Pool 或 Objects 等资源。

查看用户清单与权限示例(展示部分)

[root@ceph-node1 ~]# ceph auth ls
installed auth entries: # MDS 守护进程用户
mds.ceph-node1
# 用户密钥
key: AQBFD8BcjASRNRAAye8Z9tMVe4if2vU0BdQJBg==
# 用户授权
caps: [mds] allow
caps: [mon] allow profile mds
caps: [osd] allow rwx
... # OSD 守护进程用户
osd.0
key: AQBu575cdhmoMxAAj0b4L25hgdqBJFwJb7MDoQ==
caps: [mgr] allow profile osd
caps: [mon] allow profile osd
caps: [osd] allow *
... # Admin 管理员用户
client.admin
key: AQB3175cZrKQEBAApE+rBBXNvbZs16GkpOjXhw==
caps: [mds] allow *
caps: [mgr] allow *
caps: [mon] allow *
caps: [osd] allow * # OpenStack Cinder 用户
client.cinder
key: AQDVgMFcn/7sEhAA1sLOM+CTWkkGGJ47GRqInw==
caps: [mon] profile rbd
caps: [osd] profile rbd pool=volumes, profile rbd pool=vms, profile rbd pool=images
client.cinder-backup
key: AQDZgMFcBAAbNRAAepH+HZds85HvAYuV1wwTKQ==
caps: [mon] profile rbd
caps: [osd] profile rbd pool=backups # OpenStack Glance 用户
client.glance
key: AQDOgMFcq+DEBhAAr4iu86M6h7rCcyYcPQogwQ==
caps: [mon] profile rbd
caps: [osd] profile rbd pool=images

Ceph 的用户类型可以分为以下几类

  • 客户端用户

    • 操作用户(e.g. client.admin)
    • 应用程序用户(e.g. client.cinder)
  • 其他用户
    • Ceph 守护进程用户(e.g. mds.ceph-node1、osd.0)

用户命名遵循 <TYPE.ID> 的命名规则,其中 Type 有 mon,osd,client 三者,L 版本以后添加了 mgr 类型。

NOTE:为 Ceph 守护进程创建用户,是因为 MON、OSD、MDS 等守护进程同样遵守 CephX 协议,但它们不能属于真正意义上的客户端。

Ceph 用户的密钥:相当于用户的密码,本质是一个唯一字符串。e.g. key: AQB3175c7fuQEBAAMIyROU5o2qrwEghuPwo68g==

Ceph 用户的授权(Capabilities, caps):即用户的权限,通常在创建用户的同时进行授权。只有在授权之后,用户才可以使用权限范围内的 MON、OSD、MDS 的功能,也可以通过授权限制用户对 Ceph 集群数据或命名空间的访问范围。以 client.admin 和 client.cinder 为例:

client.admin
key: AQB3175cZrKQEBAApE+rBBXNvbZs16GkpOjXhw==
# 允许访问 MDS
caps: [mds] allow *
# 允许访问 Mgr
caps: [mgr] allow *
# 允许访问 MON
caps: [mon] allow *
# 允许访问 OSD
caps: [osd] allow * client.cinder
key: AQDVgMFcn/7sEhAA1sLOM+CTWkkGGJ47GRqInw==
# 在 MON 中具有引导 RBD 的权限
caps: [mon] profile rbd
# 在 OSD 中具有通过 RBD 访问 Pool volumes、vms、images 中的数据权限
caps: [osd] profile rbd pool=volumes, profile rbd pool=vms, profile rbd pool=images

授权类型

  • allow:在守护进程进行访问设置之前就已经具有特定权限,常见于管理员和守护进程用户。
  • r:授予用户读的权限,读取集群各个组件(MON/OSD/MDS/CRUSH/PG)的状态,但是不能修改。
  • w:授予用户写对象的权限,与 r 配合使用,修改集群的各个组件的状态,可以执行组件的各个动作指令。
  • x:授予用户调用类方法的能力,仅仅和 ceph auth 操作相关。
  • class-read:授予用户调用类读取方法的能力,是 x 的子集。
  • class-write:授予用户调用类写入方法的能力,是 x 的子集。
  • *:授予用户 rwx 权限。
  • profile osd:授权用户以 OSD 身份连接到其它 OSD 或 MON,使得 OSD 能够处理副本心跳和状态汇报。
  • profile mds:授权用户以 MDS 身份连接其它 MDS 或 MON。
  • profile bootstrap-osd:授权用户引导 OSD 守护进程的能力,通常授予部署工具(e.g. ceph-deploy),让它们在引导 OSD 时就有增加密钥的权限了。
  • profile bootstrap-mds:授权用户引导 MDS 守护进程的能力。同上。

NOTE:可见 Ceph 客户端不直接访问 Objects,而是必须要经过 OSD 守护进程的交互。

用户管理常规操作

Ceph 用户管理指令 auth

[root@ceph-node1 ~]# ceph auth --help
...
auth add <entity> {<caps> [<caps>...]} add auth info for <entity> from input file, or random key if no input is given, and/or any caps specified in the command
auth caps <entity> <caps> [<caps>...] update caps for <name> from caps specified in the command
auth export {<entity>} write keyring for requested entity, or master keyring if none given
auth get <entity> write keyring file with requested key
auth get-key <entity> display requested key
auth get-or-create <entity> {<caps> [<caps>...]} add auth info for <entity> from input file, or random key if no input given, and/or any caps specified in the command
auth get-or-create-key <entity> {<caps> [<caps>...]} get, or add, key for <name> from system/caps pairs specified in the command. If key already exists, any given caps must match the
existing caps for that key.
auth import auth import: read keyring file from -i <file>
auth ls list authentication state
auth print-key <entity> display requested key
auth print_key <entity> display requested key
auth rm <entity> remove all caps for <name>

获取指定用户的权限信息

[root@ceph-node1 ~]# ceph auth get client.admin
exported keyring for client.admin
[client.admin]
key = AQB3175cZrKQEBAApE+rBBXNvbZs16GkpOjXhw==
caps mds = "allow *"
caps mgr = "allow *"
caps mon = "allow *"
caps osd = "allow *"

新建用户

# 授权的格式为:`{守护进程类型} 'allow {权限}'`

# 创建 client.john 用户,并授权可读 MON、可读写 OSD Pool livepool
ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool' # 获取或创建 client.paul,若创建,则授权可读 MON,可读写 OSD Pool livepool
ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool' # 获取或创建 client.george,若创建,则授权可读 MON,可读写 OSD Pool livepool,输出用户秘钥环文件
ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring
ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key

为指定用户授权

# 格式: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}]']

ceph auth get client.john
ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool'
ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool'
ceph auth caps client.brian-manager mon 'allow *' osd 'allow *'

删除用户

ceph auth del {TYPE}.{ID}

CephX 认证系统

Ceph 提供了两种身份认证方式:None 和 CephX。前者表示客户端不需要通过密钥访问即可访问 Ceph 存储集群,显然这种方式是不被推荐的。所以我们一般会启用 CephX 认证系统,通过编辑 ceph.conf 开启:

[global]
...
# 表示存储集群(mon,osd,mds)相互之间需要通过 keyring 认证
auth_cluster_required = cephx
# 表示客户端(比如gateway)到存储集群(mon,osd,mds)需要通过 keyring 认证
auth_service_required = cephx
# 表示存储集群(mon,osd,mds)到客户端(e.g. gateway)需要通过 keyring 认证
auth_client_required = cephx

CephX 的本质是一种对称加密协议,加密算法为 AES,用于识别用户的身份、对用户在客户端上的操作进行认证,以此防止中间人攻击、数据篡改等网络安全问题。应用 CephX 的前提是创建一个用户,当我们使用上述指令创建一个用户时,MON 会将用户的密钥返回给客户端,同时自己也会保存一份副本。这样客户端和 MON 就共享了一份密钥。CephX 使用共享密钥的方式进行认证,客户端和 MON 集群都会持有一份用户密钥,它提供了一个相互认证的机制,MON 集群确定客户端持有用户密钥,而客户端确定 MON 集群持有用户密钥的的副本。

身份认证原理

  1. 用户通过客户端向 MON 发起请求。
  2. 客户端将用户名传递到 MON。
  3. MON 对用户名进行检查,若用户存在,则通过加密用户密钥生成一个 session key 并返回客户端。
  4. 客户端通过共享密钥解密 session key,只有拥有相同用户密钥环文件的客户端可以完成解密。
  5. 客户端得到 session key 后,客户端持有 session key 再次向 MON 发起请求
  6. MON 生成一个 ticket,同样使用用户密钥进行加密,然后发送给客户端。
  7. 客户端同样通过共享密钥解密得到 ticket。
  8. 往后,客户端持有 ticket 向 MON、OSD 发起请求。

这就是共享密钥认证的好处,客户端、MON、OSD、MDS 共同持有用户的密钥,只要客户端与 MON 完成验证之后,客户端就可以与任意服务进行交互。并且只要客户端拥有任意用户的密钥环文件,客户端就可以执行特定用户所具有权限的所有操作。当我们执行 ceph -s 时候,实际上执行的是 ceph -s --conf /etc/ceph/ceph.conf --name client.admin --keyring /etc/ceph/ceph.client.admin.keyring。客户端会从下列默认路径查看 admin 用户的 keyring:

/etc/ceph/ceph.client.admin.keyring
/etc/ceph/ceph.keyring
/etc/ceph/keyring
/etc/ceph/keyring.bin

使用 ceph-authtool 进行密钥环管理

NOTE:密钥环文件 .keyring 是 Ceph 用户的载体,当客户端拥有了密钥环文件就相当于可以通过对应的用户来执行客户端操作。

MON、OSD、admin client 的初始密钥环文件

  • /var/lib/ceph/mon/ceph-$hostname/keyring
  • /var/lib/ceph/osd/ceph-$hostname/keyring
  • /etc/ceph/ceph.client.admin.keyring

指定密钥环(admin 用户)来执行集群操作

ceph -n client.admin --keyring=/etc/ceph/ceph.client.admin.keyring health
rbd create -p rbd volume01 --size 1G --image-feature layering --conf /etc/ceph/ceph.conf --name client.admin --keyring /etc/ceph/ceph.client.admin.keyring

查看用户密钥

ceph auth print-key {TYPE}.{ID}

将用户密钥导入到密钥环

sudo ceph auth get client.admin -o /etc/ceph/ceph.client.admin.keyring

创建用户并生产密钥环文件

sudo ceph-authtool -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' /etc/ceph/ceph.keyring
sudo ceph-authtool -C /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx' --gen-key

修改用户授权

sudo ceph-authtool /etc/ceph/ceph.keyring -n client.ringo --cap osd 'allow rwx' --cap mon 'allow rwx'

从密钥环文件导入一个用户

ceph auth import -i /path/to/keyring

将用户导出到一个密钥环文件

sudo ceph auth get client.admin -o /etc/ceph/ceph.client.admin.keyring

注意事项

当 auth 配置为 cephx 时:

  • 必须要密钥环文件来访问 Ceph 集群
  • MON 启动是需要 /var/lib/ceph/mon/ceph-node1/ceph-mon.keyring 密钥环文件进行认证
  • MON keyring 的内容被修改也不影响 MON 的启动,但会影响共享密钥认证
  • OSD 启动需要正确的 keyring,否则无法启动,正确的 keyring 会被存在 MON 数据库中
  • Client 访问集群和 OSD 一样,需要正确的 keyring 与存在 MON 数据库中对应的 keyring 相匹配

Ceph 的用户管理与认证的更多相关文章

  1. ceph简单用户管理

    列出所有用户 ceph auth list 获取指定用户 ceph auth get client.admin 新增用户并输出密钥环 ceph auth get-or-create client.ge ...

  2. Django用户管理及认证

    同步组http://www.douban.com/group/topic/29387804/ ldapsearch -x -w password -D "cn=me,cn=Users,dc= ...

  3. 005 Ceph配置文件及用户管理

    一.Ceph的配置文件 Ceph 配置文件可用于配置存储集群内的所有守护进程.或者某一类型的所有守护进程.要配置一系列守护进程,这些配置必须位于能收到配置的段落之下.默认情况下,无论是ceph的服务端 ...

  4. Ubuntu 18.04.5 LTS Ceph集群之 cephx 认证及使用普通用户挂载RBD和CephFS

    1.cephx认证和授权 1.1 CephX认证机制 Ceph使用cephx协议对客户端进行身份认证: 1.每个MON都可以对客户端进行身份验正并分发密钥, 不存在单点故障和性能瓶颈 2. MON会返 ...

  5. mongodb的用户管理及安全认证

    1.确认mongodb的版本 > use admin switched to db admin > db.runCommand({}) { "version" : &q ...

  6. 【mongodb用户和身份认证管理】

    admin系统库用户管理 #移除 #查看 特定的数据库用户管理 #添加 #修改密码

  7. Ceph 存储集群1-配置:硬盘和文件系统、配置 Ceph、网络选项、认证选项和监控器选项

    所有 Ceph 部署都始于 Ceph 存储集群.基于 RADOS 的 Ceph 对象存储集群包括两类守护进程: 1.对象存储守护进程( OSD )把存储节点上的数据存储为对象: 2.Ceph 监视器( ...

  8. MongoDB的用户管理(6)

    注意: A)在mongodb中,有一个admin数据库, 牵涉到服务器配置层面的操作,需要先切换到admin数据. 即 use admin , -->相当于进入超级用户管理模式. B)mongo ...

  9. oracle 学习笔记--用户管理

    oracle 用户管理 创建用户(需要具有dba权限的用户) create user 用户名 identified by 密码 defaule tablespace users     //默认表空间 ...

随机推荐

  1. python常用模块:标准文件及模块练习

    1.请写出规范目录 并解释各文件夹的作用 bin 执行文件core 核心业务逻辑conf 配置文件lib 库.公共代码.第三方模块db 数据分析log 日志文件readme 文本文档 2.改造atm+ ...

  2. c++四种分配内存的方法整理

    1 calloc 函数: void *calloc(unsigned int num, unsigned int size) 按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连 ...

  3. 版本控制工具 svn 一

    一.svn 概述 1).svn的作用 1.多人协作开发:2.远程控制:3.版本控制 2).软件控制管理工具发展之路 SCM:软件配置管理,所谓的软件配置管理实际就是软件源代码的 控制与管理. CVS: ...

  4. zencart加大数据表字段长度

    批量表产品名称过长导致被截断的情况,是由于产品名称超出了数据库表中字段设置的最大长度,下面通过修改数据库表字段长度来避免此类情况发生: ) ; ) ; ) ; ) ; ) ; ) ; ) ; ) ; ...

  5. 微服务框架SpringCloud与Dubbo

    #v1.0.0# 1.背景 Dubbo,是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点.阿里巴巴近几年对开源社区的贡献不论在国内还是国外都是引人注目的,比如:JStorm捐赠给 ...

  6. CSS3 zoom 属性

    zoom:normal | <number> | <percentage> 默认值:normal normal: 使用对象的实际尺寸. <number>: 用浮点数 ...

  7. printf格式输出

    参考:http://www.cplusplus.com/reference/cstdio/printf/ C string that contains the text to be written t ...

  8. 【转】java中的clone

    java中的clone Clone&Copy 假设现在有一个Employee对象,Employee tobby =new Employee("CMTobby",5000), ...

  9. 2017"百度之星"程序设计大赛 - 初赛(A) [ hdu 6108 小C的倍数问题 ] [ hdu 6109 数据分割 ] [ hdu 6110 路径交 ] [ hdu 6112 今夕何夕 ] [ hdu 6113 度度熊的01世界 ]

    这套题体验极差. PROBLEM 1001 - 小C的倍数问题 题 OvO http://acm.hdu.edu.cn/showproblem.php?pid=6108 (2017"百度之星 ...

  10. Codeforces Round #427 (Div. 2) [ C. Star sky ] [ D. Palindromic characteristics ] [ E. The penguin's game ]

    本来准备好好打一场的,然而无奈腹痛只能带星号参加 (我才不是怕被打爆呢!) PROBLEM C - Star sky 题 OvO http://codeforces.com/contest/835/p ...