你应该知道的数仓安全——对象访问控制

网友投稿 530 2022-05-29

安全认证可以保证建立安全的数据库连接,而建立连接后的安全访问保护则是基于角色的对象访问控制。用户和权限的基础概念在博文GaussDB(DWS) SQL进阶-database、schema、user和权限控制中有介绍,本文主要介绍一下具体的对象访问控制。

访问控制列表

访问控制列表(Access Control List, ACL)是对象权限管理和权限检查的基础,每个数据库对象都具有ACL,ACL是存储控制项(Access Control Entry, ACE)的集合,ACE中记录着受权者grantee、grantee该用户在对象上的操作权限和grantor授权者三部分。 grant 语句语法详见grant语法说明。

postgres=# CREATE USER a WITH CREATEDB PASSWORD "QAZ2wsx@123!"; CREATE USER postgres=# CREATE USER b WITH CREATEDB PASSWORD "QAZ2wsx@123!"; CREATE USER postgres=# CREATE USER c WITH CREATEDB PASSWORD "QAZ2wsx@123!"; CREATE USER postgres=# CREATE SCHEMA privs; CREATE SCHEMA postgres=# GRANT CREATE,USAGE ON SCHEMA privs TO a,b,c; GRANT postgres=# SET ROLE a PASSWORD "QAZ2wsx@123!"; SET postgres=> CREATE TABLE privs.t1(a INT, b INT) DISTRIBUTE BY HASH (a); CREATE TABLE postgres=> GRANT SELECT ON TABLE privs.t1 TO b WITH GRANT OPTION; GRANT postgres=> \dp+ privs.t1 Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+------+-------+-------------------+-------------------------- privs | t1 | table | a=arwdDxtA/a +| | | | b=r*/a | (1 row) postgres=> SET ROLE b PASSWORD "QAZ2wsx@123!"; SET postgres=> GRANT SELECT ON privs.t1 TO c; GRANT postgres=> \dp+ privs.t1 Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+------+-------+-------------------+-------------------------- privs | t1 | table | a=arwdDxtA/a +| | | | b=r*/a +| | | | c=r/b | (1 row)

上面的运行结果可以看到privs.t1这张表的ACL有3条ACE。第一条a=arwdDxtA/a说明grantee为a,拥有权限为arwdDxtA,grantor为a;第二条b=r*/a表示granteeb拥有由grantora赋予的select权限与再授予权限,其中r代表select权限,*代表再授予权限;第三条c=r/b说明grantorc仅拥有由granteeb赋予的select权限。

你应该知道的数仓安全——对象访问控制

特殊的一点是第一条记录中表owner没有记录GRANT OPTION权限,这是因为owner的GRANT OPTION权限认为是来自于系统的,而不是owner自己拥有的。

对象权限管理

GRANT 命令将数据库对象的特定权限授予一个或多个角色时,如果声明了 WITH GRANT OPTION ,则被授权的用户可以将此权限赋予他人,否则就不能授权给他人。

REVOKE 命令用于撤销一个或多个角色的权限,若指定了 GRANT OPTION FOR ,则仅撤销角色对该权限的再授予能力,而不撤销权限本身。否则,权限(包括再授予权限)将被撤销。

如果用户拥有某个权限,并同时拥有再授予权限,并将该权限授予了其他用户,那么其他用户拥有的权限都被成为依赖性权限。如果被依赖用户所持有的权限或者再授予权限被撤销,在声明 CASCADE 关键字情况下依赖性权限也会被撤销,否则撤销动作提示失败。revoke 语句语法详见revoke语法说明。

在执行授权操作时,可能出现循环授权的情况,如下图所示,A为某个表的owner,B同时拥有此表的 SELECT 权限和 WITH GRANT OPTION 选项,且B将此权限赋予了用户C,然后C又将权限赋予了用户D,最后C企图将同样的权限赋予B。这一系列的授权操作构成了一个环,这个环是不允许出现的。

postgres=# CREATE USER d WITH CREATEDB PASSWORD "QAZ2wsx@123!"; CREATE USER postgres=# GRANT CREATE,USAGE ON SCHEMA privs TO d; GRANT postgres=# SET ROLE b PASSWORD "QAZ2wsx@123!"; SET postgres=> GRANT SELECT ON privs.t1 TO c WITH GRANT OPTION; GRANT postgres=> SET ROLE c PASSWORD "QAZ2wsx@123!"; SET postgres=> GRANT SELECT ON privs.t1 TO d WITH GRANT OPTION; GRANT postgres=> \dp+ privs.t1 Access privileges Schema | Name | Type | Access privileges | Column access privileges --------+------+-------+-------------------+-------------------------- privs | t1 | table | a=arwdDxtA/a +| | | | b=r*/a +| | | | c=r*/b +| | | | d=r*/c | (1 row) postgres=> SET ROLE d PASSWORD "QAZ2wsx@123!"; SET postgres=> GRANT SELECT ON privs.t1 TO b WITH GRANT OPTION; ERROR: grant options cannot be granted back to your own grantor

总结

用户是权限的最终体现者,所有的权限管理最终都体现在用户对数据库对象的操作权限是否被允许。合理的进行权限授予,可以保护数据的安全性,防止非法用户读写数据。

参考文档:

1.GaussDB(DWS) SQL进阶-database、schema、user和权限控制

2.你应该知道的数仓安全——默认权限实现共享schema

3.你应该知道的数仓安全——安全认证

想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~

EI企业智能 Gauss AP 数据仓库服务 GaussDB(DWS) 数据库

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Windows 10 SDK Preview Build 19041 现在可用
下一篇:如何迅速将纸质资料变成电子文档?
相关文章