摘要:我是管理员账号,怎么还没有权限?当小伙伴询问的时候,我第一时间就会想到都是用户同名Schema惹的祸

本文分享自华为云社区《你应该知道的数仓安全——都是同名Schema惹的祸》,作者: zhangkunhn 。

典型场景

经常遇到小伙伴问到:

  • 我是管理员账号,怎么还没有权限?
  • 管理员给我赋权了啊,怎么还没有权限?

当小伙伴询问的时候,我第一时间就会想到都是用户同名Schema惹的祸。

同名Schema是私有Schema

我们知道,CREATE USER语法在创建用户的同时会在当前数据库中创建一个与用户同名的SCHEMA。这个Schema很特殊,只有两种用户能在这个Schema下面创建表、视图、函数等对象:

  1. 用户自己
  2. 管理员

然而,不管谁创建的,对象的所有者(Owner)都是用户自己。基于这个事实,我们可以称用户同名Schema为私有Schema。私有表明了当前Schema的特殊性,在这个Schema下面的所有对象都是这个用户自己的,不管是谁创建的。

我们来看一个例子。数据库中有三个用户,如表所示。

使用管理员dbadmin执行以下SQL:

  1. gaussdb=# create table ua.ta (c1 int);
  2. CREATE TABLE
  3. gaussdb =# select relname, relowner, rolname from pg_class c, pg_authid a where relname = 'ta' and c.relowner= a.oid;
  4. relname | relowner | rolname
  5. ---------+----------+---------
  6. t1 | 16546 | ua(不是dbadmin)
  7. (1 row)

可以看到:系统管理员在普通用户同名schema下创建的对象,所有者为schema的同名用户

让我们来总结第一点:同名Schema是私有Schema,这个Schema下面的所有对象的所有者都是用户自己,不管是谁创建的。管理员在私有Schema下创建的表等对象会发生Owner切换。

视图规则:按照view的owner做权限检查

再来谈视图和视图封装的基表的权限。视图对基表的权限检查是按照视图的Owner做权限检查。例如

  1. create view v1 as select * from t1;

用户执行select * from v1时做权限检查分为两步:

  1. 首先检查当前用户对视图v1的SELECT权限;
  2. 然后检查视图v1的owner对基表t1的SELECT权限。

而不是直接检查当前用户对基表t1的SELECT权限。

总结第二点:视图会按照视图的Owner对基表做权限检查。

私有Schema与视图规则导致莫名其妙的权限报错

由于私有Schema会造成Owner切换,而视图规则要求对基表按照视图Owner做权限检查。那么在私有Schema下面创建视图就会导致莫名其妙的现象:

私有Schema + view规则 --> 管理员无权限访问自己创建的视图。

  1. gaussdb =# set role dbadmin password ‘*******’; -- 切换到管理员用户
  2. SET
  3. gaussdb => create table ua.ta (c1 int); -- taowner是???
  4. CREATE TABLE
  5. gaussdb => create view ub.vb as select * from ua.ta; -- 视图vbowner是???
  6. CREATE VIEW
  7. gaussdb => select * from ub.vb; -- 管理员创建的view,他竟然无权限!!!
  8. ERROR: SELECT permission denied to user ub for relation ua.ta

我们以管理员用户在用户ua的私有schema下创建表ta, 之后在用户ub的schema下创建了视图vb, 视图vb的基表是ua.ta。管理员执行对视图vb的查询,报错无权限。

对于这个莫名其妙的现象,我们仔细捋一捋其中的来龙去脉。

  1. 根据私有Schema切换Owner的法则,尽管是管理员创建的,ta的owner切换到ua, 同样vb的owner应该是u2.
  2. 结合view规则,对基表按照视图Owner做权限检查,视图vb的owner对基表ua.ta是否具有select权限。视图vb的owner是ub,而ub对ua.ta无select权限,因此查询报错。

权限报错消除

如何解决这种权限报错呢?从上述梳理中,其实已经明白了如何赋权来消除这种报错。那就是给视图的owner用户ub赋予基表ua.ta的SELCT权限:管理员或者用户ua执行下面的赋权语句即可。

  1. GRANT SELECT on ua.ta to ub;

有小伙伴 问了,我每次都这么仔细捋一捋,感觉很浪费时间,有没有简单的方法。答案是有的,只需从查询的权限报错着手,不需要每次都捋一捋。

我们当前的权限报错有着非常完备的提醒,会给用户显示如下提示:

SELECT permission denied to user “user_name” for relation “ schema_name.table_name

可以看到,权限报错包括哪个权限、哪个用户、哪个schema的哪个对象。那么看到这个之后,可以直接找管理员或者Owner来执行授予操作就可以了。

对于上述报错,直接就对应到赋权语句:

grant SELECT on schema_name.table_name to user_name;

当然这个赋权跟我们前面的分析是殊途同归的。

现在来回想下,是不是一切都清晰了。那么我们再来看一遍示例。以管理员dbadmin执行以下SQL语句。

  1. gaussdb => create table ua.ta (c1 int); -- taownerua
  2. CREATE TABLE
  3. gaussdb => create view ub.vb as select * from ua.ta; -- vbownerub
  4. CREATE VIEW
  5. postgres=# select * from ub.vb; -- 按照报错的指引来
  6. ERROR: SELECT permission denied to user ub for relation ua.ta
  7. gaussdb =# grant usage on schema ua to ub; -- schema ua和基表ta的权限给ub
  8. GRANT
  9. gaussdb =# grant select on ua.ta to ub;
  10. GRANT
  11. postgres=# select * from ub.vb; -- 权限检查通过,可以正常查询
  12. c1
  13. ----
  14. (0 rows)

补充知识:

  1. CREATE USER语法在创建用户的同时会在当前数据库中,为该用户创建一个同名的SCHEMA;其他数据库中,则不会创建同名的SCHEMA;如果需要,可使用create schema authorization user_name语法,该语法会根据用户名来创建同名schema。
  2. 为什么用户同名Schema这么特殊,别的Schema没有这些特点?因为:a) 在创建用户时同时创建了与用户同名的Schema,并将Schema的owner设置为同名用户;b) 在创建对象时,如果创建对象的schema是用户同名Schema,就会将对象的Owner切换为同名用户,而不是执行SQL语句的当前用户。

总结

遇到权限报错第一时间想到是否涉及同名schema。同名Schema是用户的私有Schema。私有Schema中所有的对象Owner都是用户自己,不管是谁创建的。在私有Schema中创建对象,对象Owner会切换到同名用户。视图规则是按照视图Owner来检查对基表的权限。由于私有Schema的Owner切换机制和视图规则导致了同名Schema的权限报错。根据报错的提示,授予用户相应的权限就可以解决权限报错问题。

点击关注,第一时间了解华为云新鲜技术~

你应该知道的数仓安全:都是同名Schema惹的祸的更多相关文章

  1. [cocos2d-x][apk打包][Fatal signal 11][andriod]Eclipse编译Fatal signal 11报错-都是字符赋值惹的祸

    流程重现: 使用coco2d-x制作了一个2048,在xcode模拟器执行以及在pad上真机调试都是没有问题的. 可是在使用eclipse调试打包android可以执行,可是进入游戏之后会在随机的地方 ...

  2. 数仓1.4 |业务数仓搭建| 拉链表| Presto

    电商业务及数据结构 SKU库存量,剩余多少SPU商品聚集的最小单位,,,这类商品的抽象,提取公共的内容 订单表:周期性状态变化(order_info) id 订单编号 total_amount 订单金 ...

  3. 数仓1.1 分层| ODS& DWD层

    数仓分层 ODS:Operation Data Store原始数据 DWD(数据清洗/DWI) data warehouse detail数据明细详情,去除空值,脏数据,超过极限范围的明细解析具体表 ...

  4. 在HUE中将文本格式的数据导入hive数仓中

    今天有一个需求需要将一份文档形式的hft与fdd的城市关系关系的数据导入到hive数仓中,之前没有在hue中进行这项操作(上家都是通过xshell登录堡垒机直接连服务器进行操作的),特此记录一下. - ...

  5. 使用Oozie中workflow的定时任务重跑hive数仓表的历史分期调度

    在数仓和BI系统的开发和使用过程中会经常出现需要重跑数仓中某些或一段时间内的分区数据,原因可能是:1.数据统计和计算逻辑/口径调整,2.发现之前的埋点数据收集出现错误或者埋点出现错误,3.业务数据库出 ...

  6. 【云+社区极客说】新一代大数据技术:构建PB级云端数仓实践

    本文来自腾讯云技术沙龙,本次沙龙主题为构建PB级云端数仓实践 在现代社会中,随着4G和光纤网络的普及.智能终端更清晰的摄像头和更灵敏的传感器.物联网设备入网等等而产生的数据,导致了PB级储存的需求加大 ...

  7. HAWQ取代传统数仓实践(十九)——OLAP

    一.OLAP简介 1. 概念 OLAP是英文是On-Line Analytical Processing的缩写,意为联机分析处理.此概念最早由关系数据库之父E.F.Codd于1993年提出.OLAP允 ...

  8. HAWQ取代传统数仓实践(十三)——事实表技术之周期快照

    一.周期快照简介 周期快照事实表中的每行汇总了发生在某一标准周期,如一天.一周或一月的多个度量.其粒度是周期性的时间段,而不是单个事务.周期快照事实表通常包含许多数据的总计,因为任何与事实表时间范围一 ...

  9. CarbonData:大数据融合数仓新一代引擎

    [摘要] CarbonData将存储和计算逻辑分离,通过索引技术让存储和计算物理上更接近,提升CPU和IO效率,实现超高性能的大数据分析.以CarbonData为融合数仓的大数据解决方案,为金融转型打 ...

随机推荐

  1. 构建数据湖上低延迟数据 Pipeline 的实践

    T 摘要 · 云原生与数据湖是当今大数据领域最热的 2 个话题,本文着重从为什么传统数仓 无法满足业务需求? 为何需要建设数据湖?数据湖整体技术架构.Apache Hudi 存储模式与视图.如何解决冷 ...

  2. PerfView专题 (第三篇):如何寻找 C# 中的 VirtualAlloc 内存泄漏

    一:背景 上一篇我们聊到了如何用 PerfView 去侦察 NTHeap 的内存泄漏,这种内存泄漏往往是用 C 的 malloc 或者 C++ 的 new 分配而不释放所造成的,这一篇我们来聊一下由 ...

  3. 使用二手 gopro 做行车记录仪

    背景 自打开了博客以后,一直在写技术说明文,今天打算写点程序以外的东西换换味口.前段时间在某鱼上以 300 元的价格入手了一套完整的 gopro3+ 运动摄像头,带一张 32G SD 卡,两块备用电池 ...

  4. Java SE 18 新增特性

    Java SE 18 新增特性 作者:Grey 原文地址:Java SE 18 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  5. 经典01背包问题(C++)--详解

    二维数组解决01背包问题 题目: 有 N 件物品和一个容量是 V 的背包.每件物品只能使用一次. 第 i 件物品的体积是 vi,价值是 wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容 ...

  6. 前端架构-分层而治,铁打的MV流水的C

    大家好,我是Eluxjs的作者,Eluxjs是一套基于"微模块"和"模型驱动"的跨平台.跨框架『同构方案』,欢迎了解... 文前声明,以下推断和结论纯属个人探索 ...

  7. OSI七层模型与TCP/IP协议

    作者:菘蓝 时间:2022/9/1 ================================================================================== ...

  8. python超多常用知识记录

    在函数传参给变量**a,可以接收字典类型,当未传参默认空字典 set创建集合可以排重 while和for到参数未满足可以增加else cmp函数比较长度 divmod函数返回除数和余数结果 nonlo ...

  9. eReplication详解

    eReplication简介 eReplication是一款基于华为存储复制.快照.双活.克隆以及FusionSphere主机复制等特性,保证上层应用数据一致性,针对华为典型容灾解决方案,提供可视化. ...

  10. vim编辑器使用详解

    Linux之vim编辑器使用 vim三种模式:命令模式,插入模式,退出模式 移动光标操作 左移动一个字符: 按 h 键 右移动一个字符:按 l 键 下移动一行:按 j 键 上移动一行:按 k 键 移动 ...