【问题标题】:How should I set up a power user role for a Snowflake database?我应该如何为 Snowflake 数据库设置高级用户角色?
【发布时间】:2020-02-28 19:44:36
【问题描述】:

基本上我想要

  1. 我的“DBA”用户;具有 SYSADMIN 和 ACCOUNTADMIN 角色的原始帐户,以便能够查看数据库中的任何对象及其数据。看来至少在 ACCOUNTADMIN 级别我应该能够做到这一点。
  2. “超级”用户;通过角色 (dr_uce_role),我可以在数据库级别进行分配,用户几乎可以在数据库中执行所有操作。

我以为我已经使用以下代码创建了超级用户角色:

--grant power to engineer
grant all privileges on database dr_ev to dr_uce_role;
grant all privileges on all schemas in database dr_ev to dr_uce_role;
grant all privileges on all tables in schema dr_ev.public to dr_uce_role;
grant all privileges on all views in schema dr_ev.public to dr_uce_role;
grant select on future tables in schema dr_ev.public to dr_uce_role;
grant select on future views in schema dr_ev.public to dr_uce_role;
grant all privileges on all tables in schema dr_ev.stg to dr_uce_role;
grant all privileges on all views in schema dr_ev.stg to dr_uce_role;
grant select on future tables in schema dr_ev.stg to dr_uce_role;
grant select on future views in schema dr_ev.stg to dr_uce_role;

该用户随后在模式中创建了对象。然而,我在 SYSADMIN 的“DBA”用户根本看不到这些对象。使用角色 ACCOUNTADMIN,用户可以查看对象,但不能查询它们。我的理解是 ACCOUNTADMIN 是顶级帐户,无论如何都可以拥有这些对象的所有权,所以如果这应该是一个安全功能,我真的不明白它是如何提供很多保护的,因为它总是可以窃取所有权?

我尝试将一个对象的所有权从 ACCOUNTADMIN 更改为 SYSADMIN,发现它具有阻塞权限;

grant ownership on dr_ev.stg.load_opportunity to sysadmin;

SQL 执行错误:存在从安全的“DR_EV.STG.LOAD_OPPORTUNITY”到角色“DR_UCE_ROLE”的相关权限“DELETE”授予。必须先撤销。可能存在多个相关授权:使用“SHOW GRANTS”命令查看它们。要在转移对象所有权时撤销所有相关授权,请使用便捷命令“GRANT OWNERSHIP ON TO REVOKE CURRENT GRANTS”。`

我尝试过拥有所有权

grant ownership on all tables in schema dr_ev.stg to sysadmin revoke current grants;

确实有效 - 尽管它让我的高级用户无法看到这些对象。所以我给了他们

grant all privileges on all tables in schema dr_ev.stg to dr_uce_role;

但是,我希望我的高级用户能够创建或替换此表。我相信这需要 DROP TABLE 特权,尽管我的高级用户授权显然没有提供它,而且我不清楚我应该如何提供它?

我不会说我对 Snowflake 权限有最深的了解,我想知道上面的语句(如 grant all privileges on all tables in schema)是否不存在于架构级别以全面适用于所有表,但实际上设置了对象级别权限和我的原始方法只是太细化了,因为我实际上并不希望在对象级别管理任何东西。话虽如此,如果该语句实际上只是设置许多对象权限的快捷方式,我在文档中不清楚如何在比对象更高的级别上进行管理。我怎样才能实现我最初的目标?

【问题讨论】:

    标签: snowflake-cloud-data-platform


    【解决方案1】:

    此类情况的最佳做法是将所有自定义角色授予 SYSADMIN 角色。这允许系统管理员执行 SYSADMIN 可以执行的所有操作以及所有其他角色可以执行的所有操作。您的帖子中有很多问题,但我认为这可以解决很多问题。

    【讨论】:

    • 谢谢 - 这实际上听起来像一个非常简单的好解决方案,肯定会解决#1。这是雪花的典型方法吗?这确实听起来像是一个最佳实践。我想知道如果我尝试创建 2 个 db“power”组并且一个创建对象而另一个尝试删除它,我是否会遇到与原始帖子中相同的所有权问题;尽管我认为该层次结构的正确结构可能是创建特权权力角色,然后将该角色授予 groupA 和 groupB。
    • 需要后面的注释,因为只有所有者角色才能删除对象。理想情况下,我建议让一个角色控制您的 DDL,然后其他角色操作、加载等数据。有时这是不可行的,但那是你的理想状态。如果您需要 2 个不同的角色来控制它,那么您可以将它们中的每一个授予彼此。不过,到那时,您还不如只有一个角色。 Snowflake RBAC 为您的设计提供了很大的灵活性,但您必须仔细考虑。
    【解决方案2】:

    我所做的方法是创建一个超级角色“superole”并将 sysadmin、securityadmin 和 accountadmin 授予该角色。然后我将超级角色附加给我想成为我的 DBA 的任何人......

    【讨论】:

    • 啊。这听起来像是创建一个真正的顶级管理员帐户的好方法,而不必改变自己的角色来查看内容。
    猜你喜欢
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2015-02-21
    • 2012-03-16
    • 1970-01-01
    • 2022-01-22
    • 2016-03-30
    • 2012-03-08
    相关资源
    最近更新 更多