【问题标题】:How to GRANT priveleges to non-superuser to execute function pg_read_binary_file?如何授予非超级用户权限以执行函数 pg_read_binary_file?
【发布时间】:2019-12-31 06:04:08
【问题描述】:

在 PostgreSQL 中,我有一个带有自定义函数的数据库,它使用系统函数 pg_read_binary_file 在数据库表中加载文件的二进制内容。

如果我在具有超级用户权限的用户下运行此自定义功能,它会成功执行。但是当用户没有超级用户权限时,我收到一个错误:

permission denied for function pg_read_binary_file

我认为我需要的只是GRANT 权限到EXECUTE 此类用户的功能,所以我做了以下操作:

GRANT EXECUTE ON FUNCTION pg_read_binary_file(text,bigint,bigint,boolean) TO someuser;
GRANT EXECUTE ON FUNCTION pg_read_binary_file(text,bigint,bigint) TO someuser; 
GRANT EXECUTE ON FUNCTION pg_read_binary_file(text) TO someuser;

如果我检查权限

SELECT proacl FROM pg_proc WHERE proname='pg_read_binary_file';

我明白了:

{postgres=X/postgres,someuser=X/postgres}
{postgres=X/postgres,someuser=X/postgres}
{postgres=X/postgres,someuser=X/postgres}

据我了解,现在someuser 有权执行函数pg_read_binary_file。但是当我尝试运行我的自定义函数时,我仍然收到同样的错误:

permission denied for function pg_read_binary_file

那么问题是如何授予非超级用户执行pg_read_binary_file函数的权限?也许有一些额外的权限必须被授予,但这并不明显。

pg_read_binary_filedocumentation on Portgres system functions 中写道:

默认限制为超级用户,但可以授予其他用户EXECUTE运行该功能。

我搜索了一些有关如何授予此类权限的其他信息,但没有运气。

【问题讨论】:

    标签: postgresql security privileges


    【解决方案1】:

    有三种可能:

    1. 您使用的是旧的 PostgreSQL 版本。

      commit e79350fef2917522571add750e3e21af293b50fe 之前,这不是由函数的权限控制,而是由函数本身的硬编​​码检查控制。

      但是,这似乎不是您的情况,因为错误消息会显示为:

      ERROR:  must be superuser to read files
      
    2. 当您尝试执行该功能时,您不是someuser。测试用

      SELECT current_user;
      
    3. 您已连接到不同的数据库(例如,您更改了 postgres 数据库中的权限,但 someuser 连接到了不同的数据库)。

    【讨论】:

    • 感谢您的回答。情况3。我授予数据库postgres的权限,因为我认为每当数据库连接用户时都会从postgres数据库调用系统函数,而且我只在postgres数据库中的对象树中播种pg_read_binary_file。在您回答之后,我在工作数据库中授予了权限,现在一切正常。所以答案 - 我必须在 postgres 数据库上而不是在工作数据库上执行 GRANT EXECUTE ON FUNCTION pg_read_binary_file(text) TO someuser;。再次感谢您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2011-09-25
    • 2023-03-07
    相关资源
    最近更新 更多