PostgreSQL schema,database owner 的高危注意事项

云用户反映的一个问题,引发一系列安全思考。
以下是创建PostgreSQL schema的语法说明页的一个note:
http://www.postgresql.org/docs/9.5/static/sql-createschema.html

According to the SQL standard, the owner of a schema always owns all objects within it.
PostgreSQL allows schemas to contain objects owned by users other than the schema owner.
This can happen only if the schema owner grants the CREATE privilege on his schema to someone else, or a superuser chooses to create objects in it.

schema的owner默认是该schema下的所有对象的owner。
同时PostgreSQL还允许用户在别人的schema下创建对象,所以一个对象可能属于"两个"owner。
更"糟糕"的是schema 的owner有 drop该schema下面的所有对象的权限。

所以千万不要把自己的对象创建到别人的schema下面,那很危险。
看个例子,
r1创建了一个schema r1, 并把这个schema的写权限给了r2。
然后r2和超级用户postgres分别在r1这个schema下面创建了一个表。
然后r1可以把r2和postgres在r1 schema下创建的表删掉,然后就没有然后了。

postgres=# create role r1 login;
CREATE ROLE
postgres=# create role r2 login;
CREATE ROLE

postgres=# grant all on database postgres to r1;
GRANT
postgres=# grant all on database postgres to r2;
GRANT

postgres=# \c postgres r1;
postgres=> create schema r1;
CREATE SCHEMA
postgres=> grant all on schema r1 to r2;
GRANT

postgres=> \c postgres r2;
postgres=> create table r1.t(id int);
CREATE TABLE

postgres=> \c postgres postgres
postgres=# create table r1.t1(id int);
CREATE TABLE

postgres=# \c postgres r1
postgres=> drop table r1.t;
DROP TABLE
postgres=> drop table r1.t1;
DROP TABLE

或者直接drop schema cascade来删除整个schema.

对于database的owner也存在这个问题,它同样具有删除database中任何其他用户创建的对象的权力。
例子:

普通用户r1创建的数据库
postgres=> \c postgres r1
You are now connected to database "postgres" as user "r1".
postgres=> create database db1;
CREATE DATABASE
postgres=> grant all on database db1 to r2;
GRANT

其他用户在这个数据库中创建对象
postgres=> \c db1 r2
You are now connected to database "db1" as user "r2".
db1=> create schema r2;
CREATE SCHEMA
db1=> create table r2.t(id int);
CREATE TABLE
db1=> insert into t select generate_series(1,100);
INSERT 0 100

db1=> \c db1 postgres
You are now connected to database "db1" as user "postgres".
db1=# create table t(id int);
CREATE TABLE
db1=# insert into t select generate_series(1,100);
INSERT 0 100

数据库的OWNER不能直接删数据库中的对象
postgres=> \c db1 r1
You are now connected to database "db1" as user "r1".
db1=> drop table r2.t ;
ERROR:  permission denied for schema r2
db1=> drop table public.t ;
ERROR:  must be owner of relation t
db1=> drop schema r2;
ERROR:  must be owner of schema r2
db1=> drop schema public;
ERROR:  must be owner of schema public
db1=> \c postgres r1
You are now connected to database "postgres" as user "r1".
postgres=> drop database r1;
ERROR:  database "r1" does not exist

但是可以直接删库
postgres=> drop database db1;
DROP DATABASE

建议社区可以改进一下这个权限管理的风格。
例如drop schema时,如果发现schema里面有不属于当前schema owner的对象,则发出警告,并且不删除,另外加一个语法, 支持force, 发出notice并删除之。
对于drop database也是这样。

安全建议

介于此,我建议用户使用超级用户创建schema和database,然后再把schema和database的读写权限给普通用户,这样就不怕被误删了。因为超级用户本来就有所有权限。

还有一种方法是创建事件触发器,当执行drop 命令时,只有owner和超级用户能删对应的对象。

时间: 2024-08-25 07:09:25

PostgreSQL schema,database owner 的高危注意事项的相关文章

PostgreSQL per database or per user audit use pg_log_userqueries

PostgreSQL 本身并不带针对某数据库或某用户的SQL审计功能.通过pg_log_userqueries可以达到这样的目的. 首先到pgxn下载pg_log_userqueries模块 :  我测试的是0.4.0版本. 1. 安装 # unzip pg_log_userqueries-0.4.0.zip # mv pg_log_userqueries-0.4.0 /opt/soft_bak/postgresql-9.1.2/contrib/ # . /home/postgres/.bash

PostgreSQL offset 原理,及使用注意事项

使用PostgreSQL查询记录时,可以使用offset跳过一些记录,从跳跃点开始取后面的数据.但是这里有一个问题是这样的: postgres=# create or replace function f() returns void as $$ declare begin raise notice 'called'; end; $$ language plpgsql strict volatile; CREATE FUNCTION 虽然我在这里跳跃了3条记录,但是f()还是在offset的过程

PostgreSQL · 特性分析 · 逻辑结构和权限体系

本文旨在帮助用户理解PostgreSQL的逻辑结构和权限体系,帮助用户快速的理解和管理数据库的权限. 逻辑结构 最上层是实例,实例中允许创建多个数据库,每个数据库中可以创建多个schema,每个schema下面可以创建多个对象. 对象包括表.物化视图.操作符.索引.视图.序列.函数.- 等等. 在数据库中所有的权限都和角色(用户)挂钩,public是一个特殊角色,代表所有人. 超级用户是有允许任意操作对象的,普通用户只能操作自己创建的对象. 另外有一些对象是有赋予给public角色默认权限的,所

PostgreSQL MySQL 兼容性之 - 读写用户的只读影子用户

在一些企业里面,通常会在数据库中创建一些只读用户,这些只读用户可以查看某些用户的对象,但是不能修改或删除这些对象的数据. 这种用户通常可以给开发人员,运营人员使用,或者数据分析师 等角色的用户使用. 因为他们可能关注的是数据本身,并且为了防止他们误操作修改或删除线上的数据,所以限制他们的用户只有只读的权限. MySQL这块的管理应该非常方便. 其实PostgreSQL管理起来也很方便. 用户可以先参考我前面写的两篇文章 PostgreSQL 逻辑结构 和 权限体系 介绍 https://yq.a

PostgreSQL DaaS设计注意 - schema与database的抉择

PostgreSQL DaaS设计注意 - schema与database的抉择 作者 digoal 日期 2016-10-12 标签 PostgreSQL , DaaS , 模板 , schema , database , apply delay , standby 背景 市面上有一些提供DaaS服务的厂商,例如heroKu,可能有上百万的数据库服务: 又比如提供PaaS平台的服务商,数据库也会有很多,同事这些数据库可能也是模板化的,这些厂商并不一定是为每个客户都新建一个数据库集群来满足数据库

PostgreSQL不同模式(SCHEMA)之间迁移数据

操作目的:   PostgreSQL数据库在不同模式之间迁移数据,可用于在异机数据迁移的场景.   今天网友问到一个问题,是在数据迁移的场景中,想把源库的数据迁移到不同的schema下面,比如从schema gaoqiang,迁移到schema mayday.   schema(模式)这种概念在Oracle中,可以把用户认为就是schema,比如用户gaoqiang的模式就是gaoqiang:在其他数据库中 不一定是一一严格对应的,具有一定的灵活性.在PostgreSQL数据库中,模式和用户可以

[example]Sync data from PostgreSQL database to another PostgreSQL database

利用EDB的database link实现从PostgreSQL到PostgreSQL的数据同步.源数据是持续插入,无更新操作的记录.将create_time作为同步标记.并且需要定期清除同步来的历史数据. Source Database : PostgreSQLDestination Database : PostgreSQLSync Database : EnterpriseDB SD_table :                                       Table "

数据库中的Schema和Database的区别

在mysql中创建一个Schema和创建一个Database的效果好像是一样的,但是在sqlserver和orcal数据库中效果又是不同的,目前我只能理解为在mysql中schema<==>database; 数据库中的user和schema的关系: 假如我们想了解数据库中的user和schema的关系,首先必须要清楚数据库中的user和schema的概念. 在sqlserver2000中,由于架构的原因,user和schema总有一层隐含的关系,让我们很少意识到其实user和schema是两

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

本文旨在帮助用户理解PostgreSQL的逻辑结构和权限体系,帮助用户快速的理解和管理数据库的权限. 逻辑结构 最上层是实例,实例中允许创建多个数据库,每个数据库中可以创建多个schema,每个schema下面可以创建多个对象.对象包括表.物化视图.操作符.索引.视图.序列.函数.... 等等. 在数据库中所有的权限都和角色(用户)挂钩,public是一个特殊角色,代表所有人.超级用户是有允许任意操作对象的,普通用户只能操作自己创建的对象.另外有一些对象是有赋予给public角色默认权限的,所以