首页 > 数据库 >一文全搞懂postgresql的权限

一文全搞懂postgresql的权限

时间:2022-10-19 10:48:28浏览次数:57  
标签:postgresql postgres database myschema 搞懂 权限 mydb schema


权限结构图

pg中权限至上而下层次分明,首先要了解pg的逻辑架构,如下图

一文全搞懂postgresql的权限_创建对象


需要注意的是在如上架构中数据库是严格分开的,这意味着不能同时使用两个不同的数据库,而模式不是严格分开的,可以一起使用和访问同一数据库的两个或多个模式中的对象。模式是逻辑层面的划分,那么表空间就是物理层面的划分,表空间只能属于某一个实例,但是可以被多个数据库使用。


权限总结概念

(1)在数据库中所有的权限都和角色(用户)挂钩,角色和用户的唯一区别在于,角色是nologin的,而用户允许login,仅此而已。而"public" 是一个特殊的角色,代表着所有人。

postgres=# create role r1;
CREATE ROLE
postgres=# create user u2;
CREATE ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
admin | Superuser | {}
cjr | | {}
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
r1 | Cannot login | {}
u2 |

psql -U r1
psql: error: FATAL: role "r1" is not permitted to log in

(2)超级用户允许操作任何对象,所以超级用户请妥善保管,普通用户只能操作自己创建的对象,因为它是对象的owner。

(3)有一些对象有赋予给public角色默认权限,所以建好之后,所有人都有这些默认权限。

(4)默认情况下,数据库在创建后,允许public角色连接,即允许任何人连接,需要revoke connect on database xxx from public之后,再显式执行grant connect on database xxx to xxx。

postgres=# revoke connect on database mydb from public;
REVOKE
postgres=# \c mydb u2;
FATAL: permission denied for database "mydb"
DETAIL: User does not have CONNECT privilege.
Previous connection kept
postgres=# grant connect on database mydb to u2;
GRANT
postgres=# \c mydb u2;
You are now connected to database "mydb" as user "u2".
postgres=# \c mydb u3;
FATAL: permission denied for database "mydb"
DETAIL: User does not have CONNECT privilege.
Previous connection kept

postgres=# grant connect on database mydb to public;
GRANT
postgres=# \c mydb u3;
You are now connected to database "mydb" as user "u3".
mydb=>

(5)默认情况下,数据库在创建后,不允许除了超级用户和owner之外的任何人在数据库中创建schema。

postgres=# create user u2;
postgres=# \c mydb u2;
mydb=> create schema myschema;
ERROR: permission denied for database mydb

(6)默认情况下,数据库在创建后,会自动创建名为public的schema,这个schema的all权限已经赋予给public角色,即允许任何人在里面创建对象,所以为了方便安全,先revoke all吧,再按需授予权限。

mydb=# \c mydb u2;

mydb=> create table t1111(id int);
CREATE TABLE

mydb=> create table myschema.t1(id int);
ERROR: permission denied for schema myschema
LINE 1: create table myschema.t1(id int);
^

(7)schema级别的权限,包括允许查看schema中的对象,允许在schema中创建对象。

(8)默认情况下新建的schema的权限不会赋予给public角色,因此除了超级用户和owner,任何人都没有权限查看schema中的对象或者在schema中新建对象。


通用的赋权操作

删除在PUBLIC建表的权限

revoke create on schema public from public;
postgres=> create table u2t1(id int);
ERROR: permission denied for schema public
LINE 1: create table u2t1(id int);

删除连接schema的权限

postgres=> \c postgres postgres
You are now connected to database "postgres" as user "postgres".
postgres=# revoke all on database postgres from public;
REVOKE
postgres=# \c postgres user2;
FATAL: permission denied for database "postgres"
DETAIL: User does not have CONNECT privilege.
Previous connection kept
postgres=#

赋予连接权限

postgres=# grant connect on database postgres to user2;
GRANT
postgres=# \c postgres user2;
You are now connected to database "postgres" as user "user2".

但是没有shema权限

postgres=> \c postgres postgres;  
You are now connected to database "postgres" as user "postgres".
postgres=# create table myschema.test(id int);
CREATE TABLE

postgres=# \c postgres user2;
You are now connected to database "postgres" as user "user2".
postgres=> select * from myschema.test;
ERROR: permission denied for schema myschema
LINE 1: select * from myschema.test;

赋予schema权限,但没有表权限

grant usage on schema myschema to user2;
GRANT
postgres=# \c postgres user2;
You are now connected to database "postgres" as user "user2".
postgres=> select * from myschema.test;
ERROR: permission denied for table test

赋予查询权限

 grant select on all tables in schema myschema to user2;


postgres=> select * from myschema.test;
id
----
(0 rows)

新建表无权限

postgres=# create table myschema.test2(id int);
CREATE TABLE
postgres=# insert into myschema.test2 values (1);
INSERT 0 1

select * from myschema.test2;
ERROR: permission denied for table test2

赋予通用权限(新建表也有权限)

postgres=# alter default privileges in schema myschema grant select on tables to user2;
ALTER DEFAULT PRIVILEGES



标签:postgresql,postgres,database,myschema,搞懂,权限,mydb,schema
From: https://blog.51cto.com/u_13874232/5764709

相关文章

  • 怎么删除需要管理员权限的文件
    1、打开文件夹,进去把文件都删了,出来外面这个文件夹就都可以删除了2、用文件粉碎机将文件夹里面不能删除的文件全部粉碎掉,出来后就可以删除文件夹了(前提是确认该文件没用了......
  • postgresql13源码安装部署
    环境:Os:Centos7DB:13.81.下载安装介质下载地址:源码下载地址:https://www.postgresql.org/ftp/source/二进制下载地址(新版本的没有二进制下载,只能使用源码安装):http......
  • Github上把敏感文件或者API秘钥上传公共库并开放为public权限导致秘钥泄露
    Github上把敏感文件或者API秘钥上传公共库并开放为public权限导致秘钥泄露背景我们在开发项目时,可能会使用到一些加密文件,例如私钥,或者使用到一些云服务商提供的ak(Acce......
  • 持续集成3-Jenkins用户权限管理、开启权限全局安全配置、创建角色
    ​  我们可以利用Role-basedAuthorizationStrategy插件来管理jenkins用户权限持续集成环境4-Jenkins凭证管理凭据可以用来存储需要密文保护的数据库密码、Gitlab密码......
  • 关于postgresql权限的一个bug
    PG中的bug根据SQL标准,一个模式的所有者总是拥有其中的所有对象。PostgreSQL允许模式包含由模式所有者以外的用户拥有的对象。这种情况才会发生在,当模式拥有者将模式的"CREAT......
  • Win 权限维持小思路
    0x01linkinfo.dll介绍:explorer进程每隔一段时间就会自动去加载它一次所以可以用来做权限维持。使用Cobaltstrike生成对应系统位数DLL文件放置目标系统C:\Windows\目录下重......
  • PostgreSQL 数据库开发规范
    背景PostgreSQL的功能非常强大,但是要把PostgreSQL用好,开发人员是非常关键的。下面将针对PostgreSQL数据库原理与特性,输出一份开发规范,希望可以减少大家在使用PostgreSQL......
  • 拒绝了对对象 ‘GetTips‘ (数据库 ‘vipsoft‘,架构 ‘dbo‘)的 EXECUTE 权限
    SQLServer2016安装数据库—属性—权限—选择用户或角色—勾选执行权限即可。 ......
  • root开启权限
    ubuntu中root开启伪分布式权限:vimstart-dfs.sh和vimstop-dfs.sh后均在开头插入HDFS_DATANODE_USER=rootHDFS_DATANODE_SECURE_USER=hdfsHDFS_NAMENODE_USER=rootHDFS_......
  • 常用PostgreSQL函数
    工作中用到的函数做一下记录加深影响。to_number用法:to_number(text1,text2)text1:需要转换的字符串text2:格式化模板,如模式9,代表一个数位......