Ceph配置与认证授权

目录

  • Ceph配置与认证授权
    • [1. 为什么现在不采用修改配置文件的方式了呢?](#1. 为什么现在不采用修改配置文件的方式了呢?)
    • [2. Ceph元变量](#2. Ceph元变量)
      • [3. 使用命令行修改配置](#3. 使用命令行修改配置)
      • [3.1 全部修改(使用服务名)](#3.1 全部修改(使用服务名))
      • [3.2 部分修改(修改进程)](#3.2 部分修改(修改进程))
      • [3.3 临时生效](#3.3 临时生效)
      • [3.4 配置项](#3.4 配置项)
      • [3.5 老版本提供的配置文件](#3.5 老版本提供的配置文件)
    • [3. Ceph网络](#3. Ceph网络)
      • [3.1 对现有集群加入cluster network](#3.1 对现有集群加入cluster network)
    • [4. Cephx(认证授权)](#4. Cephx(认证授权))
      • [4.1 认证流程](#4.1 认证流程)
      • [4.2 Cephx中的用户](#4.2 Cephx中的用户)
        • [4.2.1 查看用户列表](#4.2.1 查看用户列表)
      • [4.3 用户创建](#4.3 用户创建)
        • [4.3.1 创建用户](#4.3.1 创建用户)
        • [4.3.2 删除用户](#4.3.2 删除用户)
    • [5. 用户授权](#5. 用户授权)
      • [5.1 创建用户并授权](#5.1 创建用户并授权)
      • [5.2 修改用户权限](#5.2 修改用户权限)

Ceph配置与认证授权

Ceph的配置了解即可,因为Ceph目前的配置很多都能自动的去调整,而且优化的不错,正常情况下我们不去需要去修改,但是我们得知道怎么去改。

目前我们使用的版本的配置文件里面内容是非常少的

bash 复制代码
[root@ceph01 ceph]# cat /etc/ceph/ceph.conf 
# minimal ceph.conf for dc6d1544-17ef-11ef-9393-000c297dea16
[global]
	fsid = dc6d1544-17ef-11ef-9393-000c297dea16
	mon_host = [v2:192.168.101.10:3300/0,v1:192.168.101.10:6789/0] [v2:192.168.101.20:3300/0,v1:192.168.101.20:6789/0] [v2:192.168.101.30:3300/0,v1:192.168.101.30:6789/0]

在以前的版本里面是非常多的

Ceph集群配置的来源

  • 编译时设置的值
  • mon集群的集中配置数据库
  • 保存在本地的配置文件
  • 环境变量
  • 命令行输入
  • 管理员配置的临时生效的配置

1. 为什么现在不采用修改配置文件的方式了呢?

因为如果你要修改osd的配置项的话,你改完配置文件之后需要把配置文件分发到所有的osd节点,并且重启osd进程这个配置才会生效,很麻烦。但是现在采用命令行的方式去修改的话是立即生效并且不用每个节点都执行的。这种方式取代了修改配置文件。

2. Ceph元变量

  • $cluster:集群名称,多用于相同硬件上运行多个集群的场景
  • $type:服务或进程的类型,如mds,osd,mon等
  • id:服务或客户端ID,如osd.0 ,osd为type的值, 0为$id的值
  • $host:服务所在主机的名称
  • name:type+$id
  • $pid:服务的进程ID

可以使用**ceph orch ps **来查看

bash 复制代码
[root@ceph01 ceph]# ceph orch ps
NAME                  HOST    PORTS        STATUS        REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID  
alertmanager.ceph01   ceph01  *:9093,9094  running (2d)     7m ago   3d    50.0M        -  0.23.0   ba2b418f427c  f549d23bce6e  
crash.ceph01          ceph01               running (2d)     7m ago   3d    17.1M        -  16.2.13  e08a45948779  0785e13fe4ee  
crash.ceph02          ceph02               running (2d)     2s ago   3d    20.1M        -  16.2.13  e08a45948779  11dc05748956  
crash.ceph03          ceph03               running (2d)     8m ago   3d    29.1M        -  16.2.13  e08a45948779  8a19421c0fe1  
grafana.ceph01        ceph01  *:3000       running (2d)     7m ago   3d     149M        -  8.3.5    dad864ee21e9  6c72c1cfe9e2  
mgr.ceph01.luyssm     ceph01  *:9283       running (2d)     7m ago   3d     527M        -  16.2.13  e08a45948779  bb97a49842cd  

3. 使用命令行修改配置

3.1 全部修改(使用服务名)

当我们指定的是某个服务的时候,他会修改这个服务的所有进程配置

bash 复制代码
[root@ceph01 ceph]# ceph config set osd debug_osd 20
[root@ceph01 ceph]# ceph config show osd.0 debug_osd
20/20
[root@ceph01 ceph]# ceph config show osd.1 debug_osd
20/20
[root@ceph01 ceph]# ceph config show osd.2 debug_osd
20/20

我们可以看到,不管是osd几,都被修改成了20,那我们只想修改一个呢?

3.2 部分修改(修改进程)

修改osd.1 为10,其他的还是20

bash 复制代码
[root@ceph01 ceph]# ceph config show osd.1 debug_osd
10/10
[root@ceph01 ceph]# ceph config show osd.2 debug_osd
20/20

这样就修改了osd.1这个进程的配置为10,其他的一样还是20

3.3 临时生效

使用命令行去修改大部分配置都是立即生效并且是永久生效的,但还有一些配置是他要求你必须重启进程才会生效的,这种配置我们就可以使用临时生效来代替,临时生效会立即生效。所以我们可以先设置永久生效,然后再设置一个临时生效,那么就可以避免立即重启进程。

bash 复制代码
[root@ceph01 ceph]# ceph tell osd.3 config set debug_osd 5
{
    "success": ""
}
[root@ceph01 ceph]# ceph config show osd.3 debug_osd
5/5

3.4 配置项

Ceph的配置项非常的多,我们可以去过滤

bash 复制代码
[root@ceph01 ceph]# ceph config ls |wc -l
2068

总共是有2068个配置项

bash 复制代码
[root@ceph01 ceph]# ceph config ls |grep mon_allow
mon_allow_pool_delete
mon_allow_pool_size_one
[root@ceph01 ~]# ceph config show osd.1 |grep debug_osd
debug_osd             10/10                                                                                                                                                        mon

我们可以通过grep来过滤出我们想要的配置

3.5 老版本提供的配置文件

老版本提供的配置文件也是存在的,现在被放到了**/usr/share/doc/ceph/sample.ceph.conf**,想看可以打开看看

3. Ceph网络

客户端来连接ceph的时候,无论是读还写写数据,走的都是一张网卡,这样会导致带宽过大,并且一个pg写入数据之后其他pg也需要同步。所以Ceph推荐每个主机有2张网卡,一张是 public network 用来接受用户的读写请求,另一张网卡为cluster network 用来集群内部同步备份数据,当然,ceph并没有对网卡做强制要求,只有一张网卡的话也是没有问题的。

3.1 对现有集群加入cluster network

每个节点网卡的IP地址自行配置

bash 复制代码
[root@ceph01 ~]# ceph config set mon public_network 10.104.0.0/16
[root@ceph01 ~]# ceph config set mon cluster_network 192.168.101.0/24
[root@ceph01 ~]# ceph config get mon public_network
10.104.0.0/16
[root@ceph01 ~]# ceph config get mon cluster_network
192.168.101.0/24

4. Cephx(认证授权)

我们之前使用rados命令手动上传文件到存储池内,但是这只是做个测试用的,ceph的功能肯定是对外提供服务,既然是对外提供服务那么就不可能是每个人来了我都给他分配存储,所以这时候就需要用到认证,授权,ceph采用的这种认证方式就是cephx

4.1 认证流程

    1. 客户端携带用户名,cephx密钥向mon发起连接,mon收到这个请求之后验证用户的身份,身份认证通过之后返回一个session key(令牌)给客户端,同时mon将这个session key(令牌)通告给其他的服务
    1. 客户端收到session key之后进行解密,并向mon申请一个ticket(票据),mon产生ticket返回给客户端

    注意:ticket是有有效期的,过期之后流程得重新来一遍,并且mon返回的ticket是使用密钥加密的,防止ticket泄露,客户端拿到之后使用自己的密钥就可以将ticket解密了

    1. 客户端之后的每次请求就都是使用ticket进行(ticket在有效期内),因为客户端,mon,osd,mds都拥有由mon产生的令牌,所以他们都可以认证这个ticket是否合法

4.2 Cephx中的用户

  • Cephx协议对用户的格式有严格的要求,必须使用**type.id**的格式

  • Cephx协议将用户分为两类

    • 客户端:用户客户端访问,$type永久设置为client,如client.admin、client.cinder
    • 服务进程:不止用户需要找mon认证,服务也是需要的,服务的**$type为对应的组件名称**,如 osd.0 、mgr.ceph01.xxxx

4.2.1 查看用户列表

bash 复制代码
[root@ceph01 ~]# ceph auth ls
osd.0
	key: AQASi01msk5MJRAAJNFrw1pvhHP3cxhb8eRIWg==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
osd.1
	key: AQAri01m0J6QNxAAWIW7gAX8mZ39vh4g6w+e5Q==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
osd.2
	key: AQCKi01m7V6TOxAA/dEuaEUIi8TfgHm2nmg2TA==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
osd.3
	key: AQBmjE1mRcgVGhAAjeehuD7EUEE9bSacnfQ+kw==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
	........................
  • key:这里的面显示key就是他的密钥
  • caps:这个就是他的授权信息,授权部分会说

4.3 用户创建

  • 创建用户有3种方式

      1. ceph auth add

        • 如果用户不存在,则创建用户并添加对应权限

        • 如果用户存在,且指定的权限与当前权限一致,则不进行任何修改且没有输出

        • 如果用户存在,且指定的权限与当前权限不一致,则提示

      2. ceph auth get-or-create

        • 当用户不存在,则创建用户、添加权限并返回用户和keyring
        • 当用户存在,且指定的权限和当前权限一致,则不做任何修改,并返回用户和key
        • 如果用户存在,且指定的权限和当前的权限不一致,则保持权限不变,并返回报错信息
      3. ceph auth get-or-create-key

        • 当用户不存在,则创建用户、添加并返回用户和keyring
        • 当用户存在,且指定的权限和当前的权限一致,则不做修改,并返回key
        • 如果用户存在,且指定的权限和当前的权限不一致,则保持权限不变,并返回报错信息

4.3.1 创建用户

bash 复制代码
[root@ceph01 ~]# ceph auth get-or-create client.test
[client.test]
	key = AQAbw1FmmuEAHhAAI6YeGmQV0RUTsCXme/O3+Q==
[root@ceph01 ~]# ceph auth ls|grep test -A1
installed auth entries:
client.test
	key: AQAbw1FmmuEAHhAAI6YeGmQV0RUTsCXme/O3+Q==

这里显示的跟其他用户不一样,因为我们只创建了用户,并没有给他任何权限,所以这里只显示他的密钥

如果要将文件保存到本地的话,文件名需要注意一下命名规范:cluster.client.id.keyring

如果test用户的文件名就应该是 ceph.client.test.keyring

4.3.2 删除用户

bash 复制代码
[root@ceph01 ~]# ceph auth rm  client.test
updated
[root@ceph01 ~]# ceph auth ls|grep test -A1
installed auth entries:

现在用户已经被删掉了

5. 用户授权

刚刚用户的创建和删除已经可以了,但是现在创建出来的用户是没有任何权限的,所以我们需要授权

在ceph中没有拒绝 这个权限,只有允许,意思就是只要没有给权限,那么就是没有权限

权限 说明
allow 为进程设置权限
r 为用户设置可读权限
w 为用户设置可访问对象权限
x 使用户能够调用类方法(既读和写)以及在mon上执行认证操作
* 全部权限
profile osd (仅限mon) 允许用户以osd的身份连接其他osd或者mon,用于osd心跳和状态报告
profile bootstrap-osd (仅限mon) 允许用户引导osd,用于cephadm或ceph-volume工具
profile mds (仅限mon) 允许用户以mds的身份连接其他mds或mon
profile bootstrap-mds (仅限mon) 允许用户引导mds
profile rbd (mgr,mon,osd) 允许用户使用块设备
profile rbd-read-only 赋予用户对块设备只读权限

下面这些profile 开头的这些都属于x权限里的一种

借用Linux老师的一句话来总结授权:

什么样的用户有什么样的权限,对什么样的服务做什么样的操作

5.1 创建用户并授权

  1. 需求:创建用户test,使其可以查看集群状态,并对资源池test_pool有读写权限
bash 复制代码
[root@ceph01 ~]# ceph auth get-or-create client.test mon 'allow r' osd 'allow rw pool=test_pool' 
[client.test]
	key = AQAlzFFm+6QnMRAA3lNgtJzN+/GByVWXfXhvrA==
[root@ceph01 ~]# ceph auth get client.test
[client.test]
	key = AQAlzFFm+6QnMRAA3lNgtJzN+/GByVWXfXhvrA==
	caps mon = "allow r"
	caps osd = "allow rw pool=test_pool"
[root@ceph01 ~]# ceph auth get client.test > ./ceph.client.test.keyring

# 使用这个用户访问集群
[root@ceph01 ~]# ceph osd pool ls --name client.test --keyring ./ceph.client.test.keyringdevice_health_metrics
test_pool
test02
# 上传文件
[root@ceph01 ~]# rados --name client.test --keyring ./ceph.client.test.keyring -p test_pool put keyring ./ceph.client.test.keyring 
[root@ceph01 ~]# rados --name client.test --keyring ./ceph.client.test.keyring -p test_pool ls
keyring

# 尝试上传到权限之外的pool
[root@ceph01 ~]# rados --name client.test --keyring ./ceph.client.test.keyring -p test02 put keyring ./ceph.client.test.keyring 
error putting test02/keyring: (1) Operation not permitted

现在test这个用户就仅仅只能对test_pool这个资源池上传文件,对其他的资源池上传文件就会报错操作没有权限

  1. 需求:要求再创建一个超级管理员 root
bash 复制代码
[root@ceph01 ~]# ceph auth get-or-create client.root mon 'allow *' mgr 'allow *' osd 'allow *' mds 'allow *'
[client.root]
	key = AQCNzlFmeeC6DhAAvmSyiuYXg/qiOp4qCKnZLQ==
[root@ceph01 ~]# ceph auth ls |grep -A5 root
installed auth entries:

client.root
	key: AQCNzlFmeeC6DhAAvmSyiuYXg/qiOp4qCKnZLQ==
	caps: [mds] allow *
	caps: [mgr] allow *
	caps: [mon] allow *
	caps: [osd] allow *
# 将文件导出并使用
[root@ceph01 ~]# ceph health detail --name client.root --keyring ./ceph.client.root.keyring
HEALTH_OK
  1. 创建一个用户test01,要求:
    1. 用户能够对test存储池进行读写
    2. 用户对test01存储池只读
    3. 用户能够使用文件系统
bash 复制代码
[root@ceph01 ~]# ceph auth get-or-create client.test01 mon 'allow r' osd 'allow rw pool=test, allow r pool=test01 , allow rw pool=cephfs_metadata, allow rw pool=cephfs_data' mds 'allow r'
[client.test01]
	key = AQCP0lFm2HNDAxAA+lJ9p8EYuAT6OQQabNuyYA==
[root@ceph01 ~]# ceph auth get client.test01
[client.test01]
	key = AQCP0lFm2HNDAxAA+lJ9p8EYuAT6OQQabNuyYA==
	caps mds = "allow r"
	caps mon = "allow r"
	caps osd = "allow rw pool=test, allow r pool=test01 , allow rw pool=cephfs_metadata, allow rw pool=cephfs_data"
exported keyring for client.test01

这里的osd里面有2个之前没见过的池,这两个就是文件系统,因为你要使用这个文件系统,就必须对这两个池有权限

5.2 修改用户权限

当权限给错了,或者后期需要修改权限时,并不需要删除用户

bash 复制代码
# 去掉刚刚创建的test01用户的mds权限,以及文件系统的权限
[root@ceph01 ~]# ceph auth caps client.test01 mon 'allow r' osd 'allow rw pool=test, allow r pool=test01'
updated caps for client.test01

注意,权限是没有删除的,所谓的修改权限只不过就是将你需要的权限重新再给一遍