cephfs开启client端认证

需求

cephfs支持client端的authentication,来限制不同的用户访问不同的目录,或者后端的pool,但需要先开启ceph集群的认证。

环境

1
2
3
Ceph:Jewel 10.2.7
Host:CentOS Linux release 7.2.1511 (Core)
Kernel Version: Linux 3.10.0-327.el7.x86_64

打开ceph集群认证

修改ceph.conf

1
2
3
4
# vim /etc/ceph/ceph.conf
auth_cluster_required = cephx
auth_service_required = cephx
auth_client_required = cephx

检查ceph模块的keyring

开启ceph认证后,各个模块都会受到自己的keyring的权限限制。
默认各个模块的keyring都在目录/var/lib/ceph/下的对应子目录里。
比如ceph osd-0的keyring:

1
2
3
# cat /var/lib/ceph/osd/ceph-0/keyring
[osd.0]
key = AQACrQFZbvBLARAAWXWdeXgVd3SN7NmAYzXDtg==

在我们系统里,查看各个monitor的对应目录是没有keyring的,所以要自己手动创建,命令如下:

1
2
# ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *’
# cp /tmp/ceph.mon.keyring /var/lib/ceph/mon/ceph-mon1/keyring

若有多个monitor节点,把文件/tmp/ceph.mon.keyring拷贝到其它节点的monitor目录即可

检查mds的keyring

1
2
3
# cat /var/lib/ceph/mds/ceph-mds1/keyring
[mds.mds1]
key = AQCJ8CNZhh7ZNxAAtKplOjgzBdEPpc/g4C2QWg==

若没有对应的keyring,通过下面的命令创建,{$id}是mds的name:

1
# ceph auth get-or-create mds.{$id} mon 'allow rwx' osd 'allow *' mds 'allow *' -o /var/lib/ceph/mds/ceph-{$id}/keyring

重启ceph服务

在对应的ceph服务节点重启各个服务,命令如下:

1
2
3
# systemctl restart ceph-mon.target
# systemctl restart ceph-osd.target
# systemctl restart ceph-mds.target

创建auth client

创建不同的client,赋予不同的权限访问cephfs

1
2
# ceph auth get-or-create client.tst1 mon 'allow r' mds 'allow r, allow rw path=/tst1’ osd 'allow rw'
# ceph auth get-or-create client.tst2 mon 'allow r' mds 'allow r, allow rw path=/tst2’ osd 'allow rw'

上诉命令解释:

  1. mon ‘allow r’ :允许user从monitor读取数据;必须配置
  2. mds ‘allow r, allow rw path=/tst1’:允许user从mds读取数据,允许user对目录/tst1读写;其中’allow r’必须配置,不然user不能从mds读取数据,mount会报permission error;
  3. osd ‘allow rw’ :允许user从osd上读写数据;若不配置,用户只能从mds上获取FS的元数据信息,没法查看各个文件的数据;

注释:

  • ceph client的auth还不是很完善,上面配置中限制了 client tst1能读写/tst1目录,client tst2能读写/tst2目录,但是user tst1/tst2都能看到并读取FS的所有文件,还没找到如何设置user只能访问到指定子目录的方法

  • osd还可以配置指定访问pool和namespace,比如配置osd 'allow rw pool=cephfs_data2',既是指定该user只能rw pool cephfs_data2;

    结合命令:setfattr -n ceph.dir.layout -v "pool=cephfs_data2" /mnt/tst1/ 可以配置目录tst1使用cephfs_data2的pool,这样可以做到多租户的数据隔离(以pool为单位)。以admin用户登录,修改tst1目录的attr。

  • namespace说是可以指定user访问同一pool的不同namespace,可以做多租户的数据隔离,但还没找到如何配置使用。文档说明是只有librados支持,ceph client(rbd/rgw/cephfs)都还不支持。

检查ceph auth

1
2
3
4
5
6
7
8
9
10
11
# ceph auth list
...
client.tst1
key: AQCd+UBZxpi4EBAAUNyBDGdZbPgfd4oUb+u41A==
caps: [mds] allow r, allow rw path=/tst1
caps: [mon] allow r
client.tst2
key: AQC5FUFZ6EycMBAAx9yD8DFmii2PIEv9YOVLUw==
caps: [mds] allow r, allow rw path=/tst2
caps: [mon] allow r
...

测试cephfs client auth

1
2
# mount -t ceph 10.10.2.1:6789:/tst1 /home/mike/tst1/ -o name=tst1,secret=AQdd+UBZxpi4EaAAUNyBDGdZbPgfd4oUb+u41A==
# mount -t ceph 10.10.2.1:6789:/tst2 /home/mike/tst2/ -o name=tst2,secret=AQd5FUFZ6EycMaAAx9yD8DFmii2PIEv9YOVLUw==

验证两个目录都有读写权限,cd进去后可以正常读写。

1
2
3
4
# umount /home/mike/tst1/
# umount /home/mike/tst2/
# mount -t ceph 10.10.2.1:6789:/ /home/mike/tst1/ -o name=tst1,secret=AQdd+UBZxpi4EaAAUNyBDGdZbPgfd4oUb+u41A==
# mount -t ceph 10.10.2.1:6789:/ /home/mike/tst2/ -o name=tst2,secret=AQd5FUFZ6EycMaAAx9yD8DFmii2PIEv9YOVLUw==

上诉命令把整个cephfs通过不同的user mount到不同的目录,进去可以发现,是可以看到整个cephfs的文件信息的,但是不能访问user没有rw权限的文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# cd /home/mike/tst1/       // 进入user tst1 mount的目录,该目录访问受到user tst1的权限限制
# ls // 访问cephfs的根目录
1.txt tst1 tst2
# cat 1.txt
cat: 1.txt: Operation not permitted
# cd tst1
# echo "hello tst1" > tst1file
# cat tst1file
hello tst1
# cd ../tst2
# echo "hello tst1" > tst1file
bash: tst1file: Permission denied

# cd /home/mike/tst2/ // 进入user tst2 mount的目录,该目录访问受到user tst2的权限限制
# ls // 访问cephfs的根目录
1.txt tst1 tst2
# cat 1.txt
cat: 1.txt: Operation not permitted
# cd tst1
# echo "hello tst2" > tst2file
bash: tst2file: Permission denied
# cd ../tst2
# echo "hello tst2" > tst2file
# cat tst2file
hello tst2

所以从上面的测试中可以看出,若用户有对cephfs的目录权限控制,我们可以通过上述user的auth来实现。但这部分也不是很完善,还没找到能支持readonly访问某一目录的方法。

参考

http://docs.ceph.com/docs/jewel/rados/configuration/auth-config-ref/
http://docs.ceph.com/docs/jewel/cephfs/client-auth/

支持原创