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

举报
OreoreO 发表于 2021/10/15 10:46:28 2021/10/15
【摘要】 安全认证可以保证建立安全的数据库连接,而建立连接后的安全访问保护则是基于角色的对象访问控制。对象访问控制保证了仅当用户对此对象拥有进行合法操作的权限时,该用户才能对此对象执行相应操作。

安全认证可以保证建立安全的数据库连接,而建立连接后的安全访问保护则是基于角色的对象访问控制。用户和权限的基础概念在博文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级数仓黑科技,后台还可获取众多学习资料哦~

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。