ceph认证和授权

ceph配置与认证授权

1、ceph配置

  • 以前的N版本的话,需要自己手动更改这个配置文件,但是了N版本之后,大部分操作都能自己优化,不需要手动更改了
# ceph的配置文件里面的参数是非常少的

[root@ceph01 ~]# cat /etc/ceph/ceph.conf 
# minimal ceph.conf for 055471d0-1f84-11f1-bcb5-000c29fecb8e
[global]
	fsid = 055471d0-1f84-11f1-bcb5-000c29fecb8e
	mon_host = [v2:192.168.50.20:3300/0,v1:192.168.50.20:6789/0] [v2:192.168.50.21:3300/0,v1:192.168.50.21:6789/0] [v2:192.168.50.22:3300/0,v1:192.168.50.22: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

[root@ceph01 ~]# ceph orch ps 
NAME                  HOST    PORTS        STATUS        REFRESHED  AGE  MEM USE  MEM LIM  VERSION  IMAGE ID      CONTAINER ID  
alertmanager.ceph01   ceph01  *:9093,9094  running (2h)     2m ago   3d    29.9M        -  0.23.0   ba2b418f427c  b125cf2f34ef  
crash.ceph01          ceph01               running (2h)     2m ago   3d    6849k        -  16.2.13  e08a45948779  c34549ad801c  
crash.ceph02          ceph02               running (2h)     2m ago   3d    6681k        -  16.2.13  e08a45948779  0ef63a3cd6ec  
crash.ceph03          ceph03               running (2h)     2m ago   3d    12.5M        -  16.2.13  e08a45948779  26a3dc784bc4  
grafana.ceph01        ceph01  *:3000       running (2h)     2m ago   3d    83.6M        -  8.3.5    dad864ee21e9  2d1d53924032  
mgr.ceph01.adgyya     ceph01  *:9283       running (2h)     2m ago   3d     400M        -  16.2.13  e08a45948779  4186d0b57fc6  
mgr.ceph02.ozztnq     ceph02  *:8443,9283  running (2h)     2m ago   3d     470M        -  16.2.13  e08a45948779  f603b662bac6  

3、使用命令行修改配置

1、全部修改(使用服务名)

  • 一个服务对应多个进程(多个容器)

  • 指定某个服务时候,会修改这个服务的所有进程配置

# 设置所有的osd
[root@ceph01 ~]# ceph config set osd debug_osd 20

# 发现所有的osd对设置了20
[root@ceph01 ~]# ceph config show osd.0 debug_osd
20/20
[root@ceph01 ~]# ceph config show osd.1 debug_osd
20/20

2、部分修改(修改进程)

[root@ceph01 ~]# ceph config show osd.1 debug_osd
10/10
[root@ceph01 ~]# ceph config show osd.2 debug_osd
20/20

3、临时生效

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

[root@ceph01 ~]# ceph tell osd.3 config set debug_osd 5
{
    "success": ""
}

[root@ceph01 ~]# ceph config show osd.3 debug_osd
5/5

4、ceph配置项

  • 配置项特别多
[root@ceph01 ~]# ceph config ls |wc -l
2068


# 过滤我们需要设置的参数
[root@ceph01 ~]# ceph config ls | grep mon_all
mon_allow_pool_delete
mon_allow_pool_size_one

5、老版本提供的配置文件

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

2、ceph网络

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

img

1、 对现有集群加入cluster network

  • 每个节点都加一张网卡,仅主机模式
[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

3、cephx(认证授权)

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

1、认证流程

  • 客户端发起认证请求

    • 客户端(如client.test)向任意一个Monitor发起连接请求,并告知自己的用户ID(例如client.test
  • Monitor验证并发放会话密钥

    • Monitor收到请求后,会检查本地是否有该用户的信息。如果用户存在,Monitor会生成一个临时的会话密钥(Session Key),并用该用户预先存储的共享密钥(即密钥环文件里的那个密钥)加密后,发送回客户端
  • 客户端请求服务票据

    • 客户端使用本地的密钥环文件解密Monitor的回复,从而获得会话密钥。然后,客户端使用这个会话密钥,向Monitor发起获取访问特定服务(如OSD)的请求
  • Monitor发放服务票据(Ticket)

    • Monitor验证客户端的请求无误后,会发放一个加密的服务票据(Ticket)。这个票据包含了客户端的身份信息,并设置了有效期,客户端可以用它来向OSD证明自己的身份
  • 客户端访问OSD服务

    • 客户端拿着这个票据去访问OSD。因为所有OSD和Monitor共享一个集群secret,所以OSD能够解密并信任由Monitor签发的票据。OSD验证票据合法后,再检查该用户的能力(Capabilities)是否允许执行当前操作(例如,是否有权限向test池写入数据)。如果都通过,操作才会被执行

2、cephx中的用户

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

  • Cephx协议将用户分为两类

    • 客户端:用户客户端访问,$type永久设置为client,如client.admin、client.cinder

    • 服务进程:不止用户需要找mon认证,服务也是需要的,服务的$type为对应的组件名称,如 osd.0 、mgr.ceph01.xxxx

1、查看用户列表

[root@ceph01 ~]# ceph auth ls
osd.0
	key: AQDNJLZpzPk+BhAAIcnk8AWc+vVqHSikyZv1XA==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *
osd.1
	key: AQDoJLZpHejEERAAzpiupKZA416SZQg80VWa0Q==
	caps: [mgr] allow profile osd
	caps: [mon] allow profile osd
	caps: [osd] allow *

  • key:这里的面显示key就是他的密钥

  • caps:这个就是他的授权信息,授权部分会说

3、用户创建

  • 创建用户有3种方式

    • ceph auth add

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

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

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

    • ceph auth get-or-create

      • 当用户不存在,则创建用户、添加权限并返回用户和keyring

      • 当用户存在,且指定的权限和当前权限一致,则不做任何修改,并返回用户和key

      • 如果用户存在,且指定的权限和当前的权限不一致,则保持权限不变,并返回报错信息

    • ceph auth get-or-create-key

      • 当用户不存在,则创建用户、添加并返回用户和keyring

      • 当用户存在,且指定的权限和当前的权限一致,则不做修改,并返回key

      • 如果用户存在,且指定的权限和当前的权限不一致,则保持权限不变,并返回报错信息

1、创建用户

[root@ceph01 ~]# ceph auth  get-or-create client.test
[client.test]
	key = AQDYGrhpY120GBAAySOhdSygpQ01kMziz/kZKA==


# 这个test用户还什么都没有权限
[root@ceph01 ~]# ceph auth  ls | grep test -C2
installed auth entries:

	caps: [mgr] profile crash
	caps: [mon] profile crash
client.test
	key: AQDYGrhpY120GBAAySOhdSygpQ01kMziz/kZKA==
mgr.ceph01.adgyya

  • 用这个用户来执行一下ceph命令,看一下报错信息
# 说没有这个密钥文件
[root@ceph01 ~]# ceph -s --id test
2026-03-16T23:01:08.579+0800 7f6d2d334640 -1 auth: unable to find a keyring on /etc/ceph/ceph.client.test.keyring,/etc/ceph/ceph.keyring,/etc/ceph/keyring,/etc/ceph/keyring.bin,: (2) No such file or directory


# 我们创建这个密钥文件,就是创建用户的时候输出的信息

[root@ceph01 ~]# ceph auth get client.test > ./ceph.client.test.keyring
exported keyring for client.test

[root@ceph01 ~]# cat ceph.client.test.keyring 
[client.test]
	key = AQDYGrhpY120GBAAySOhdSygpQ01kMziz/kZKA==

# 指定密钥查看

[root@ceph01 ceph]# ceph -s  --id client.test --keyring ceph.client.test.keyring 
2026-03-16T23:05:59.364+0800 7f350e101640 -1 monclient(hunting): handle_auth_bad_method server allowed_methods [2] but i only support [2,1]
2026-03-16T23:05:59.367+0800 7f350d900640 -1 monclient(hunting): handle_auth_bad_method server allowed_methods [2] but i only support [2,1]
2026-03-16T23:05:59.369+0800 7f350d0ff640 -1 monclient(hunting): handle_auth_bad_method server allowed_methods [2] but i only support [2,1]
[errno 13] RADOS permission denied (error connecting to the cluster)

# 发现没有权限,因此的话,后面将介绍权限的操作

2、删除用户

[root@ceph01 ceph]# ceph auth rm client.test
updated

# 成功删除了用户
[root@ceph01 ceph]# ceph auth ls | grep test
installed auth entries:


用户授权

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

在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 赋予用户对块设备只读权限
  • x权限就是一个用户对另外一个用户有什么权限,有什么样的操作

1、创建用户并授权

1、创建用户test,这个用户可以考单集群的状态,并对test存储池有读写权限

# 任何用户必须有对mon的读的权限,因为必须要连接这个集群,才能进行认证
# osd allow rw 这是对所有osd有读写的权限,权限太大了。因此的话,需要指定这个存储池
[root@ceph01 ~]# ceph auth  get-or-create client.test mon "allow r" osd "allow rw pool=test1"
[client.test]
	key = AQDTorhppQRRDxAACwC6T15l3PDK54y52XZZIg==

# 查看这个用户的权限,也就是密钥文件,ceph.client.test.keyring 这个文件
[root@ceph01 ~]# ceph auth  get client.test
[client.test]
	key = AQDTorhppQRRDxAACwC6T15l3PDK54y52XZZIg==
	caps mon = "allow r"
	caps osd = "allow rw pool=test1"
exported keyring for client.test

# 保存密钥信息,这个文件的命名,非常的严格,ceph.client.用户.keyring 这个结尾
[root@ceph01 ~]# ceph auth get client.test > ./ceph.client.test.keyring
exported keyring for client.test
[root@ceph01 ~]# cat ceph.client.test.keyring 
[client.test]
	key = AQDTorhppQRRDxAACwC6T15l3PDK54y52XZZIg==
	caps mon = "allow r"
	caps osd = "allow rw pool=test1"

# 使用这个用户访问集群
# --name 和--id 一样的,指定用户
# --keyring 指定密钥文件,里面存储了这个用户有什么的权限
[root@ceph01 ~]# ceph  osd pool ls --name client.test --keyring ./ceph.client.test.keyring
device_health_metrics
test1
test2

# 上传文件在test这个存储池
[root@ceph01 ~]# rados --name client.test --keyring ./ceph.client.test.keyring -p test1 put 123.txt /etc/hosts

# 查看test1存储池的对象
[root@ceph01 ~]# rados --name client.test --keyring ./ceph.client.test.keyring -p test1 ls 
123.txt

# 对这个存储池有rw的权限了

# 测试对其他的存储池有没有权限
# 发现对test2存储池没有权限
[root@ceph01 ~]# rados --name client.test --keyring ./ceph.client.test.keyring -p test2 put 11.txt /etc/hosts
error putting test2/11.txt: (1) Operation not permitted

2、创建一个超级管理员

  • 就是对一些服务有*权限即可
# 对mon,mgr,osd,msd 有所有的权限
[root@ceph01 ~]# ceph auth get-or-create client.test1 mon "allow *" mgr "allow *" osd "allow *" mds "allow *"
[client.test1]
	key = AQBwp7hpAgxKCxAA7kz+XuR/5pwPAEaLg9oY9Q==

# 查看用户的权限
[root@ceph01 ~]# ceph auth get client.test1
[client.test1]
	key = AQBwp7hpAgxKCxAA7kz+XuR/5pwPAEaLg9oY9Q==
	caps mds = "allow *"
	caps mgr = "allow *"
	caps mon = "allow *"
	caps osd = "allow *"
exported keyring for client.test1

# 保存一个密钥文件
[root@ceph01 ~]# ceph auth get client.test1 > ./ceph.client.test1.keyring
exported keyring for client.test1

# 查看集群信息
[root@ceph01 ~]# ceph -s --name client.test1 --keyring ./ceph.client.test1.keyring
  cluster:
    id:     055471d0-1f84-11f1-bcb5-000c29fecb8e
    health: HEALTH_WARN
            Degraded data redundancy: 1/9 objects degraded (11.111%), 32 pgs undersized
            2 pool(s) do not have an application enabled
 
  services:
    mon: 3 daemons, quorum ceph01,ceph02,ceph03 (age 30m)
    mgr: ceph02.ozztnq(active, since 30m), standbys: ceph01.adgyya
    osd: 9 osds: 9 up (since 30m), 9 in (since 45h)
 
  data:
    pools:   3 pools, 65 pgs
    objects: 2 objects, 444 B
    usage:   65 MiB used, 90 GiB / 90 GiB avail
    pgs:     1/9 objects degraded (11.111%)
             33 active+clean
             32 active+undersized

3、创建一个用户test2

  • 对test1存储池有读写

  • 对test2只读

  • 能够使用文件系统

[root@ceph01 ~]# ceph auth  get-or-create client.test2 mon "allow r" osd "allow rw pool=test1,allow r pool=test2 , allow rw pool=cephfs_metadata, allow rw pool=cephfs_data" mds "allow r"
[client.test2]
	key = AQAbqbhpHGBmFBAALLyUvmlQDguluW3lueu30A==

# 能够使用文件系统,后面会细说的
# cephfs_metadata 能够获取这个存储池的元数据信息
# cephfs_data 就是能够存储数据

[root@ceph01 ~]# ceph auth  get client.test2
[client.test2]
	key = AQAbqbhpHGBmFBAALLyUvmlQDguluW3lueu30A==
	caps mds = "allow r"
	caps mon = "allow r"
	caps osd = "allow rw pool=test1,allow r pool=test2 , allow rw pool=cephfs_metadata, allow rw pool=cephfs_data"
exported keyring for client.test2

4、修改权限

  • 之前见过的,就是caps操作

  • 当发现这个权限给错的时候,并不需要删除用户

# 对test2用户修改权限
[root@ceph01 ~]# ceph auth  caps client.test2 mon "allow r" osd "allow r pool=test1"
updated caps for client.test2
[root@ceph01 ~]# ceph auth get client.test2
[client.test2]
	key = AQAbqbhpHGBmFBAALLyUvmlQDguluW3lueu30A==
	caps mon = "allow r"
	caps osd = "allow r pool=test1"
exported keyring for client.test2

posted @ 2026-03-16 22:49  乔的港口  阅读(1)  评论(0)    收藏  举报