【问题标题】:How can I disable a superuser in postgres如何在 postgres 中禁用超级用户
【发布时间】:2012-11-02 11:16:17
【问题描述】:

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

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

如何做到这一点。

注意:postgres 版本是 8.0,两个数据库都在同一个数据库集群上。

【问题讨论】:

  • 呃,说真的,8.0?这是令人难以置信的过时。它于 2005 年 1 月发布,其最终生命周期结束发布是在 2010 年 10 月。紧急升级。见postgresql.org/support/versioning

标签: postgresql root


【解决方案1】:

完全删除他们的超级用户权限。让他们成为db2 (ALTER DATABASE db2 OWNER TO whatever_user) 的所有者,这样他们就可以对db2 做任何事情,除了有限的仅限超级用户的操作,例如加载 C 扩展。

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

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

要求将超级用户限制为一个 DB 就像询问您是否可以让用户成为 root 用户,但仅限于一个子目录。 (好的,所以使用 SELinux 你可以做到这一点,但它很复杂)。

如果您确实必须这样做,唯一的方法是将db1db2 拆分到不同的PostgreSQL 服务器中,这些服务器在不同的未授权系统用户ID 下运行。每个都有自己独立的shared_buffers、数据目录、监听(ip-address, port)组合、WAL、用户ID、数据库列表等。由于它们在不同的系统用户下运行,它们无权读取或写入彼此' 数据目录,因此它们是隔离的。它们必须侦听不同的端口和/或不同的 IP 地址,但您可以使用 PgBouncer 使它们在外部客户端看来是同一台服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2016-12-18
    • 2021-08-09
    • 2023-03-08
    • 2022-01-25
    相关资源
    最近更新 更多