PostgreSQL用户/角色是否仅限于查看视图?

3

我需要授予客户对我的数据库中一组“视图”的访问权限。我已经成功地使用户/角色可以针对所需的视图进行SELECT操作,而不是任何表格。但是,用户/角色仍然可以浏览模式,并查看表格和表格列以及数据类型等等。有没有一种方法可以防止这种情况发生?如果用户/角色使用PgAdmin III或psql或类似的东西访问数据库,他们只能“看到”授权视图,而不会看到其他任何内容吗?


2
那么问题是什么?他们仍然无法从表中进行选择。 - user330315
我们不希望他们能够看到实际的表格。这涉及到IP和安全方面的考虑。 - n8gard
我理解你认为有一个原因。但我对这个原因提出质疑,因为我不认为它会给你带来额外的安全保障。请搜索Postgres邮件列表,这个问题经常被问到。 - user330315
1
@a_horse_with_no_name 我们有一些承包商,出于保护与我们的应用程序相关的知识产权的原因,我们不想向他们公开我们的模式。从我们的表结构中可以学到很多关于我们如何做事情的信息,我们不希望竞争对手获得这些信息。 - n8gard
2
当 pgAdmin 无法访问 information_schema 或 pg_catalog 时,它将无法工作。表和视图都存储在 pg_catalog 中,为了显示视图的可用性,pgAdmin 必须读取 pg_catalog 中的 pg_class。如果只允许查看数据而不是架构,请使用其他软件。 - Frank Heikens
显示剩余2条评论
3个回答

1

如果您希望承包商能够访问视图但不能查看视图所绘制数据的表结构,那么唯一的选择是将这些视图实例化为实际的表(例如使用CREATE TABLE AS SELECT ...),然后将其转储并恢复到您不信任的承包商可以访问的数据库中。

您的应用程序可能是 Web 应用程序或类似应用程序,不会使数据库登录数据暴露给用户;否则,您将面临比此问题更大的问题。


1

我认为你无法阻止承包商查看类型。问题在于这些类型存储在同一系统表中,如果您撤销对这些表的权限,我非常担心会发生什么事情。实际上,我怀疑什么都不会起作用。

PostgreSQL没有限制访问类型定义的概念。

但是,您可以通过限制对表的选择访问来防止他们从表中选择数据。视图在定义它们的用户的本地权限下运行。您可以在基础表上撤销权限,并使其仍然可以访问视图中的数据。但是,您无法阻止他们查看基础表的类型定义。

换句话说,更面向对象的方式,您不能安全地允许PostgreSQL用户查看您的类定义。但是,您可以防止他们查看实际对象。

编辑:我知道的唯一受此限制的系统目录是包括加密密码的目录。大多数系统目录相对开放,很多代码需要具有对这些目录的权限。鉴于PostgreSQL的对象行为,我认为您无法限制对函数定义(在编译环境中,这不是源代码,而是包括例程的共享对象文件)或类型定义(包括表结构)的访问。

编辑2:实际上有一个单一的好答案,那就是不要通过直接工具(如psql)给承包商访问数据库的权限,而是要求他们通过你控制的某些中间件进行访问。然后,你可以完全控制他们能看到什么或不能看到什么。例如,如果你想要的话,你可以修改phppgadmin以拒绝显示pg_catalog模式中的任何内容。但这是hack-the-tool领域,你不想在系统表权限上瞎搞。


1

如果您想避免在物化视图中重复所有数据..

您可以设置另一个数据库 - 在不同的群集中,因此它不共享相同的目录。这甚至可以在不同的机器上。

  • 通过dblink访问主数据库中的视图。
  • 仅允许通过dblink访问主数据库以定义用户,客户无法访问。
  • 创建访问主服务器上数据的表函数。
  • 提供从这些表函数选择的视图,并允许您的客户用户进行SELECT

现在他们根本无法访问基本表。


这非常有趣。谢谢。我正在研究这个。如果可以的话,我可能会有进一步的问题。上面的四个要点对于我来说并不是很清楚,关于这一切是如何运作的。 - n8gard

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