限制对 Redshift 表的访问,仅授予对视图的访问权限

Posted

技术标签:

【中文标题】限制对 Redshift 表的访问,仅授予对视图的访问权限【英文标题】:Restrict access to Redshift tables, only grant access to a View 【发布时间】:2019-10-10 16:14:05 【问题描述】:

在 AWS 上使用 Redshift。我们有一个数据库,其中包含我们想要向客户展示的视图。使我们的各种基础表看起来像一个大型超级表(客户要求)的视图。这是一组不断更新的大数据,因此拍摄快照并将其复制到某处不是一种选择……除非每隔几分钟就有一些非常快速的方法。

我们不希望客户看到我们的基础表。不仅阻止他们查询这些表,而且看不到它们甚至存在。 GRANT 似乎无法做到这一点。

还有其他方法可以防止看到这些基础表名吗?或者,也许可以通过一些巧妙的解决方法将视图暴露在与基础表不同的数据库中。似乎不可能有一个视图引用另一个数据库,但这就是我在这里寻求想法的原因:)

【问题讨论】:

您应该能够撤消该数据库用户对所有表的访问权限,然后授予对 VIEW 的访问权限。有关示例,请参阅:PostgreSQL Privileges and Security - Locking Down the Public Schema | Severalnines(Redshift 基于 PostgreSQL)。 我相信你是对的,你不能阻止他们看到表名。 【参考方案1】:

您可以使用存储过程。

"对于细粒度的访问控制,您可以创建存储过程来执行功能,而无需授予用户对基础表的访问权限。例如,只有所有者或超级用户才能截断表,并且用户需要写入权限才能向表中插入数据。您可以创建一个执行该任务的存储过程,而不是授予用户对基础表的权限。然后授予用户运行该存储过程的权限。

具有 DEFINER 安全属性的存储过程以存储过程所有者的权限运行。默认情况下,存储过程具有 INVOKER 安全性,这意味着该过程使用调用该过程的用户的权限。"

【讨论】:

【参考方案2】:

假设您在 db1 中有数据和表。

因此,您在 db1 中创建了一个模式(s1)并基于 db1 中的表创建所有视图。然后创建一个角色,如 db1_s1_reader ,具有模式 s1 的读取访问权限,并将该角色分配给所有想要读取数据的用户。如果用户已经拥有数据访问权限,请从 db1 向用户发布此撤销访问权限。

【讨论】:

以上是关于限制对 Redshift 表的访问,仅授予对视图的访问权限的主要内容,如果未能解决你的问题,请参考以下文章

将 Redshift 系统表的权限授予非超级用户

授予对 Postgres 中所有表的访问权限

如何授予用户对系统表的有限访问权限?

如何授予 Redshift 中所有模式的使用权限?

ALTER SCHEMA NAME 是不是会影响对 Redshift 中架构的权限授予

如何授予 Amazon Redshift 用户读取系统表、视图、日志等的访问权限?