如何在雪花中创建一个表,但防止在同一角色下删除它?
Posted
技术标签:
【中文标题】如何在雪花中创建一个表,但防止在同一角色下删除它?【英文标题】:How to create a table in Snowflake, but prevent dropping it under the same role? 【发布时间】:2020-08-31 13:33:24 【问题描述】:我们已经构建了一个流式管道,当它们在源系统中创建时,它有权在雪花中创建新表。 (在角色 PROD_EL_ROLE 下运行)
即使我们启用了时间旅行'用于备份',我还是想防止 PROD_EL_ROLE 本身能够'意外地' DROP 表。 AFAIK,这不能直接完成,因为雪花中表的创建者也是所有者,因此也允许删除表
我还尝试将所有者转移到我们的 RBAC 层次结构 (PROD_SYSADMIN_ROLE) 中的另一个角色更高。不幸的是,这仅通过使用 REVOKE GRANTS 起作用,这不是我们想要的,因为在 PROD_EL_ROLE 下创建表时,各种权限是由各种 FUTURE GRANTS 自动创建的。而且我们显然不想删除它们。
如果我使用 COPY GRANTS,它不起作用,因为 PROD_EL_ROLE 没有 MANAGE GRANTS 权限。这是我们显然不想给予给 PROD_EL_ROLE 的赠款...... 我只想防止表被 PROD_EL_ROLE 丢弃
知道如何解决这个问题吗?
【问题讨论】:
是否可以利用 PROD_SYSADMIN_ROLE 在您的工作流程中最初创建表?您可以将角色切换为工作流程的一部分,仅用于表生成语句,然后使用 PROD_EL_ROLE 进行进一步的 DML?不理想,但我认为它会起作用。 从技术上讲这是可能的@MikeWalton,但是我们遇到了同样的问题:PROD_SYSADMIN_ROLE 有权创建和删除任何表/然后我们需要包括让我们的流媒体在PROD_SYSADMIN_ROLE。然后我们有同样的问题。我们想要的是流媒体代码,它只能创建表,而不能丢弃...... 如果您的角色只在自动化工作流中创建表,那么该角色删除表的风险是什么?我只是想找到问题的根源,因为创建的任何对象都归创建者所有,并且可以被创建者删除,那么您需要隔离创建者,或者在对象已创建。 另外,根据您关于 COPY GRANTS 的帖子,您可以使用 PROD_SYSADMIN_ROLE 来授予桌子上的所有权吗?您可以授予该角色管理架构中授权的能力(或使用托管架构)。这也可能奏效。 嗨@mike,风险是双重的:1)有人犯了编码错误,不小心把所有表都放在了prod中。不会是历史上第一次发生这种情况:)。 2)接管登录/攻击点/安全风险。所以我确实想做的是将所有权从创建表的同一角色转移到另一个角色。但这在某种程度上是不可能的(保留所有其他现有赠款,不包括所有权 【参考方案1】:要遵循 DAC 概念,您拥有创建的对象,然后您可以自定义授予它的权限,因此无法阻止删除它,除非同一 RBAC 层次结构中的更高角色声明所有权,并授予对象的部分或全部权限到那个角色。
因此,根据您的要求,另一个单独的进程/用户需要使用 PROD_SYSADMIN_ROLE 来声明对象所有权并将该对象上的所有 PRIVILEGES 授予角色 PROD_EL_ROLE
USE ROLE PROD_SYSADMIN_ROLE;
grant ownership on ALL TABLES in SCHEMA TESTDB.TESTSCHEMA
TO ROLE PROD_SYSADMIN_ROLE;
grant ALL PRIVILEGES on ALL TABLES in SCHEMA TESTDB.TESTSCHEMA
TO ROLE PROD_EL_ROLE;
现在角色 PROD_EL_ROLE 可以执行所有 DML 操作,但不能再次对其执行 DDL 操作(删除/修改对象的定义)。
【讨论】:
以上是关于如何在雪花中创建一个表,但防止在同一角色下删除它?的主要内容,如果未能解决你的问题,请参考以下文章