运维日记|SQL server 那点事 – 作者:database

XXX,你好,我想给一个用户某张表的只读权限,你有空看看吗?

于是,我就远程连上去,本来几分钟能搞定的事情,半个小时、一个小时过去了,笑容逐渐凝固……

几经周折,终于找到问题所在,原来是public作怪,哈哈

今天,我们就模拟客户的实际环境,来和大家聊聊public如何作祟,以及我们平时应该如何正确对待public,请看下文。

一、环境描述

客户想给某个数据库某张表的只读权限,然后就新建用户–>映射数据库–>数据库下用户的安全对象选中表–>给选择权限。

步骤貌似没问题啊,可这个用户就是能更改、能插入,很头疼……

二、模拟操作

2.1本地环境新建用户并授权

–1、创建用户dsz_test(映射数据库为dsz)

625b-iypetiv5809946.png

–2、授予tb_Ts表的只读权限

36ff-iypetiv5811370.png

–3、测试(用dsz_test登录)

512c-iypetiv5813018.png

–4、图形化界面显示

a546-iypetiv5813863.png

可以看到,我本地的 dsz_test  登录只可以看到tb_Ts 表,拒绝了其他读写等权限

2.2模拟客户环境新建并授权

–1、创建用户并授权

7288-iypetiv5815149.png

–2、测试(用dsz_test1登录)

8465-iypetiv5818085.png

–3、图形化界面显示

be5f-iypetiv5819323.png

妈耶,dsz_test1登录后可以看到另外一张表,而且竟然可以update,玩我呢!!!

三、分析原因

3.1查看本地用户权限

6466-iypetiv5821198.png

6466-iypetiv5821198.png

3.2查看客户环境权限

e2f0-iypetiv5824457.png4129-iypetiv5827574.png

貌似一毛一样,真的见鬼了吗?

我们再仔细分析,对于新建的用户,我们不是别的角色成员,也不是别的角色领袖……等等,角色?对啊,不是还有个public的东东存在吗???

3.3查看本地Public权限

6ca6-iypetiv5829205.png69cf-iypetiv5832441.png

3.4查看客户Public权限

e8ca-iypetiv5831166.png95f5-iypetiv5833654.png

嗷,是不是感觉到什么了,之所以dsz_test1能对dsz_1表肆意妄为,是因为public的锅啊。

四、Public

每个数据库的所有用户都是public角色,用户同样不能退出public角色成员。

默认拥有VIEW ANY DATABASE和CONNECT权限

可以通过REVOKE VIEW ANY DATABASE FROM PUBLIC回收public权限

五、总结

本次权限问题就是因为客户授予public指定表的更新选择权限,又因为所有用户都是public的角色,所以,只能回收掉public对该表的更新选择权限:

b82d-iypetiv5836454.png

然后再用dsz_test1登录测试,结果令人满意。如下:

6f23-iypetiv5837399.png

建议:SQL server的public权限很特殊,每个用户都会继承它所拥有的权限,所以不建议对其授予相应的权限,必要情况下,建议VIEW ANY DATABASE也回收。

美创科技拥有强大的运维中心数据库服务团队,其中 Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师,并著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。

来源:freebuf.com 2020-09-03 17:13:21 by: database

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论