PostgreSQL/Redshift-阻止访问系统视图

PostgreSQL/Redshift-阻止访问系统视图,postgresql,amazon-redshift,Postgresql,Amazon Redshift,我正在使用基于PostgreSQL的Redshift,需要创建一个仅限于特定数据库模式的用户。它们还需要被锁定在系统视图之外。我在数据库群集上运行了以下操作: revoke create on schema information_schema from public revoke usage on schema information_schema from public revoke create on schema pg_catalog from public revoke usage

我正在使用基于PostgreSQL的Redshift,需要创建一个仅限于特定数据库模式的用户。它们还需要被锁定在系统视图之外。我在数据库群集上运行了以下操作:

revoke create on schema information_schema from public
revoke usage on schema information_schema from public

revoke create on schema pg_catalog from public
revoke usage on schema pg_catalog from public

revoke create on schema public from public
revoke usage on schema public from public
接下来,我创建一个用户并作为该用户运行:

SET SESSION AUTHORIZATION someUser
然后我尝试访问一些系统视图:

select * from information_schema.tables
执行SQL命令时出错: 从信息_schema.tables中选择* 错误:架构信息的权限被拒绝\u架构[SQL State=42501]

执行SQL命令时出错: 从pg_catalog.pg_用户中选择* 错误:架构pg_目录[SQL State=42501]的权限被拒绝

到目前为止还不错-用户无法在系统视图中随意查看

但由于某种原因,当我运行以下程序时,它成功了:

select * from pg_user
换句话说,如果用户试图在不指定pg_目录模式的情况下查询pg_用户,则他们能够在系统中看到用户


关于如何防止这种情况,您有什么想法吗?

我认为您需要取消每个视图的特权。好的,这种方法确实有效。我刚刚运行了以下命令以在所有pg|U目录视图上生成一个REVOKE ALL FROM PUBLIC:选择“REVOKE ALL on”| | viewname | | FROM PUBLIC;'从pg_视图,其中schemaname='pg_catalog'。我不必在pg_目录表上这样做,因为我之前在pg_目录模式上做的撤销处理了这些。出于某种原因,pg_目录视图需要显式撤销。谢谢您的建议。@RedTailedHawk如果您有权从视图中选择,则在通过视图进行选择时,您有权选择视图引用的所有表。这就是为什么即使已经撤销了对基础表的直接访问,也必须从视图中撤销。
select * from pg_user