如何防止登录在 PostgreSQL 中“列出”表或视图定义?

Sil*_*lez 8 postgresql authentication security authorization permissions

有没有办法防止登录列出架构中的表和列?

我必须授予对远程登录的访问权限才能在单个视图上进行查询;但是,我还必须确保此类登录不能列出该架构上的每个对象。

DENY VIEW ANY DEFINITION TO public;PostgreSQL 上有类似 MS SQL SERVER 的东西吗?

dez*_*zso 10

文档救援:

UPDATE

[...]

对于模式,允许访问包含在指定模式中的对象(假设还满足对象自己的权限要求)。本质上,这允许受让人在模式中“查找”对象。没有此权限,仍然可以查看对象名称,例如通过查询系统表。此外,在撤销此权限后,现有后端可能具有之前执行过此查找的语句,因此这不是防止对象访问的完全安全的方法。

这意味着,除非alice足够努力,否则以下内容将满足您的要求:

CREATE SCHEMA invisible; -- no privileges granted on this schema to alice or public

CREATE VIEW invisible.iamnothere AS SELECT 'something not very interesting'::text AS data;

GRANT SELECT ON TABLE invisible.iamnothere TO alice;
Run Code Online (Sandbox Code Playgroud)

现在alice将看到以下内容(使用psql,希望其他客户端也一样):

SELECT * FROM invisible.iamnothere;
              data              
????????????????????????????????
 something not very interesting

\dt invisible.*
No matching relations found.
Run Code Online (Sandbox Code Playgroud)

如果你是认真的

...关于防止您的用户看到其他对象,它会稍微复杂一些。您必须处理有关系统表访问的文档中的通知。

首先,做

REVOKE ALL ON ALL TABLES IN SCHEMA  pg_catalog FROM public, alice;
Run Code Online (Sandbox Code Playgroud)

正如它所暗示的那样,这对能够通过隐式成为其中成员public(所有角色都是后者的成员)来浏览模式的任何人来说都是破坏性的。要恢复他们的现状(但不是alice),您可以执行以下操作:

CREATE ROLE object_browser;

GRANT SELECT ON ALL TABLES IN SCHEMA pg_catalog TO object_browser;

GRANT object_browser TO bob;
Run Code Online (Sandbox Code Playgroud)

在此之后,bob将能够列出内容,而pooralice仅限于查询该单个视图。

  • @Abelisto :D 在我的实践中,即使是经验丰富的开发人员有时在数据库方面也没有想法。现在我添加了一个更严格的解决方案,它不是那么容易规避的——除非 Alice 旁边的同事可以列出对象。此外,不要犹豫,使用 FDW 添加解决方案。 (2认同)