postgresql 如何在创建postgres用户时撤销特定用户的管理员功能

ifmq2ha2  于 2022-12-23  发布在  PostgreSQL
关注(0)|答案(1)|浏览(194)

我想撤销管理员或执行功能的一个特定的用户在Postgres在用户创建的java。
例如,让我们有一个只读权限的用户“readonlyuser”,我不想让他执行这些函数,所以我在下面尝试撤销,首先是所有函数,然后是pg_sleep。
从只读用户,public撤消对函数的执行;
调用函数时执行pg_sleep FROM只读用户;
如下所述,

String sql = "CREATE USER 'readonlyuser' WITH ENCRYPTED PASSWORD 'pass';";
Statement stmt = connection.createStatement();
stmt.execute(sql);
stmt.execute("REVOKE EXECUTE ON FUNCTIONS FROM 'readonlyuser', public");

or

stmt.execute("REVOKE EXECUTE ON FUNCTION pg_sleep FROM readonlyuser;");

但是,我仍然可以从readonlyuser执行函数.
请帮助我知道我怎样才能做到这一点。

k4ymrczo

k4ymrczo1#

REVOKE EXECUTE ON FUNCTIONS不是正确的SQL,所以让我以pg_sleep为例。
pg_sleep具有默认权限,因为

SELECT proacl FROM pg_proc WHERE proname = 'pg_sleep';

返回NULL。The documentation具有该值
授予PUBLIC的默认权限如下:[...]函数和过程的EXECUTE特权
因此,特权被授予PUBLIC,现在您只能撤消已授予的特权,因此,从readonlyuser撤消特权的尝试将一无所获,您必须从PUBLIC撤消特权。
请注意,您不应更改系统功能的权限。此类更改将在升级过程中丢失。此外,它可能会破坏预期能够使用这些功能的客户端工具。请注意,被视为危险的功能仅限于特权用户。
如果您的目标是防止可以在数据库上运行SQL语句的用户执行拒绝服务攻击,那么就别想了。这是不可能的。在这种情况下,限制对某些函数的访问是您最不需要担心的。不要让不可信的用户在数据库上运行自己的SQL语句。

相关问题