特定于 PostgreSQL 中某些数据库的超级用户角色

Superuser Role Specific to certain Databases in PostgreSQL

我创建了一个具有超级用户权限的用户角色。我的服务器上有大约 30 个数据库。我只想将此角色分配给数据库。当前角色允许用户以超级用户身份访问所有数据库。如何限制他以超级用户身份访问其他数据库

这是我用于分配超级用户的信息:

CREATE ROLE fc LOGIN
   SUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

有人可以帮我解决这个问题吗?

PostgreSQL 中没有针对特定于数据库的超级用户的工具。

无论如何这都没有意义,因为通常仅限超级用户的操作允许相对容易地升级以更好地控制数据库系统。

正如@Craig 所解释的那样,你不能(即使你可以,那也是毫无意义的)。

实现受限超级用户权限的常用方法是作为现有超级用户角色连接,并创建 SECURITY DEFINER functions 包含一组有限的已批准命令。这些函数现在将以创建者而非调用者的权限执行。

但是你需要非常注意不要打开任何注入漏洞,因为函数内的所有内容都将运行作为超级用户。例如。调用者可以编写一个自定义 = 运算符,授予他们超级用户权限,并将其放在他们的搜索路径中,因此您需要绝对确定您在 [=13= 中使用 = ] 架构。

至少,你应该:

  • 使用子句 SECURITY DEFINER SET search_path TO pg_catalog, pg_temp 创建所有这些函数。 pg_temp 架构必须始终包含在列表的末尾(如果省略,它将隐式包含在开头)。
  • Schema 限定您的函数引用的任何其他表、函数等(例如 public.MyTable 而不仅仅是 MyTable),并确保所有这些都是超级用户拥有的(所以调用者不能将恶意代码放入触发器等)。
  • 切勿在未经详尽验证的情况下将用户输入放入动态查询字符串 (EXECUTE 'SELECT ...')。