DNA遗传哲学? - 数据库里schema应该属于谁?

简介:

标签

PostgreSQL , schema , template


背景

混沌初开

安装好PostgreSQL软件后,需要调用initdb,或者pg_ctl初始化数据库实例,初始化数据库实例时,通过bki接口(脚本),建立数据库元数据。

初始化后,数据库有了数据文件、日志文件、控制文件、CLOG、WAL等一系列数据库的文件。

同时会创建模板库template0, template1, 以及数据库postgres。

模板库内,默认会有一个public schema,owner是谁?是初始化时数据库的超级用户。例如初始化数据库集群时,超级用户为postgres,那么模板库属于postgres,模板库里的schema(public)也属于postgres。

基因传递

接下来,用户可以使用PostgreSQL数据库从模板库创建更多数据块。

通过模板库创建的新的数据库,里面也会带有模板库所有的一切,包括schmea,这些对象属于谁呢?

owner是postgres还是新建数据库的用户(或者指定的数据库owner呢?)

目前,不管你用什么用户新建数据库,新数据库的权限,OWNER都会和模板库保持原样。

例如,template1的public属于postgres用户

template1=# \dn  
  List of schemas  
  Name  |  Owner     
--------+----------  
 public | postgres  
(1 row)  

使用另一个用户,创建一个数据库,并将新的数据库的owner设置为新用户。但是这个新数据库内的public schema owner依旧是postgres。

template1=# create role digoal superuser login;  
CREATE ROLE  
template1=# \c postgres  
You are now connected to database "postgres" as user "test".  
postgres=# create database db1 with template template1 owner digoal;  
CREATE DATABASE  
postgres=# \c db1  
You are now connected to database "db1" as user "test".  
db1=# \dn  
  List of schemas  
  Name  |  Owner     
--------+----------  
 public | postgres  
(1 row)  

为什么要基因?

假设不继承模板库的权限,而是将schema或者对象的权限或者OWNER直接转嫁给数据库的owner,会有什么风险呢?

风险如下:

一个有create database权限的普通用户,它可以利用这种方法,窥探其他数据库的它看不到的内容。

创建一个普通用户,带有create database权限  
db1=# create role r1 createdb login;  
CREATE ROLE  
  
连接到template1库,使用超级用户postgres创建一个测试表和测试数据  
template1=> \c template1 postgres  
You are now connected to database "template1" as user "postgres".  
template1=# create table test(id int);  
CREATE TABLE  
template1=# insert into test values (1);  
INSERT 0 1  
  
普通用户无法访问这张测试表  
template1=# \c template1 r1  
You are now connected to database "template1" as user "r1".  
template1=> select * from test;  
ERROR:  permission denied for relation test  
以template1为模板,新建一个数据库,OWNER为自己。  
template1=> \c postgres r1  
You are now connected to database "postgres" as user "r1".  
postgres=> create database db3 with template template1 owner r1;  
CREATE DATABASE  
  
由于权限继承,所以新建的数据库,OWENR依然没有权限查询这张表  
postgres=> \c db3 r1  
You are now connected to database "db3" as user "r1".  
db3=> \dn  
  List of schemas  
  Name  |  Owner     
--------+----------  
 public | postgres  
(1 row)  
db3=> select * from test;  
ERROR:  permission denied for relation test  

PostgreSQL 权限继承的方法充分考虑了这一点,避免了安全风险问题。

有什么更好的方法呢?

实际上用户的想法和PostgreSQL实施的安全防护不一致,例如用户创建了一个模板库,并希望其他人通过这个模板库创建的数据库,里面的对象OWNER也改成建库的OWNER。

create database db1 with template template1 owner newrole;  
  
用户也许希望db1里面包含的模板库中的schema public也转给newrole  

如何改变现状呢?

1. 既然owner改变不了,那么可以使用权限来控制,模板建好后,把模板中的对象权限赋予给public角色。

\c template1 postgres  

grant all on schema public to public;  

2. 还有更人性化的方法,例如新增SQL语法:

给schema,table,view等对象增加一个权限选项(允许用户选择),作为模板创建时,OWNER是否跟随数据库的owner。

3. 当以template0为模板创建数据库时,建议public的owner可以改为数据库的owner,同样需要社区代码层面的支持。

4. 当用户新建了数据库后,再使用超级用户,将新库的public schema赋予给新库的owner.

\c new_db superuser

alter schema public owner to db_user;

注意,schema owner有这个schema的绝对管理权限,包括删除其他人在这个schema创建的对象。

所以千万不要把自己的对象创建到别人的schema下面,那很危险。

《PostgreSQL 逻辑结构 和 权限体系 介绍》

参考

https://www.postgresql.org/docs/9.6/static/sql-createdatabase.html

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
NoSQL 算法 测试技术
图数据库基准测试 LDBC SNB 系列讲解:Schema 和数据生成的机制
作为大多数图数据库性能测试标配的 LDBC SNB 它是如何保障不同系统环境之间的测评比较公平且基准测试结果可重复的呢?本文从数据和 Schema 生成入手同你讲解它的原理。
572 2
图数据库基准测试 LDBC SNB 系列讲解:Schema 和数据生成的机制
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之可以通过配置Oracle数据库的schema注册表来监测表结构的变化吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
152 1
|
存储 SQL 数据库
数据库模式(Schema)
数据库模式(逻辑模式)是数据库全体数据的逻辑结构和特征描述,是公共数据视图,一个数据库只有一个。外模式(用户模式)是用户可见的局部数据逻辑结构,可有多个,提供数据安全性。内模式(存储模式)描述数据的物理结构和存储方式,一个数据库仅有一个,用于优化存储和减少冗余。
|
SQL Java 数据库连接
Java【付诸实践 01】使用org.apache.ibatis.plugin.Interceptor拦截器实现全局mapper.xml参数注入(可用于切换数据库实例schema)源码实例分享
Java【付诸实践 01】使用org.apache.ibatis.plugin.Interceptor拦截器实现全局mapper.xml参数注入(可用于切换数据库实例schema)源码实例分享
509 0
|
SQL 算法 Linux
【数据库】Star Schema Benchmark 标准测试集优化(三)
【数据库】Star Schema Benchmark 标准测试集优化(三)
216 1
【数据库】Star Schema Benchmark 标准测试集优化(三)
|
存储 关系型数据库 MySQL
MySQL 数据库 Schema 设计的性能优化①:高效的模型设计
前言 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区。真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只是在解决前妻设计所遗留下来的一些问题而已,而且能够解决的问题通常也比较有限。 博主将就如何在 MySQL 数据库 Schema 设计的时候保证尽可能的高效,尽可能减少后期的烦恼会分3篇文章来进行详细介绍!
|
SQL 存储 弹性计算
云原生向量数据库Milvus(二)-数据与索引的处理流程、索引类型及Schema(上)
本文将介绍 Milvus 系统中数据写入、索引构建、数据查询的具体处理流程,同时,还会介绍Milvus支持的索引类型;另外,还将讲述如何定义字段和集合Schema。
|
关系型数据库 分布式数据库 数据库
PolarDB 数据库:使用polardb进行创建数据库、创建用户、授权、创建表空间、创建schema表的常用操作使用演示
PolarDB 数据库:使用polardb进行创建数据库、创建用户、授权、创建表空间、创建schema表的常用操作使用演示
1036 0
PolarDB 数据库:使用polardb进行创建数据库、创建用户、授权、创建表空间、创建schema表的常用操作使用演示
|
存储 缓存 安全
MySQL数据库的schema设计优化
本文介绍了数据库schema常见的一些缺陷,以及一些优化方法。
407 1
|
SQL Oracle 架构师
【数据库】Star Schema Benchmark 标准测试集优化(二)
【数据库】Star Schema Benchmark 标准测试集优化(二)
334 0