如何防止用户查看其他数据库和其他数据库中的表?

28
我想创建一个可以访问PostgreSQL服务器上仅有一个数据库的PostgreSQL用户。
目前我的流程是:
create database database1;
create user user1 with password 'pass';
grant all privileges on database database1 to user1;

但是user1仍然可以看到dbs,users,tables等列表。有没有办法防止该用户查看这些信息?该用户需要能够读写该数据库。

非常感谢。

3个回答

11
每个用户都可以看到其他数据库和角色列表,但不应该能够在其他数据库中查看表格。
如果您吊销除分配的那个之外的所有数据库的CONNECT权限,则用户将无法访问其他数据库的内容。
角色和数据库名称是全局的,不能轻易地屏蔽它们。您可以尝试使用Frank Heikens建议的选择性吊销系统表的方法,但这样做存在风险。PostgreSQL开发人员在usenet邮件列表上已经反对干扰系统目录访问。
Psql等工具假设系统表可用,并且在没有这些表的情况下功能较差。
为什么知道其他数据库和角色的名称会有什么不好呢?

5
用户将在我们这边创建数据库。为了保护数据隐私和安全,我们不希望用户能够看到彼此的数据库、表名等信息。 - Dan
4
当用户可以列出不属于他们的数据库中的表格时,这是件坏事。 - harmv
21
它提供了一些并非完全需要的数据。比如,名为“cicallc”的数据库可能表明“Cica Llc”是您的客户。接下来,名为“cicaalfresco”的数据库可能会显示他们与您有何关联。数据库的数量可能显示您的系统中有多少用户(=客户)。这是postgresql开发人员的一个概念性错误。普通用户应该处于这样一个环境中:只能访问他所需的内容,而不能访问多余的内容。 - peterh
2
@peterh-ReinstateMonica:“这是PostgreSQL开发人员的一个概念性错误”,确实如此;我无法相信他们会这么做。 这就像让所有用户(在任何系统中)的登录名对每个已登录的用户都可用一样。 - P Marecki
1
@PMarecki 注意,微软 SQL 也有同样的问题。MySQL 没有。 - peterh
显示剩余5条评论

3

1
最近的版本有没有更新这个问题呢? - viggy28
1
@viggy28:不,没有任何改变。当您允许用户连接到您的数据库时,该用户可以从您的数据库中获取(一些)信息。选择权在您手中。 - Frank Heikens
在对最新文档进行粗略检查后,information_schema视图已经更新并似乎已经纠正了问题,但系统目录仍然存在一个巨大的漏洞。例如,文档中说:“只显示当前用户有访问权限的表和视图(通过拥有者或某些特权)。” https://www.postgresql.org/docs/current/infoschema-tables.html 我还没有检查完整的细节,但这是朝着正确方向迈出的一步。撤销系统目录权限可能会影响像pgAdmin这样的工具,假设它们仍然依赖于系统视图。 - LMSingh

2

默认情况下,您创建的任何对象都会在公共模式中创建。此外,您创建的任何用户都具有对公共模式的CREATE和USAGE权限。您应该撤销此用户对公共模式的CREATE和USAGE权限,或更改默认访问级别。您还需要将此用户具有访问权限的数据库移动到用户的模式中,或者移动到用户可访问的模式中。请参阅Postgres手册中的DDL模式


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