PostgreSQL 默认权限查看方式

如何查看PostgreSQL默认权限

当我们对Postgresql的某个用户授予默认权限时, pg_default_acl表存储要被分配给新创建对象的初始权限。你可能通过查询该表获取默认权限,先了解下官方文档的解释:

表 50-17. pg_default_acl的列:

名称 类型 引用 描述
oid oid 行标识符(隐藏属性,必须被显式选择才会显示)
defaclrole oid pg_authid.oid 与此项相关的角色的OID
defaclnamespace oid pg_namespace.oid 与此项相关的名字空间的OID,如果没有则为0
defaclobjtype char 此项适合的对象类型: r = 关系(表、视图), S = 序列, f = 函数, T = 类型
defaclacl aclitem[] 此类对象在创建时应用有的访问权限

一个pg_default_acl项展示了要分配给属于一个指定用户的对象的初始权限。当前有两类项:defaclnamespace = 0的"全局"项和引用一个特殊模式的"每模式"项。如果一个全局项存在,则它重载该对象类型的普通hard-wired默认权限。一个每模式项如果存在,表示权限将被加入到全局或hard-wired默认权限中。

添加默认权限

演示数据库版本:PostgreSQL 9.6.8

这里我们测试给test用户添加“abc”模式的默认权限,先查看下当前schema的所有者:

// 查看当前schema的所有者,相当于\du元命令
SELECT n.nspname AS "Name",
 pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
ORDER BY 1; 

查询结果如图所示,模式“abc”的所有者为postgresql用户

针对模式“abc”, 使用超级管理员postgresql给普通用户test授权,命令如下:

// 最后一条命令就是授予初始权限
grant select on all tables in schema abc to test;
grant usage on schema abc to test;
alter default privileges in schema abc grant select on tables to test;

查看默认权限

授权完成,通过pg_default_acl表查看默认权限

// 查看初始权限
select * from pg_catalog.pg_default_acl;

这样看其实不是很直观,可以使用下面的SQL来查看:

// 查看初始权限
SELECT pg_catalog.pg_get_userbyid(d.defaclrole) AS "Granter",
 n.nspname AS "Schema",
 CASE d.defaclobjtype WHEN 'r' THEN 'table' WHEN 'S' THEN 'sequence' WHEN 'f' THEN 'function' WHEN 'T' THEN 'type' END AS "Type",
 pg_catalog.array_to_string(d.defaclacl, E', ') AS "Access privileges"
FROM pg_catalog.pg_default_acl d
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = d.defaclnamespace
ORDER BY 1, 2, 3;

输出结果如下: 表示通过Postgresql超级用户授予test普通用户对模式“abc”有读的权限。

在此,我们再把模式“abc”的拥有者(owner)修改为dbadmin用户(可以事先创建好),执行以下命令:

// 修改模式“abc”拥有者为:dbadmin
ALTER SCHEMA abc OWNER TO "dbadmin";
// 查看模式的拥有者,相当于\du元命令
SELECT n.nspname AS "Name",
 pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
ORDER BY 1;

现在我们使用dbadmin用户登录连接到数据库,给普通用户test添加默认权限,其实上面已经通过postgresql超级用户给test用户加过默认权限了。 这里演示使用dbadmin用户再添加一次,目的是演示pg_default_acl表会出现2条记录,使用dbadmin用户执行以下命令:

alter default privileges in schema abc grant select on tables to test;

再次查看pg_default_acl表会出现两行记录:

一行是dbadmin拥有者授予的读权限。 一行是postgresql超级用户授权的读权限。

补充:PostgreSQL基本配置与权限控制

修改PgSQL基本配置:

重要文件和目录:

配置文件:  postgresql.conf
登录权限控制文件: pg_hba.conf
数 据 目 录 : base
运行日志目录: log
归档日志目录: pg_wal

修改PgSQL侦听地址:

在单引号内写入IP地址,如果要侦听多个IP地址,以逗号分隔

[root@postgrssql ~]# vim /var/lib/pgsql/11/data/postgresql.conf
listen_addresses = 'localhost,172.18.1.76'

修改PgSQL侦听端口:

默认端口 5432

[root@postgrssql ~]# vim /var/lib/pgsql/11/data/postgresql.conf
port = 5432

修改PgSQL最大连接数:

修改连接数需要重启,对比MySQL一般设置 512 ~ 1024

[root@postgrssql ~]# vim /var/lib/pgsql/11/data/postgresql.conf
max_connections = 100

打开PgSQL复制日志:

类似于MySQL binlog,复制到从库并应用一遍日志操作就达到数据同步了

# 是否开启 archive_log日志功能
archive_mode = on
# 归档 archive_log日志要执行的命令,当前不准备归档就执行 cd命令
archive_command = 'cd .'
[root@postgrssql ~]# ll -sh /var/lib/pgsql/11/data/pg_wal
total 16M
M -rw------- 1 postgres postgres 16M Nov 23 20:47 000000010000000000000001
 0 drwx------ 2 postgres postgres 6 Nov 22 15:21 archive_status

PgSQL用户权限控制:

在数据库中创建对象时,都会为其分配所有者。 所有者通常是执行创建语句的用户。 对于大多数类型的对象,初始状态是只有所有者(或超级用户)可以修改或删除对象。 要允许其他角色或用户使用它,必须授予权限或权限。

配置超管用户安全:

默认是 all 所有用户都拥有peer对等权限,只修改为postgrs用户拥有peer权限

[root@postgrssql ~]# sed -i '80d' /var/lib/pgsql/11/data/pg_hba.conf
[root@postgrssql ~]# sed -i '79a local all  postgres  peer' /var/lib/pgsql/11/data/pg_hba.conf

创建用户:

# 创建 olda 用户
postgres=# create user olda with password '123456';
CREATE ROLE
# 查看所有用户
postgres=# \du
     List of roles
 Role name |    Attributes    | Member of
-----------+------------------------------------------------------------+-----------
 olda |        | {}
 postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

用户授权权限:

# 切换到 course 数据库
postgres=# \c course
You are now connected to database "course" as user "postgres".
# 在 course 数据库授权所有表的所有权限到 olda用户
course=# grant all on all tables in schema public to olda;
GRANT
# 查看 course 数据库所有表的权限表信息
course=# \dp+
     Access privileges
 Schema | Name | Type | Access privileges | Column privileges | Policies
--------+----------+-------+---------------------------+-------------------+----------
 public | students | table | postgres=arwdDxt/postgres+|   |
 |  | | olda=arwdDxt/postgres |   |
(1 row)

配置用户连接:

在PgSQL内创建用户后也是不可以登录的,需要在pg_hba.conf文件中配置连接源信息,否则不允许远程登录。

加入 olda用户,local本地可以登录所有库,登录密码验证方式为md5

[root@postgrssql ~]# vim /var/lib/pgsql/11/data/pg_hba.conf
# "local" is for Unix domain socket connections only
local all  postgres    peer
local all  olda  0.0.0.0/0  md5
# 重载 PostgreSQL
systemctl reload postgresql-11.service
# 测试 olda用户连接 PgSQL的 course库
-bash-4.2$ psql -U olda -W course
Password:
psql (11.6)
Type "help" for help.
course=> \l
     List of databases
 Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 course | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
 postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres  +
  |  |  |  |  | postgres=CTc/postgres
 template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres  +
  |  |  |  |  | postgres=CTc/postgres
(4 rows)

配置默认权限:

意思为 postgres用户创建的所有表都默认对 olda用户重新授予权限

postgres=# alter default privileges for role postgres grant all on tables to olda;
ALTER DEFAULT PRIVILEGES

配置用户远程连接:

默认在pg_hba.conf文件中加入密码验证方式还是不可以远程访问,因为是 local方式。
加入 olda用户,host方式,所有来源IP都可以登录所有库,登录密码验证方式为md5
-bash-4.2$ psql -U olda -W -h 172.18.1.76 -p 5432 course
Password:
psql: FATAL: no pg_hba.conf entry for host "172.18.1.76", user "olda", database "course", SSL off
[root@postgrssql ~]# vim /var/lib/pgsql/11/data/pg_hba.conf
# "local" is for Unix domain socket connections only
local all  postgres    peer
local all  olda     md5
host all  olda  0.0.0.0/0  md5
# 重载 PostgreSQL
[root@postgrssql ~]# systemctl reload postgresql-11.service
# 测试是否可以远程连接到 PostgreSQL
-bash-4.2$ psql -U olda -W -h 172.18.1.76 -p 5432 course
Password:
psql (11.6)
Type "help" for help.
course=>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 查看postgresql数据库用户系统权限、对象权限的方法

    PostgreSQL简介 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统.POSTGRES的许多领先概念只是在比较迟的时候才出现在商业网站数据库中.PostgreSQL支持大部分的SQL标准并且提供了很多其他现代特性,如复杂查询.外键.触发器.视图.事务完整性.多版本并发控制等.同样,PostgreSQL也可以用许多方法扩展,例如通过增加新的数据类型.函数.操作符

  • PostgreSQL用户、数据库及表的管理、操作与授权方式

    摘要 PostgreSQL的常用命令 1.登录数据库 /* 切换到数据库用户 */ su - postgres /* 登录 */ psql 登录成功显示如下: bash-4.2$ psql psql (9.3.17) Type "help" for help. postgres=> 2.切换数据库 /* 登录指定数据库 */ psql -U user -d dbname /* 列举数据库 */ \l /* 切换数据库 */ \c dbname 3.用户管理 /* 创建用户 */

  • postgresql限制某个用户仅连接某一个数据库的操作

    创建数据库bbb且owner为用户b: postgres9.6@[local]:5432 postgres# create database bbb owner b; CREATE DATABASE Time: 259.099 ms 默认情况下使用用户c也可以连接数据库bbb: postgres9.6@[local]:5432 postgres# \c bbb c You are now connected to database "bbb" as user "c"

  • Postgresql 赋予用户权限和撤销权限的实例

    1.对数据库授权 postgresql 授权某个数据库的权限给wang 账号 使该账号 只能操作指定DB 不能操作其他DB alter user wang set default_transaction_read_only=on; grant all on database test to wang; grant select on all database test to wang; grant select on all tables in schema public to wang; //

  • postgresql 赋权语句 grant的正确使用说明

    grant select on all tables in schema public to username; 此句是有效的复制语句 PG中有schema的概念, 以下的语句就是不行 网上得来终觉浅,错误比较多,还是要自己试试才行. 补充:postgresql关于访问视图需要的权限 某个用户访问一个视图,这个用户需要具备这个视图的schema的usage和这个视图本身的select权限,如果视图的基表来自其他schema,可能还需要其他schema的usage权限(根据postgresql改造

  • PostgreSQL 默认权限查看方式

    如何查看PostgreSQL默认权限 当我们对Postgresql的某个用户授予默认权限时, pg_default_acl表存储要被分配给新创建对象的初始权限.你可能通过查询该表获取默认权限,先了解下官方文档的解释: 表 50-17. pg_default_acl的列: 名称 类型 引用 描述 oid oid 行标识符(隐藏属性,必须被显式选择才会显示) defaclrole oid pg_authid.oid 与此项相关的角色的OID defaclnamespace oid pg_namesp

  • postgresql 性能参数配置方式

    查询Linux服务器配置 在进行性能调优之前,需要清楚知道服务器的配置信息,比如说 CPU,内存,服务器版本等信息. 查询系统版本信息 root@ubuntu160:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.3 LTS Release: 14.04 Codename: trusty Linux查看物理CPU个数.核数.逻辑CPU个数 # 总核数

  • 查看keras的默认backend实现方式

    1 . 进入当前用户目录: cd ~ 2 . 查看当前目录下的文件: ls -a 3 . 找到.keras目录并进入: cd .keras 4 . 进入并查看keras.json文件: cat keras.json 5 . 可能的显示如下: {"image_dim_ordering":"tf", "epsilon": 1e-07, "floatx": "float32", "backend&quo

  • linux文件目录默认权限(详解)

    1.文件的默认权限是没有x的,即文件的最大默认权限为666(-rw-rw-rw) 2.由于进入目录和目录的x权限有关,故目录的最大默认权限为777(drwxrwxrwx) 查看默认权限需要使用umask命令: [123@123 ~]$ umask           //数字方式显示 0022 [123@123 ~]$ umask -S        //符号方式显示 u=rwx,g=rx,o=rx以数字范式显示有4个数字,只看后3个即可,第一个为特殊权限使用 [123@123 ~]$ touc

  • linux下数据压缩的几种方法与查看方式(示例代码)

    1,tar命令 使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进行压缩了,tar命令本身不进行数据压缩,但可以在打包或解包的同时调用其它的压缩程序,比如调用gzip.bzip2 选项: -c 创建.tar格式包文件      -x 解开.tar格式包文件      -v显示详细信息      -f 使用归档文件      -p 保留原始文件权限      -C 解压到目标文件夹      -z 调用gzip进行压缩或解

  • Linux系统文件的默认权限和特殊权限

    默认权限 umask [root@CentOS7 data]# touch file1 ; ll file1 -rw-r--r--. 1 root root 0 Oct 9 13:55 file1 [root@CentOS7 data]# mkdir dir1 ; ll dir1 -d drwxr-xr-x. 2 root root 6 Oct 9 13:55 dir1 umask是什么 从上面的例子中可以发现,新建文件和目录的默认权限分别是644.755,为啥会这样?这就要聊聊umask了,L

  • 详解Spring Security 中的四种权限控制方式

    Spring Security 中对于权限控制默认已经提供了很多了,但是,一个优秀的框架必须具备良好的扩展性,恰好,Spring Security 的扩展性就非常棒,我们既可以使用 Spring Security 提供的方式做授权,也可以自定义授权逻辑.一句话,你想怎么玩都可以! 今天松哥来和大家介绍一下 Spring Security 中四种常见的权限控制方式. 表达式控制 URL 路径权限 表达式控制方法权限 使用过滤注解 动态权限 四种方式,我们分别来看.  1.表达式控制 URL 路径权

  • 恢复c盘系统默认权限的bat批处理

    由于做过安全,c盘的一些权限不知道哪个地方需要设置,这里提供恢复系统默认权限的批处理方法. 复制代码 代码如下: @ECHO OFF setlocal echo =============================== echo 恢复C盘默认NTFS权限 echo ============================== title 恢复默认NTFS权限 :menu echo. echo [1] 恢复C盘默认NTFS权限[重启后生效] echo [0] 退出 echo. @echo 输

  • TensorBoard 计算图的查看方式

    Tensorflow计算图的展示: 1. 设置生成计算图,运行程序会自动生成"logs"日志文件 2. 在Terminal下输入指令 如果当前路径为程序日志路径(即"logs"所在路径),直接输入指令 tensorboard --logdir = logs 如果当前路径不是程序日志路径(即"logs"所在路径),可以 cd "日志的绝对路径"进入"logs"所在的路径,或者 直接输入指令 tensorboa

  • Android Broadcast 和 BroadcastReceiver的权限限制方式

    在Android应用开发中,有时会遇到以下两种情况, 1. 一些敏感的广播并不想让第三方的应用收到 : 2. 要限制自己的Receiver接收某广播来源,避免被恶意的同样的ACTION的广播所干扰. 在这些场景下就需要用到广播的权限限制. 第一种场景: 谁有权收我的广播? 在这种情况下,可以在自己应用发广播时添加参数声明Receiver所需的权限. 首先,在Androidmanifest.xml中定义新的权限RECV_XXX,例如: <permission android:name = "

随机推荐