关于ceph用户权限的问题
写在前面
松鼠哥的ceph专业课程上线啦!
面向新手同学,从0实战,全面入门ceph安装部署与运维,有需要的同学赶紧扫码订购吧:
照例打广告,我们组热烈招人中,有意向的老铁不要犹豫了,简历发起来!
本篇分享的一个问题,实际使用中还是比较有价值的
在实际的集群运行中,特定场景下,我们希望给某些用户赋予集群的访问权限,但是呢,我们又不希望给admin权限,毕竟admin权限太大了,万一对方不熟悉操作,乱搞一波删除,那就惨了,所以最好是进行一定的权限限制
开始
首先要界定一下给予的普通用户的权限范围
现在,我们假设集群有3种业务:对象存储、块存储、文件存储,而现在,我们要给某个用户(就叫authtest吧)开通块存储的操作权限,而对于其他业务存储,则限制其操作
集群的用户权限,主要是对四种角色进行鉴权:
- mds,文件存储的元数据服务器
- mon,集群的管理者
- osd,数据的存储者
- mgr,集群管理者的秘书
如果要对某个用户授权,那么就主要是针对这4种角色进行权限的操作。现在,我们要给用户authtest进行授权,其只能执行对块存储相关的命令及块的操作,对其他的存储业务没有权限
根据要求,我们界定的authtest用户的各个权限应该是这样的:
- mds,无关,无需授权
- mon,有关,要执行某些块命令,至少要有读权限
- osd,有关,要创建、删除、修改块,必须涉及osd,需要有全部权限,但是,仅限于块存储的osd
- mgr,有关,某些命令需要去到mgr进行解析
OK,现在很清楚了,我们开始创建这个用户并进行授权
1 | [twj@test-cluster ~]$ sudo ceph auth add client.authtest mon 'allow r' mgr 'allow r' osd 'allow rwx pool=rbd' |
如果是rbd有两个相关的poo呢?没关系
1 | [twj@test-cluster ~]$ sudo ceph auth caps client.authtest mon 'allow r' mgr 'allow r' osd 'allow rwx pool=rbd.data,allow rwx pool=rbd' |
ok,测试一下
1 | [twj@test-cluster ~]$ sudo ceph auth get client.authtest -o ceph.client.authtest.keyring |
操作很顺利,如果我们将rbd创建到其他pool上呢?
1 | [twj@test-cluster ~]$ sudo rbd create mi.rgw.buckets.index/test2 --size 1T -k ./ceph.client.authtest.keyring -n client.authtest |
果然,鉴权不通过
遇到的问题
授权给普通用户后,使用该用户的key和name可以执行大部分命令,但是,目前发现有少数命令不行
1 | [twj@test-cluster ~]$ sudo ceph pg map 90.1d -k ./ceph.client.authtest.keyring -n client.authtest |
可以看到,ceph pg map
命令是没有问题的,但是ceph pg x.yy zz
这种命令就不行了,明明对pg所在的pool和osd拥有rwx
权限,为什么就不行呢?
尝试修改一下权限
1 | [twj@test-cluster ~]$ sudo ceph auth caps client.authtest mon 'allow r' mgr 'allow r' osd 'allow *' |
授权为对所有osd都有所有权限,则命令执行正常=.=
啊。。。查了一圈,还真没发现为啥,代码跟了半天没找到位置,如果有兴趣或者知道实情的老铁,希望可以告诉我….
经过研究,实际上普通用户只授权管理块存储的话,pg query
不使用其实也没有关系的。所以,安全起见我们决定不授权所有osd
猜测,猜测哈!
在query命令执行过程中,进行鉴权检查时,该用户尽管有pool的全部权限,但是,这些pool对应的osd可能会被多个pool共享,而该用户可能没有另外一些pool的权限,这就导致查询命令下去后,它还要检查请求pg所在的osd是否属于授权的pool,但ceph并没有这么做
举个例子说,就是rbd pool位于一部分osd上,而xxx.buckets.data这个pool也位于相同的osd上,authtest用户仅对rbd pool有权限,对xxx.bucket.data则没有权限,因此authtest用户对这些osd不一定真的有所有权限,query命令需要最终落到osd上去获取pg的详细信息,ceph没有在osd层面做进一步的检查,从日志和代码跟踪的结果来看,query命令被挡时,查询命令根本还没下到osd,就早早地被认为权限不足,因此,猜测这里query命令简单粗暴地要求对所有osd都要有权限,而不仅仅针对指定pool的osd,这也是比较粗糙的一种做法
希望有认真的读者朋友可以证实、纠正我的猜测
最后
通常我们使用集群,默认直接用的admin,畅通无阻,然而,随着业务的复杂度增长,不管是权限隔离、安全还是负载均衡,都出现了越来越都多、越来越复杂的需求
本篇进行对普通用户的授权,在实际应用中还是有价值的,尤其是多种业务共享集群,不同的角色操作集群时,进行必要的权限隔离可以将风险降到最低,希望对读者朋友有些帮助
- 本文作者: 奋斗的松鼠
- 本文链接: http://www.strugglesquirrel.com/2022/07/06/普通用户访问集群/
- 版权声明: 本博客所有文章除特别声明外,创作版权均为作者个人所有,未经允许禁止转载!