在服务器上,我有两个数据库(比如 db1 和 db2 )。我有一个名为 user1 的超级用户。
我的要求是禁用数据库 db1 的 user1(超级用户)。所以使用 user1 我只能连接到 db2 而不能连接到 db1。
如何才能做到这一点。
注意:postgres 版本是 8.0,两个数据库都在同一个数据库集群上。
在服务器上,我有两个数据库(比如 db1 和 db2 )。我有一个名为 user1 的超级用户。
我的要求是禁用数据库 db1 的 user1(超级用户)。所以使用 user1 我只能连接到 db2 而不能连接到 db1。
如何才能做到这一点。
注意:postgres 版本是 8.0,两个数据库都在同一个数据库集群上。
完全删除他们的超级用户权限。让他们成为 ( ) 的所有者,这样他们就可以做任何事情,除了有限的仅限超级用户的操作,比如加载 C 扩展。db2
ALTER DATABASE db2 OWNER TO whatever_user
db2
您不能限制超级用户。这才是重点。仅限超级用户的操作是突破通常的访问控制规则的操作。例如,加载用户定义的 C 函数允许您编写和加载打开pg_hba.conf
和重写它的函数,或者直接操作系统目录。同样,这些adminpack
函数允许您直接访问文件系统,因此它们仅限超级用户使用。
如果他们是超级用户,他们可以阅读pg_hba.conf
,看到您的用户 ID 有权登录db1
,然后更改您的密码,然后以您的身份登录。
要求将超级用户限制为一个 DB 就像询问您是否可以让用户成为 root 用户,但仅限于一个子目录。(好的,所以使用 SELinux 你可以做到这一点,但这很复杂)。
如果你真的必须这样做,唯一的方法就是拆分db1
并db2
分成不同的 PostgreSQL 服务器,这些服务器在不同的未授权系统用户 ID 下运行。每个都有自己独立的shared_buffers
,数据目录,监听(ip-address, port)
组合,WAL,用户ID,数据库列表等。由于它们在不同的系统用户下运行,他们无权读取或写入彼此的数据目录,所以他们被隔离。它们必须侦听不同的端口和/或不同的 IP 地址,尽管您可以使用 PgBouncer 使它们在外部客户端看来是同一台服务器。