如何将对 PostgreSQL 模式的访问列入白名单?

How do I whitelist access to a PostgreSQL schema?

我在 PG 数据库中有一个特定的模式,其中包含一些非常敏感的数据。我想阻止除一个角色之外的每个角色访问它,但我无法从权限文档中弄清楚。

首先,我认为我只会授予 CONNECT 对那个特殊角色的访问权限,但随后所有其他角色都可以连接到架构。更糟糕的是,每个角色还可以 CREATEDROP,并执行其他所有操作。

我错过了什么?

附带问题:及时,此架构将成为来自另一个 postgresql 实例的流式传输目的地。简而言之,我们有一个支持实时网站的主数据库服务器,我们需要它在另一台机器上的二级只读副本,以执行一些计算密集型查询。我们认为流媒体就是答案。这有意义吗?是否仍然可以保护对它的访问?

我们使用的是 9.5 版,以防相关。

您可以编辑文件 /etc/postgresql/9.5/main/pg_hba.conf 并输入以下内容:

# Database administrative login by Unix domain socket
local   all             postgres                                peer
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# IPv4 local connections:
host    all             YOUR_USER       [USER_IP]/32            md5

它将允许来自此特定 LAN/WAN IP 的此特定用户使用密码进行连接。

只允许此用户和 postgres

in time, this database will be a streaming destination from another instance of postgresql.

当此数据库成为复制主数据库时,您可以将以下内容添加到同一文件中:

# Allow replication connections from localhost, by a user with the
# replication privilege.
host    replication     REPL_USER        [REPL_HOST]/32            md5

有关如何在此处设置复制的更多信息:https://www.gab.lc/articles/replication_postgresql

更改后您需要重新加载 PostgreSQL:

service postgresql reload

您可以删除不想允许的角色。

更新:

如果您想通过查询撤销权限,您可以 运行:

-- Grant privileges to whitelisted user:
GRANT ALL PRIVILEGES ON [database name] TO [good_user];

-- Revoke privileges for other users:
REVOKE ALL PRIVILEGES ON [database name] FROM [bad_user];