PostgreSQL/Redshift-阻止访问系统视图
我正在使用基于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
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