francs.tan
2019-01-01
2606浏览量
涉及到数据库服务端文件读取的系统函数通常需要管理员权限,例如 pg_ls_dir()等系统函数,PostgreSQL 11 版本支持少量文件读取的系统函数权限下放,可通过 GRANT/REVOKE 将权限赋给普通用户,目前以下四个文件读取系统函数支持权限下放:
这四个函数在11版本之前只有超级用户才有权限使用。
Allow access to file system functions to be controlled by GRANT/REVOKE permissions, rather than superuser checks (Stephen Frost)
Specifically, these functions were modified: pg_ls_dir(), pg_read_file(), pg_read_binary_file(), pg_stat_file().
以上四个函数使用上差异不大,本文仅演示其中两个函数。
pg_ls_dir()函数可以列出数据库服务端数据目录的文件,11版本前只有超级用户才有权限调用。
10 版本测试如下:
[postgres@pghost1 ~]$ psql mydb pguser
psql (10.0)
Type "help" for help.
mydb=> SELECT pg_ls_dir('pg_wal');
ERROR: must be superuser to get directory listings
以上显示只有超级用户才有权限。
尝试将函数 pg_ls_dir()的可执行权限赋给普通用户 pguser。
mydb=> \c mydb postgres
You are now connected to database "mydb" as user "postgres".
mydb=# GRANT EXECUTE ON FUNCTION pg_ls_dir(text) TO pguser;
GRANT
mydb=# \c mydb pguser
You are now connected to database "mydb" as user "pguser".
mydb=> select pg_ls_dir('pg_wal');
ERROR: must be superuser to get directory listings
以上看出,将函数pg_ls_dir()的执行权限赋给普通用户后,普通用户依然没有权限执行。
将函数 pg_ls_dir()的可执行权限赋给普通用户 role11 。
[pg11@pghost2 ~]$ psql francs postgres
psql (11beta3)
Type "help" for help.
francs=# GRANT EXECUTE ON FUNCTION pg_ls_dir(text) TO role11;
GRANT
以 role11 用户登录 francs 库测试:
[pg11@pghost2 ~]$ psql francs role11
psql (11beta3)
Type "help" for help.
francs=> SELECT pg_ls_dir('pg_wal');
pg_ls_dir
--------------------------
00000001000000170000002B
000000010000001700000025
000000010000001700000034
000000010000001700000073
...省略
普通用户执行 pg_ls_dir('pg_wal') 函数成功,已查看到数据库服务端的 pg_wal 目录文件。
pg_read_file()函数可以显示数据库服务端文本文件的内容,11版本前只有超级用户才有权限调用。
10 版本测试,如下:
[postgres@pghost1 ~]$ psql mydb pguser
psql (10.0)
Type "help" for help.
mydb=> SELECT pg_read_file('/home/postgres/t_copy2.txt');
ERROR: must be superuser to read files
显示只有超级用户才有权限执行。
将函数 pg_read_file()的可执行权限赋给普通用户 role11 。
[pg11@pghost2 ~]$ psql francs postgres
psql (11beta3)
Type "help" for help.
francs=# GRANT EXECUTE ON FUNCTION pg_read_file(text) TO role11;
GRANT
以role11用户登录francs库测试,如下:
[pg11@pghost2 ~]$ psql francs role11
psql (11beta3)
Type "help" for help.
francs=> select pg_read_file ('/home/pg11/t_copy2.txt');
pg_read_file
--------------
1 a +
2 b +
(1 row)
赋权后,普通用户role11有权限执行 pg_read_file() 函数查看数据库服务端文件内容。
最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!
链接:https://item.jd.com/12405774.html
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
分享数据库前沿,解构实战干货,推动数据库技术变革