你应该知道的数仓安全——对象访问控制
安全认证可以保证建立安全的数据库连接,而建立连接后的安全访问保护则是基于角色的对象访问控制。用户和权限的基础概念在博文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自己拥有的。
| 序号 | code | 操作权限 | 适用对象类型 | 
|---|---|---|---|
| 1 | a | INSERT | table, view, table column | 
| 2 | r | SELECT | table, view, table column, sequence, large object | 
| 3 | w | UPDATE | table, view, table column, sequence, large object | 
| 4 | d | DELETE | table, view | 
| 5 | D | TRUNCATE | table, view | 
| 6 | x | REFERNECES | table, view, table column | 
| 7 | t | TRIGGER | table, view | 
| 8 | X | EXECUTE | function, procedure | 
| 9 | U | USAGE | sequence, foreign-data wrapper, foreign server, language, schema, node group, type, domain, data source | 
| 10 | C | CREATE | database, schema, node group, tablespace | 
| 11 | T | CREATE TEMP | database | 
| 12 | c | CONNECT | database | 
| 13 | p | COMPUTE | node group | 
| 14 | R | READ | directory | 
| 15 | W | WRITE | directory | 
| 16 | A | ANALYZE | table, view | 
对象权限管理
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级数仓黑科技,后台还可获取众多学习资料哦~
 
- 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)