我创建了一个具有超级用户权限的用户角色。我的服务器上有大约 30 个数据库。我只想将此角色分配给 DB。当前角色允许用户以超级用户身份访问所有数据库。我如何限制他以超级用户身份访问其他数据库。
这是我用于分配超级用户的:
CREATE ROLE fc LOGIN
SUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
有人可以帮我弄这个吗?
我创建了一个具有超级用户权限的用户角色。我的服务器上有大约 30 个数据库。我只想将此角色分配给 DB。当前角色允许用户以超级用户身份访问所有数据库。我如何限制他以超级用户身份访问其他数据库。
这是我用于分配超级用户的:
CREATE ROLE fc LOGIN
SUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
有人可以帮我弄这个吗?
正如@Craig 解释的那样,你不能(即使你可以,这也是毫无意义的)。
实现受限超级用户权限的常用方法是作为现有的超级用户角色连接,并创建包含一组有限的已批准命令的SECURITY DEFINER
函数。这些函数现在将以创建者而不是调用者的权限执行。
但是您需要非常小心,不要打开任何注入漏洞,因为函数中的所有内容都将以超级用户身份运行。例如,调用者可以编写一个自定义=
运算符来授予他们超级用户权限,并将其放在他们的搜索路径中,因此您需要绝对确定您正在使用模式=
中的。pg_catalog
至少,您应该:
SECURITY DEFINER SET search_path TO pg_catalog, pg_temp
。模式必须始终包含在列表的pg_temp
末尾(如果省略,它将隐式包含在开头)。public.MyTable
而不是 just MyTable
),并确保所有这些都是超级用户拥有的(这样调用者就不能将恶意代码放入触发器等)。EXECUTE 'SELECT ...'
切勿在没有详尽验证的情况下将用户输入放在动态查询字符串 ( ) 中。PostgreSQL 中没有针对特定于数据库的超级用户的功能。
无论如何,这是没有意义的,因为通常仅超级用户的操作是允许相对容易升级以更好地控制数据库系统的操作。