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

时间:2015-06-19 03:15:17

标签: database postgresql role superuser

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

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

CREATE ROLE fc LOGIN
   SUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

正如@Craig解释的那样,你不能(即使你可以,也没有意义)。

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

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

至少,你应该:

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