授权用户只能访问 PostgreSQL 中的一个模式

5

我有一个名为just_one_schema_user的用户。

在我的数据库中,我有两个模式:publicsample

如何使这个用户只能看到sample

这是我所做的:

GRANT USAGE ON SCHEMA sample TO just_one_schema_user

REVOKE ALL PRIVILEGES ON SCHEMA public FROM just_one_schema_user

但是用户仍然可以列出public中的表并查看它们的结构。


我猜这不可能。所有结构信息都存储在模式pg_catalog中,您无法撤销对此模式的权限,因为用户将失去查找任何模式下对象的能力。 - Islingre
@Islingre,您对于 pg_catalog 是正确的。然而,问题是关于 public 的。 - Laurenz Albe
@LaurenzAlbe 是的。但只要我可以访问pg_catalog,我应该能够看到模式,不是吗?我不确定,但如果撤销其他模式的权限会影响对目录的查询,那我会感到惊讶。 - Islingre
哦,你是正确的,抱歉。 - Laurenz Albe
1个回答

2

关于访问表元数据:

正如Islingre所评论的那样,没有好的方法可以将这些信息从用户中隐藏。

你必须拒绝用户访问pg_classpg_namespacepg_proc等表。如果你将allow_system_table_mods设置为on,PostgreSQL将继续运行,但很多东西将不再工作:

  • 使用psql实用程序命令,如\d\dt

  • 其他工具的类似工具

  • 监控系统

基本上,你将无法再看到任何元数据了。

没有办法让用户只查看部分元数据,它要么全部显示,要么全部隐藏。

但这不是问题。没有充分的理由阻止任何人查看元数据--那是公共信息。

PostgreSQL并不认为这是一个安全问题。仅仅因为我知道有一个名为customer的表,其中包含一个名为credit_card_number的列,并不能让我更接近访问它,如果权限设置正确的话。

关于访问public中的对象:

撤销从未授予的权限将默默地不做任何操作。

在模式public上的USAGE权限被授予给PUBLIC,而不是just_one_schema_user

使用以下命令在psql中显示权限信息:

\dn+

你正在寻找:

REVOKE CREATE, USAGE ON SCHEMA public FROM public;

我建议不要将应用程序数据存储在public中,只存储扩展程序。然后不要撤销USAGE,只撤销CREATE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接