1

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

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

CREATE ROLE fc LOGIN
   SUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

有人可以帮我弄这个吗?

4

2 回答 2

3

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

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

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

至少,您应该:

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

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

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

于 2015-06-19T03:27:30.400 回答