【问题标题】:Revoke access from PostgreSQL User to see other tables撤销 PostgreSQL 用户的访问权限以查看其他表
【发布时间】:2020-09-30 19:27:42
【问题描述】:
我有一个 PostgreSQL 数据库用户“limited_user”,并且只想授予对一个表的 SELECT 权限。
GRANT CONNECT ON DATABASE "db1" TO limited_user;
GRANT SELECT ON TABLE users to limited_user;
当我尝试 \dt 时,用户可以看到这个 db1 中的所有其他表,而他可以在我授予权限的情况下对表“用户”执行 SELECT 操作。如何撤销对用户的访问权限,以便他不能看到其他表而只能看到一个表?
【问题讨论】:
标签:
database
postgresql
postgresql-9.5
【解决方案1】:
你不能,至少不能以我所知道的任何直接方式。
表存在于模式命名空间中,而模式存在于数据库中。授予用户访问特定表的权限意味着您还必须授予该用户对该表所属架构的USAGE 权限。 USAGE 不授予对表本身的权限,仅授予相关架构的权限。但是表定义 是模式的一部分,所以USAGE 确实允许用户查看表名(以及列)。
但是,如果同一架构中存在其他表,则用户将无法从这些表中SELECT,除非您也在这些表上GRANT SELECT,即使他们能够看到它们存在。
This answer对权限系统给出了相当清晰的解释。
编辑添加:
实现类似结果的一种方法是这样(使用psql):
sec_schema=# REVOKE ALL ON ALL TABLES IN SCHEMA sec_schema FROM restricted_user;
REVOKE
sec_schema=# REVOKE USAGE ON SCHEMA sec_schema FROM restricted_user;
REVOKE
sec_schema=# CREATE SCHEMA new_schema;
CREATE SCHEMA
sec_schema=# GRANT USAGE ON new_schema TO restricted_user;
GRANT
sec_schema=# CREATE VIEW new_schema.secret_view AS SELECT * from sec_schema.secret_table;
CREATE VIEW
sec_schema=# GRANT SELECT ON new_schema.secret_view TO restricted_user;
GRANT
这将删除用户restricted_user 对架构sec_schema 的所有访问权限,但随后会创建new_schema 和new_schema.secret_view,这是sec_schema.secret_table 的封面视图。在GRANT SELECT之后,用户将可以通过视图从表sec_schema.secret_table中读取数据,但他们将无法看到sec_schema中的任何对象。