如何在postgres中禁用超级用户

时间:2012-11-02 11:16:18

标签: postgresql root

在服务器上我有两个数据库(比如db1和db2)。我有一个名为user1的超级用户。

我的要求是禁用数据库db1的user1(超级用户)。 因此,使用user1我只能连接到db2而不能连接到db1。

如何做到这一点。

注意:postgres版本为8.0,两个数据库都位于同一个数据库集群中。

1 个答案:

答案 0 :(得分:4)

完全删除他们的超级用户权限。将它们设为db2ALTER DATABASE db2 OWNER TO whatever_user)的所有者,这样他们就可以对db2执行任何操作,但有限的仅限超级用户操作(如加载C扩展名)除外。

您不能限制超级用户。这才是重点。仅限超级用户的操作是突破常规访问控制规则的操作。例如,加载用户定义的C函数允许您编写和加载打开pg_hba.conf并重写它的函数,或者直接操作系统目录。同样,adminpack函数允许您直接进行文件系统访问,因此它们只是超级用户。

如果他们是超级用户,他们只需阅读pg_hba.conf,看到您的用户ID有权登录db1,然后更改密码,然后以您身份登录

要求将超级用户限制为一个数据库,就像询问是否可以创建用户root,但只能用于一个子目录。 (好的,所以使用SELinux你可以做到这一点,但它复杂)。

如果你真的必须这样做,唯一的办法就是将db1db2分成不同的PostgreSQL服务器,这些服务器运行在不同的未成熟系统用户ID下。每个都有自己独立的shared_buffers,数据目录,监听(ip-address, port)组合,WAL,用户ID,数据库列表等。由于它们在不同的系统用户下运行,因此无权阅读或者写下彼此的数据目录,这样它们就是孤立的。他们必须侦听不同的端口和/或不同的IP地址,但您可以使用PgBouncer使它们看起来与外部客户端的服务器相同。