你应该知道的数仓安全——默认权限实现共享schema
摘要: 一种典型客户场景是一些用户是数据的生产方,需要在schema中创建表并写入数据;而另一些用户是数据的消费方,读取schema中的数据做分析。使用Alter default privilege语法可以实现这种共享schema的权限管理问题。通过简单示例演示了Alter default privilege语法处理这种典型场景的细节和有效性。
前言
最近遇到一个客户场景,涉及共享schema的权限问题。场景简单可以描述为:一些用户是数据的生产方,需要在schema中创建表并写入数据;另一些用户是数据的消费方,读取schema中的数据做分析。对于该schema权限管理的一种实现方法是数据生产方在每次创建新表后告知管理员用户使用grant select on all tables in schema语法来授予消费方权限。这种方法有一定的局限性。如果生产方在schema下面又创建了一些新表,为了授权消费方使用这些新表还需要告知管理员用户再次使用grant select on all tables in schema来授权。有没有简单的应对方案?答案是肯定的,可以使用Alter default privilege。Alter default privilege用于将来创建的对象的权限的授予或回收。

语法介绍
ALTER DEFAULT PRIVILEGES
[ FOR { ROLE | USER } target_role [, ...] ]
[ IN SCHEMA schema_name [, ...] ]
abbreviated_grant_or_revoke;
其中abbreviated_grant_or_revoke子句用于指定对哪些对象进行授权或回收权限。对表授权语法是:
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES }
[, ...] | ALL [ PRIVILEGES ] }
ON TABLES
TO { [ GROUP ] role_name | PUBLIC } [, ...]
参数说明
- target_role
已有角色的名称。如果省略FOR ROLE/USER,则缺省值为当前角色/用户。
取值范围:已有角色的名称。 - schema_name
现有模式的名称。
target_role必须有schema_name的CREATE权限。
取值范围:现有模式的名称。 - role_name
被授予或者取消权限角色的名称。
取值范围:已存在的角色名称。
详见https://support.huaweicloud.com/devg-dws/dws_04_0241.html
场景示例
testdb=# create user creator1 password 'Gauss_234';
CREATE USER
testdb=# create user creator2 password 'Gauss_234';
CREATE ROLE
testdb=# create user user1 password 'Gauss_234';
CREATE USER
--创建共享schema,授予creator1和creator2创建权限,授予user1使用权限
testdb=# create schema shared_schema;
CREATE SCHEMA
testdb=> grant create, usage on schema shared_schema to creator1;
GRANT
testdb=> grant create, usage on schema shared_schema to creator2;
GRANT
testdb=# grant usage on schema shared_schema to user1;
GRANT
--将creator1和creator2在shared_schema中创建表的select权限授予user1
testdb=# alter default privileges for user creator1, creator2 in schema shared_schema grant select on tables to user1;
ALTER DEFAULT PRIVILEGES
--切到creator1,建表
testdb=# \c testdb creator1
You are now connected to database "testdb" as user "creator1".
testdb=> create table shared_schema.t1 (c1 int);
CREATE TABLE
--切到creator2,建表
testdb=> \c testdb creator2
You are now connected to database "testdb" as user "creator2".
testdb=> create table shared_schema.t2 (c1 int);
CREATE TABLE
--切到user1,查询OK
testdb=> \c testdb user1
You are now connected to database "testdb" as user "user1".
testdb=> select * from shared_schema.t1 union select * from shared_schema.t2;
c1
----
(0 rows)
查看默认权限的授予现状
查询系统表pg_default_acl可以查看当前哪些schema被授予了默认权限。从defaclacl字段可以看到creator1和creator2分别授予了user1对shared_schema中对象的select权限(r表示read)。
testdb=# select r.rolname, n.nspname, a.defaclobjtype, a.defaclacl from
testdb-# pg_default_acl a, pg_roles r, pg_namespace n
testdb-# where a.defaclrole=r.oid and a.defaclnamespace=n.oid;
rolname | nspname | defaclobjtype | defaclacl
----------+---------------+---------------+--------------------
creator1 | shared_schema | r | {user1=r/creator1}
creator2 | shared_schema | r | {user1=r/creator2}
(2 rows)
一些细节
所有在共享schema中创建对象的用户都应该出现在alter default privileges for user之后的列表中。否则,如果有用户creator3没有在列表中,其在共享schema中创建的对象或者说那些Owner是creator3的对象将不能被user1查询。因为共享schema中creator3用户创建的表没有授予user1默认权限。
testdb=# create user creator3 password 'Gauss_234';
CREATE USER
testdb=# grant create, usage on schema shared_schema to creator3;
GRANT
testdb=# \c testdb creator3
You are now connected to database "testdb" as user "creator3".
testdb=> create table shared_schema.t3 (c1 int);
CREATE TABLE
testdb=> \c testdb user1
You are now connected to database "testdb" as user "user1".
testdb=> select * from shared_schema.t3;
ERROR: permission denied for relation t3
管理员可以通过alter default privileges for user将creator3放入列表中为user1授予访问creator3用户创建表的默认权限,也可以由creator3用户自己通过alter default privileges授权给user1. 前面语法参数说明中有如果省略FOR ROLE/USER,则缺省值为当前用户。
testdb=> \c testdb creator3
You are now connected to database "testdb" as user "creator3".
testdb=> alter default privileges in schema shared_schema grant select on tables to user1;
ALTER DEFAULT PRIVILEGES
testdb=> \c testdb user1
You are now connected to database "testdb" as user "user1".
testdb=> select * from shared_schema.t3;
ERROR: permission denied for relation t3
testdb=> \c testdb creator3
testdb=> create table shared_schema.t4 (c1 int);
CREATE TABLE
testdb=> \c testdb user1
You are now connected to database "testdb" as user "user1".
testdb=> select * from shared_schema.t4;
c1
----
(0 rows)
上述代码第3行为当前用户在shared_schema下面创建的表的select权限授予user1。第7行user1查询shared_schema.t3报权限不足,是因为alter default privileges只处理将来的对象。shared_schema.t3在是之前创建的。我们新建表shared_schema.t4,user1用户查询正常。
如果要处理已有表的权限,使用grant语句。参见https://support.huaweicloud.com/devg-dws/dws_04_0334.html。
testdb=> \c testdb creator3
You are now connected to database "testdb" as user "creator3".
testdb=> grant select on all tables in schema shared_schema to user1;
ERROR: permission denied for relation t1
testdb=> grant select on table shared_schema.t3 to user1;
GRANT
testdb=> \c testdb user1
You are now connected to database "testdb" as user "user1".
testdb=> select * from shared_schema.t3;
c1
----
(0 rows)
代码第3行中shared_schema中包含有3个用户创建的表,而creator3只是表t3的创建者(Owner)。所以授予整个schema的权限会报错,只授予creator3是Owner的表t3之后,user1用户查询正常。
总结
alter default privileges只处理将来的对象,grant只处理已有的对象。进一步的,这两种语法授予权限时涉及的对象仅包括Owner是当前用户的对象。如果要为共享schema下面所有Owner的对象授予权限,需要使用管理员用户使用alter default privileges for user语法和grant语法。
本文分享自华为云社区《你应该知道的数仓安全——默认权限实现共享schema》,作者:zhangkunhn
你应该知道的数仓安全——默认权限实现共享schema的更多相关文章
- 你应该知道的数仓安全:都是同名Schema惹的祸
摘要:我是管理员账号,怎么还没有权限?当小伙伴询问的时候,我第一时间就会想到都是用户同名Schema惹的祸 本文分享自华为云社区<你应该知道的数仓安全--都是同名Schema惹的祸>,作者 ...
- 数仓1.1 分层| ODS& DWD层
数仓分层 ODS:Operation Data Store原始数据 DWD(数据清洗/DWI) data warehouse detail数据明细详情,去除空值,脏数据,超过极限范围的明细解析具体表 ...
- 基于Hive进行数仓建设的资源元数据信息统计:Hive篇
在数据仓库建设中,元数据管理是非常重要的环节之一.根据Kimball的数据仓库理论,可以将元数据分为这三类: 技术元数据,如表的存储结构结构.文件的路径 业务元数据,如血缘关系.业务的归属 过程元数据 ...
- 基于Hive进行数仓建设的资源元数据信息统计:Spark篇
在数据仓库建设中,元数据管理是非常重要的环节之一.根据Kimball的数据仓库理论,可以将元数据分为这三类: 技术元数据,如表的存储结构结构.文件的路径 业务元数据,如血缘关系.业务的归属 过程元数据 ...
- Greenplum数仓监控解决方案(开源版本)
Greenplum监控解决方案 基于Prometheus+Grafana+greenplum_exporter+node_exporter实现 关联图 一.基本概念 1.Prometheus Pr ...
- 数仓建模—ID Mapping
早晨起床的时候,发现自己尿分叉,我没有多想,简单洗洗就匆忙出门.路过早餐店,我看到师傅熟练的拉扯一小块面团,拉至细长条,然后放入油锅中,不一会功夫,一根屎黄色的油条便出锅了,卖相不错.我在想,小到炸屎 ...
- 数仓建模—建模工具PdMan(CHINER)介绍
数据仓库系列文章(持续更新) 数仓架构发展史 数仓建模方法论 数仓建模分层理论 数仓建模-宽表的设计 数仓建模-指标体系 数据仓库之拉链表 数仓-数据集成 数仓-数据集市 数仓-商业智能系统 数仓-埋 ...
- 技术专家说 | 如何基于 Spark 和 Z-Order 实现企业级离线数仓降本提效?
[点击了解更多大数据知识] 市场的变幻,政策的完善,技术的革新--种种因素让我们面对太多的挑战,这仍需我们不断探索.克服. 今年,网易数帆将持续推出新栏目「金融专家说」「技术专家说」「产品专家说」等, ...
- 【实时数仓】Day01-数据采集层:数仓分层、实时需求、架构分析、日志数据采集(采集到指定topic和落盘)、业务数据采集(MySQL-kafka)、Nginx反向代理、Maxwell、Canel
一.数仓分层介绍 1.实时计算与实时数仓 实时计算实时性高,但无中间结果,导致复用性差 实时数仓基于数据仓库,对数据处理规划.分层,目的是提高数据的复用性 2.电商数仓的分层 ODS:原始日志数据和业 ...
- 【CDH数仓】Day02:业务数仓搭建、Kerberos安全认证+Sentry权限管理、集群性能测试及资源管理、邮件报警、数据备份、节点添加删除、CDH的卸载
五.业务数仓搭建 1.业务数据生成 建库建表gmall 需求:生成日期2019年2月10日数据.订单1000个.用户200个.商品sku300个.删除原始数据. CALL init_data('201 ...
随机推荐
- Linux 在多个文件中搜索关键字
摘要:使用grep或者rg在当前目录下所有文件中查找关键字. 在Linux操作系统下,搜索文件中的关键字可帮助用户快速找到所需的信息,满足快速排查问题的需求.在大型系统中,文件可能被保存在多个目录 ...
- Android下音视频对讲演示程序(声学回音消除、噪音抑制、语音活动检测、自动增益控制、自适应抖动缓冲)(2023年07月13日更新)
Android下音视频对讲演示程序 必读说明 简介 本软件根据<道德经>为核心思想而设计,实现了两个设备之间进行音视频对讲,一般可用于楼宇对讲.智能门铃对讲.企业员工对讲.智能对讲机. ...
- K8S - Jenkins在K8S下的持续集成
准备nfs网络存储 提前安装好nfs服务 [root@master ~]# yum -y install nfs-utils rpcbind [root@master ~]# systemctl st ...
- 【Java集合】了解集合的框架体系结构及常用实现类,从入门到精通!
前言 通过Java基础的学习,我们掌握了主要的Java语言基本的语法,同时了解学习了Java语言的核心-面向对象编程思想. 从集合框架开始,也就是进入了java这些基础知识及面向对象思想进入实际应用编 ...
- DFS洛谷4961(求联通块)
说实话这个题审题把我卡了半天,还是我太菜 直接上代码吧 偷个懒用万能库. #include"bits/stdc++.h" using namespace std; int mp[1 ...
- 线程的查看方式&运行原理
观察多个线程同时运行 主要是理解 交替执行 谁先谁后,不由我们控制 查看进程线程的方法 windows 任务管理器可以查看进程和线程数,也可以用来杀死进程 tasklist 查看进程 taskkill ...
- .NET 8 IEndpointRouteBuilder详解
Map 经过对 WebApplication 的初步剖析,我们已经大致对Web应用的骨架有了一定了解,现在我们来看一下Hello World案例中仅剩的一条代码: app.MapGet(" ...
- Element类型&Text类型&Comment类型
Element节点类型 nodetype=1 nodename=大写元素标签名 父节点可以说document 或element 其子节点可以是Element .Text .comment 访问元素 ...
- LabVIEW基于机器视觉的实验室设备管理系统(3)
目录 行动计划 创建用户信息数据库 后面板连线 初始化 确认修改 确认id 判断旧密码是否正确 判断两次输入的新密码是否相同 修改用户数据库中的密码 结尾 效果演示 上一期我们完成了欢迎登录和信息查询 ...
- 阿里云轻量服务器上编译安装docker trojan时报错 fatal error: Killed signal terminated program cc1plus compilation
轻量服务器编译安装docker trojan时报错 72%时 通过以下操作解决,和编译其他软件类似,是内存不足引起的 编译安装swoole的时候报错 fatal error: Killed sig ...