PostgreSQL11 新特性解读 : 新增三个默认角色

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介:

PostgreSQL 11 新增三个默认系统角色,如下:

  • pg_read_server_files
  • pg_write_server_files
  • pg_execute_server_program

这三个角色主要涉及数据库服务端文件的读写权限,例如使用copy命令或file_fdw模块读写数据库端文件的权限。

这些权限之前版本只有超级用户才具备,这三个默认角色的出现,使得可以将数据库服务端的文件的访问权限(目前仅包含copy命令或file_fdw模块)下放给普通用户。

Release说明

Add default roles which control file system access (Stephen Frost)

Specifically, the new roles are: pg_read_server_files, pg_write_server_files, pg_execute_server_program. These roles now also control who can use COPY and extension file_fdw. Previously only superusers could use these functions, and that is still the default behavior.

手册中说明很清楚,下面演示这三种角色的权限。

pg_read_server_files

pg_read_server_files 角色具有数据库服务端文件的读权限,例如使用copy命令或file_fdw模块读数据库端文件的权限。

在数据库主机 pghost2 家目录创建 t_copy.txt 文件并写入两行数据,如下:

1       a
2       b 

以 francs 用户登录数据库 francs 创建测试表 t_copy 如下:

[pg11@pghost2 ~]$ psql francs francs
psql (11beta3)
Type "help" for help.

francs=> CREATE TABLE t_copy(id int4, name text);
CREATE TABLE

创建 role11 用户,如下

postgres=# CREATE ROLE role11 NOSUPERUSER PASSWORD 'role11' LOGIN;
CREATE ROLE

以 role11 用户登录到 francs 数据库,执行 copy 命令,尝试将数据库服务端文件 t_copy.txt 文件的数据加载到表 t_copy 中,如下:

[pg11@pghost2 ~]$ psql francs role11
psql (11beta3)
Type "help" for help.

francs=> COPY t_copy FROM '/home/pg11/t_copy.txt';
ERROR:  must be superuser or a member of the pg_read_server_files role to COPY from a file
HINT:  Anyone can COPY to stdout or from stdin. psql s \copy command also works for anyone.

以上报错,提示需要超级用户或具有pg_read_server_files权限才能使用 COPY 命令读取数据库服务端文件。

给 role11 用户赋 pg_read_server_files 角色权限,如下:

francs=> \c francs postgres
You are now connected to database "francs" as user "postgres".

francs=# GRANT pg_read_server_files TO role11;
GRANT ROLE

francs=# GRANT USAGE ON SCHEMA francs TO role11;
GRANT

francs=# GRANT INSERT ON francs.t_copy TO role11;
GRANT

francs库中创建了模式 francs ,因此也需要将模式的使用权限赋给 role11,否则访问表时会报没有使用模式权限的错误;之后再赋予表的写权限。

再次测试成功,如下。

[pg11@pghost2 ~]$ psql francs role11
psql (11beta3)
Type "help" for help.

francs=> COPY francs.t_copy FROM '/home/pg11/t_copy.txt';
COPY 2

pg_write_server_files

pg_write_server_files 角色具有数据库服务端文件的写权限,例如使用copy命令或file_fdw模块写数据库端文件的权限,接着演示。

以 role11 用户登录数据库 francs ,尝试导出表数据到数据库服务端。

[pg11@pghost2 ~]$ psql francs role11;
psql (11beta3)
Type "help" for help.

francs=> COPY francs.t_copy TO '/home/pg11/t_copy2.txt';
ERROR:  must be superuser or a member of the pg_write_server_files role to COPY to a file
HINT:  Anyone can COPY to stdout or from stdin. psql s \copy command also works for anyone.

赋权如下:

[pg11@pghost2 ~]$ psql francs postgres
psql (11beta3)
Type "help" for help.

francs=# GRANT pg_write_server_files TO role11;
GRANT ROLE

francs=# GRANT SELECT ON francs.t_copy TO role11;
GRANT

再次测试成功,如下

[pg11@pghost2 ~]$ psql francs role11;
psql (11beta3)
Type "help" for help.

francs=> COPY francs.t_copy TO '/home/pg11/t_copy2.txt';
COPY 2

francs=> \! cat '/home/pg11/t_copy2.txt'
1       a
2       b

可见,已将数据导出到数据库服务端上的文件。

pg_execute_server_program

pg_execute_server_program 角色具有执行数据库服务端的程序权限,以file_fdw外部表举例如下。

首先准备数据文件,将 t_copy 文件进行压缩,如下:

[pg11@pghost2 ~]$ cat t_copy.txt 
1       a
2       b

[pg11@pghost2 ~]$ gzip t_copy.txt 

创建 file_fdw 外部扩展和外部表,以超级用户postgres登录francs库,如下:

[pg11@pghost2 ~]$ psql francs postgres
psql (11beta3)
Type "help" for help.

francs=# CREATE EXTENSION file_fdw;
CREATE EXTENSION

francs=# CREATE SERVER srv_file FOREIGN DATA WRAPPER file_fdw ;
CREATE SERVER

francs=# GRANT USAGE ON FOREIGN SERVER srv_file TO role11;
GRANT

以普通用户role11登录francs库,创建带OPTIONS(program)选项的外部表,如下:

[pg11@pghost2 ~]$ psql francs role11
psql (11beta3)
Type "help" for help.

francs=> CREATE FOREIGN TABLE ft_t_copy(id int4,name text) SERVER srv_file OPTIONS(program 'gunzip < /home/pg11/t_copy.txt.gz');
ERROR:  only superuser or a member of the pg_execute_server_program role may specify the program option of a file_fdw foreign table

以上报错,提示需要 superuser 或 pg_execute_server_program 权限才有权限指定 file_fdw 外部表的 program 选项。

将 pg_execute_server_program 角色赋予 role11用户,注意以下以postgres超级用户执行。

francs=# GRANT pg_execute_server_program TO role11;
GRANT ROLE

再次以role11用户登录francs库测试,如下:

francs=> CREATE FOREIGN TABLE ft_t_copy(id int4,name text) SERVER srv_file OPTIONS(program 'gunzip < /home/pg11/t_copy.txt.gz');
CREATE FOREIGN TABLE

francs=> SELECT * FROM ft_t_copy ;
 id | name 
----+------
  1 | a
  2 | b
(2 rows)

创建带带OPTIONS(program)选项的外部表成功。

总结

pg_read_server_files、pg_write_server_files、pg_execute_server_program 角色涉及到读写数据库服务端文件,权限较大,分配此角色权限给数据库用户时需谨慎考虑。

参考

新书推荐

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

链接:https://item.jd.com/12405774.html
_5_PostgreSQL_

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
安全 关系型数据库 数据库
Postgresql 数据库用户权限授权(用户角色分配模式)
为了更方面和安全地管理数据库用户账号权限安全,实现通过用户角色代理的模式,实现用户账号功能授权的模式
15081 2
Postgresql 数据库用户权限授权(用户角色分配模式)
|
4月前
|
关系型数据库 Linux 数据安全/隐私保护
PostgreSQL【部署 02】在线安装PostgreSQL(Some psql features might not work 问题处理+角色密码设置+配置远程访问)
PostgreSQL【部署 02】在线安装PostgreSQL(Some psql features might not work 问题处理+角色密码设置+配置远程访问)
36 0
PostgreSQL【部署 02】在线安装PostgreSQL(Some psql features might not work 问题处理+角色密码设置+配置远程访问)
|
4月前
|
安全 关系型数据库 数据库
postgresql|数据库|角色(用户)管理工作---授权和去权以及usage和select两种权限的区别
postgresql|数据库|角色(用户)管理工作---授权和去权以及usage和select两种权限的区别
55 0
|
关系型数据库 数据库 数据安全/隐私保护
PostgreSQL技术大讲堂 - Part 6:PG用户与角色管理
PostgreSQL技术大讲堂 - Part 6:PG用户与角色管理
209 1
PostgreSQL技术大讲堂 - Part 6:PG用户与角色管理
|
SQL 存储 关系型数据库
PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换|学习笔记
快速学习PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换
731 0
PostgreSQL 流复制搭建主从环境,同步和异步的解释,压力测试,主从角色切换|学习笔记
|
SQL Oracle 关系型数据库
PostgreSQL pg_rewind,时间线修复,脑裂修复,flashback - 从库开启读写后,回退为只读从库。异步主从发生角色切换后,主库rewind为新主库的从库
PostgreSQL pg_rewind,时间线修复,脑裂修复,flashback - 从库开启读写后,回退为只读从库。异步主从发生角色切换后,主库rewind为新主库的从库
1880 1
|
SQL Oracle 关系型数据库
PostgreSQL pg_rewind,时间线修复,脑裂修复,flashback - 从库开启读写后,回退为只读从库。异步主从发生角色切换后,主库rewind为新主库的从库
标签 PostgreSQL , pg_rewind , 主从切换 , 时间线修复 , 脑裂修复 , 从库开启读写后,回退为只读从库 , 异步主从发生角色切换后,主库rewind为新主库的从库 背景 1、PG物理流复制的从库,当激活后,可以开启读写,使用pg_rewind可以将从库回退为只读从库的角色。而不需要重建整个从库。 2、当异步主从发生角色切换后,主库的wal目录中可能还有没完全
952 0
|
新零售 Oracle 关系型数据库
PostgreSQL技术周刊第11期:PostgreSQL11 新特性解读之新增三个默认角色
PostgreSQL(简称PG)的开发者们:云栖社区已有5000位PG开发者,发布了3000+PG文章(文章列表),沉淀了700+的PG精品问答(问答列表)。 PostgreSQL技术周刊会为大家介绍最新的PG技术与动态、预告活动、最热问答、直播教程等,欢迎大家订阅PostgreSQL技术周刊。
4080 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色
第 21 章 数据库角色 目录 21.1. 数据库角色 21.2. 角色属性 21.3. 角色成员关系 21.4. 删除角色 21.5. 默认角色 21.6. 函数和触发器安全性 PostgreSQL使用角色的概念管理数据库访问权限。
1193 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色_21.6. 函数和触发器安全性
21.6. 函数和触发器安全性 函数和触发器允许用户在后端服务器中插入代码,其他用户不会注意到这些代码的执行。因此,两种机制允许用户相对容易地为其他人设置“特洛伊木马”。唯一真正的保护是收紧对能定义函数的用户的控制。
1269 0