Skip to content

SnowFlake权限概览

Info

作者:Vincent,发布于2021-10-11,阅读时间:约4分钟,微信公众号文章链接:

1 前言

​在数据库中正确管理对象(如数据库、表等)的权限非常重要,但却又常被人忽视,往往涉及到权限问题、碰到麻烦时,才会后悔当时没有认真对待权限管理。因此这篇文章将以非常火爆的SnowFlake数据仓库为例,简明扼要地讲解权限管理的重要概念和常用命令。建议点赞收藏,日后回顾使用!

2 SnowFlake权限控制框架

SnowFlake有两种权限控制模型:

  • Discretionary Access Control (DAC),自主访问控制:每一个对象(Object)有一个所有者(Owner),所有者能授予他人不同的权限。
  • Role-based Access Control (RBAC),基于角色的访问控制:访问权限由角色(Role)控制,角色可以分配给不同的用户(User)。

在SnowFlake里,有一些重要的概念帮助理解权限控制:

  • Securable object,安全对象,一个可以被授予特定权限的实体,如果没有权限,则对象的访问会被禁止。
  • Role,角色,一个可以接受权限的实体,角色又可以被分配给用户,同时角色也可以分配给其他角色,构成不同的角色阶层。
  • Privilege,权限:针对对象的访问控制水平。通过设置不同的权限,可以控制方位水平的粒度。
  • User,用户,能够被SnowFlake识别的身份,可以是人或者程序。

在SnowFlake里,关于安全对象的权限控制如下图所示。访问安全对象可以通过向角色赋予权限,即是把权限分配给了其他的角色或者对象。另外,每个安全对象有一个所有者,其可以授予其他角色权限。

SnowFlake权限控制示意图

3 常用的命令

基本了解SnowFlake如何管理权限后,使用命令去操作和查看命令就更加得心应手了。

3.1 授予权限

GRANT {  { globalPrivileges         | ALL [ PRIVILEGES ] } ON ACCOUNT
       | { accountObjectPrivileges  | ALL [ PRIVILEGES ] } ON { USER | RESOURCE MONITOR | WAREHOUSE | DATABASE | INTEGRATION } <object_name>
       | { schemaPrivileges         | ALL [ PRIVILEGES ] } ON { SCHEMA <schema_name> | ALL SCHEMAS IN DATABASE <db_name> }
       | { schemaPrivileges         | ALL [ PRIVILEGES ] } ON { FUTURE SCHEMAS IN DATABASE <db_name> }
       | { schemaObjectPrivileges   | ALL [ PRIVILEGES ] } ON { <object_type> <object_name> | ALL <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> } }
       | { schemaObjectPrivileges   | ALL [ PRIVILEGES ] } ON FUTURE <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> }
      }
  TO [ ROLE ] <role_name> [ WITH GRANT OPTION ]

其中:

globalPrivileges ::=
  { { CREATE { ROLE | USER | WAREHOUSE | DATABASE | INTEGRATION } } | APPLY MASKING POLICY | APPLY ROW ACCESS POLICY | APPLY TAG | EXECUTE TASK | MANAGE GRANTS | MONITOR { EXECUTION | USAGE }  } [ , ... ]

accountObjectPrivileges ::=
-- For USER
  { MONITOR } [ , ... ]
-- For RESOURCE MONITOR
  { MODIFY | MONITOR } [ , ... ]
-- For WAREHOUSE
  { MODIFY | MONITOR | USAGE | OPERATE } [ , ... ]
-- For DATABASE
  { MODIFY | MONITOR | USAGE | CREATE SCHEMA | IMPORTED PRIVILEGES } [ , ... ]
-- For INTEGRATION
  { USAGE | USE_ANY_ROLE } [ , ... ]

schemaPrivileges ::=
    { MODIFY | MONITOR | USAGE | CREATE { TABLE | EXTERNAL TABLE | VIEW | MATERIALIZED VIEW | MASKING POLICY | ROW ACCESS POLICY | TAG | SEQUENCE | FUNCTION | PROCEDURE | FILE FORMAT | STAGE | PIPE | STREAM | TASK } } [ , ... ]

schemaObjectPrivileges ::=
    -- For TABLE
      { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES } [ , ... ]
    -- For VIEW
      { SELECT | REFERENCES } [ , ... ]
    -- For MATERIALIZED VIEW
        SELECT
    -- For SEQUENCE, FUNCTION (UDF or external function), PROCEDURE, or FILE FORMAT
        USAGE
    -- For internal STAGE
        READ [ , WRITE ]
    -- For external STAGE
        USAGE
    -- For PIPE
       { MONITOR | OPERATE } [ , ... ]
    -- For STREAM
        SELECT
    -- For TASK
       { MONITOR | OPERATE } [ , ... ]
    -- For MASKING POLICY
        APPLY
    -- For ROW ACCESS POLICY
        APPLY
    -- For TAG
        APPLY

其所有权限的列表可以查看SnowFlake的API文档

必填参数有object_nameobject_typeobject_type_pluralrole_name,这些都很好理解,不再赘述。还可加上可选参数:

  • ON FUTURE:指定权限被授予在新的数据库或模式(schema)中的表或者视图,而非现有的对象。
  • WITH GRANT OPTION:指定是否允许接受权限的角色授予权限给其他角色。

示例如下:

# 通过with grant option指定角色继续赋予权限
grant operate on warehouse report_wh to role analyst with grant option;

# 权限授予一个模式(schema)中所有的表给role analyst
grant select on all tables in schema mydb.myschema to role analyst;

3.2 查看权限

通过使用SHOW GRANTS命令可以查看对象的权限,示例如下:

SHOW GRANTS ON ACCOUNT

SHOW GRANTS ON <object_type> <object_name>

SHOW GRANTS TO { ROLE <role_name> | USER <user_name> | SHARE <share_name> }

SHOW GRANTS OF ROLE <role_name>

SHOW GRANTS OF SHARE <share_name>

SHOW FUTURE GRANTS IN SCHEMA { <schema_name> }

SHOW FUTURE GRANTS IN DATABASE { <database_name> }

3.3 移除权限

移除权限的命令使用REVOKE关键字:

REVOKE [ GRANT OPTION FOR ]
    {
       { globalPrivileges         | ALL [ PRIVILEGES ] } ON ACCOUNT
     | { accountObjectPrivileges  | ALL [ PRIVILEGES ] } ON { RESOURCE MONITOR | WAREHOUSE | DATABASE | INTEGRATION } <object_name>
     | { schemaPrivileges         | ALL [ PRIVILEGES ] } ON { SCHEMA <schema_name> | ALL SCHEMAS IN DATABASE <db_name> }
     | { schemaPrivileges         | ALL [ PRIVILEGES ] } ON { FUTURE SCHEMAS IN DATABASE <db_name> }
     | { schemaObjectPrivileges   | ALL [ PRIVILEGES ] } ON { <object_type> <object_name> | ALL <object_type_plural> IN SCHEMA <schema_name> }
     | { schemaObjectPrivileges   | ALL [ PRIVILEGES ] } ON FUTURE <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> }
    }
  FROM [ ROLE ] <role_name> [ RESTRICT | CASCADE ]

必选参数和GRANT命令的相同,而可选参数有:

  • GRANT OPTION FOR:如指定,将不允许接收者再授予权限给其他角色。
  • ON FUTURE:如指定,将只会移除新对象的权限,授予在现有对象的权限仍然有效。
  • RESTRICT | CASCADE:取决于权限是否被授予了其他的角色,若使用CASCADE,则所有依赖的grant都会被移除,但使用RESTRICT时,如果权限被授予了其他的角色,则REVOKE命令不执行。

4 总结

上述内容概括了在SnowFlake里管理权限的重要内容,建议结合实际工作正确创建不同的角色、并分配给角色正确的权限。​必要时,请进一步查阅SnowFlake的官方文档

希望这次的分享对你有帮助,欢迎在评论区留言讨论!


Viewed times

Comments