需求
cephfs支持client端的authentication,来限制不同的用户访问不同的目录,或者后端的pool,但需要先开启ceph集群的认证。
环境
1 | Ceph:Jewel 10.2.7 |
打开ceph集群认证
修改ceph.conf
1 | # vim /etc/ceph/ceph.conf |
检查ceph模块的keyring
开启ceph认证后,各个模块都会受到自己的keyring的权限限制。
默认各个模块的keyring都在目录/var/lib/ceph/下的对应子目录里。
比如ceph osd-0的keyring:
1 | # cat /var/lib/ceph/osd/ceph-0/keyring |
在我们系统里,查看各个monitor的对应目录是没有keyring的,所以要自己手动创建,命令如下:
1 | # ceph-authtool --create-keyring /tmp/ceph.mon.keyring --gen-key -n mon. --cap mon 'allow *’ |
若有多个monitor节点,把文件/tmp/ceph.mon.keyring拷贝到其它节点的monitor目录即可
检查mds的keyring
1 | # cat /var/lib/ceph/mds/ceph-mds1/keyring |
若没有对应的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 | # systemctl restart ceph-mon.target |
创建auth client
创建不同的client,赋予不同的权限访问cephfs
1 | # ceph auth get-or-create client.tst1 mon 'allow r' mds 'allow r, allow rw path=/tst1’ osd 'allow rw' |
上诉命令解释:
- mon ‘allow r’ :允许user从monitor读取数据;必须配置
- mds ‘allow r, allow rw path=/tst1’:允许user从mds读取数据,允许user对目录/tst1读写;其中’allow r’必须配置,不然user不能从mds读取数据,mount会报permission error;
- 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 | # ceph auth list |
测试cephfs client auth
1 | # mount -t ceph 10.10.2.1:6789:/tst1 /home/mike/tst1/ -o name=tst1,secret=AQdd+UBZxpi4EaAAUNyBDGdZbPgfd4oUb+u41A== |
验证两个目录都有读写权限,cd进去后可以正常读写。
1 | # umount /home/mike/tst1/ |
上诉命令把整个cephfs通过不同的user mount到不同的目录,进去可以发现,是可以看到整个cephfs的文件信息的,但是不能访问user没有rw权限的文件。
1 | # cd /home/mike/tst1/ // 进入user tst1 mount的目录,该目录访问受到user tst1的权限限制 |
所以从上面的测试中可以看出,若用户有对cephfs的目录权限控制,我们可以通过上述user的auth来实现。但这部分也不是很完善,还没找到能支持readonly访问某一目录的方法。
参考
http://docs.ceph.com/docs/jewel/rados/configuration/auth-config-ref/
http://docs.ceph.com/docs/jewel/cephfs/client-auth/