访问控制概述

本主题提供有关 Snowflake 中主要访问控制主题的信息。

访问控制框架

Snowflake 的访问控制方法结合了以下模型的各个方面:

  • 自主访问控制 (DAC): 每个对象都有一个所有者,所有者可以授予对象访问权限。

  • 基于角色的访问控制 (RBAC): 访问权限分配给角色,角色分配给用户。

  • 基于用户的访问控制 (UBAC): 将访问权限直接分配给用户。仅当 USE SECONDARY ROLE 设置为 ALL 时,访问控制才考虑将权限直接分配给用户。

有关次要角色的更多信息,请参阅 USE SECONDARY ROLES通过主要角色和次要角色进行授权

理解 Snowflake 中访问控制的几个关键概念包括:

  • 安全对象: 可以向其授予访问权限的实体。除非获得授权,否则拒绝访问。

  • 角色: 可授予权限的实体。

  • 权限: 对象的定义访问级别。可以使用多项不同的权限来控制授予的访问权限粒度。

  • 用户: Snowflake 识别的用户身份,无论是与个人还是服务有关。用户也是可以授予权限的实体。

在 Snowflake 中,分配给角色或用户的权限允许访问安全对象。可以将角色分配给用户或其他角色。将一个角色授予另一个角色会创建角色层次结构,详情请参见 角色层次结构和权限继承。通常,在 Snowflake 中可以使用 RBAC 来管理对安全对象的访问权限。

下图说明了 DAC、RBAC 和 UBAC 如何支持对不同的安全对象进行适当的权限分配。在此示例中,角色 1 具有对象 1 和对象 2 的 OWNERSHIP 权限。换句话说,角色 1 拥有这两个对象。这说明了 DAC。

可以将对象 1 的权限授予角色 2,然后可以将角色 2 授予用户 1 和用户 2。换句话说,用户 1 和用户 2 有权访问对象 1,但受这些权限的限制,因为这两个用户都被分配了角色 2。图的这一部分说明了 RBAC。

对象 2 的权限可以直接授予用户 3 和用户 4。图中的这一部分说明了如何使用 UBAC 来扩展 Snowflake 访问控制框架,从而提供大量控制权和灵活性。

访问控制关系

安全对象

每个安全对象都位于容器层次结构中的逻辑容器内。最顶层的容器是客户组织。表、视图、函数和暂存区等安全对象包含在架构对象中,而架构对象又包含在数据库中。Snowflake 账户的所有数据库都包含在账户对象中。对象和容器的层次结构如下图所示:

安全数据库对象的层次结构

拥有 对象表示 角色 拥有对象的 OWNERSHIP 权限。每个安全对象都归单个角色所有,默认情况下是用于创建对象的角色。当将此角色分配给用户时,他们实际上拥有对该对象的共享控制权。GRANT OWNERSHIP 命令允许您将对象的所有权从一个角色转让给另一个角色,包括转让给数据库角色。此命令还指定每个容器中的安全对象。

在常规架构中,所有者角色默认拥有对象的所有权限,包括向其他角色授予或撤销对象权限的能力。此外,所有权可以从一个角色转让给另一角色。但在 托管访问架构 中,对象所有者会失去做出授权决策的能力。仅架构所有者(即拥有架构 OWNERSHIP 权限的角色)或具有 MANAGE GRANTS 权限的角色可以授予架构中对象的权限。

就对象执行 SQL 操作的能力由授予用户会话中 活动角色 的权限定义。例如,如果您的会话中的活动角色已被授予特定 Snowflake 数据库架构中的 CREATE、USAGE、SELECT 和 WRITE 权限,则您可以创建仓库、列出包含的表,以及将数据添加到该架构中的表中。

角色

角色是可以向其授予和撤销对其安全对象的 权限 的实体。角色会分配给用户,以便他们执行组织中业务职能所需的操作。可为用户分配多个角色。这允许用户切换角色(即选择在当前 Snowflake 会话中处于活动状态的角色),以使用不同的权限集执行不同的操作。

Snowflake 账户中有少量 系统定义的角色。无法删除系统定义的角色。此外,无法撤销 Snowflake 授予这些角色的权限。

为满足特定的业务和安全需求,被授予具有必要权限的角色的用户可以创建 自定义角色

还可以将角色授予其他角色,从而创建角色层次结构。与某个角色相关联的权限由层次结构中该角色之上的任何角色继承。有关角色层次结构和权限继承的更多信息,请参阅 角色层次结构和权限继承

备注

角色所有者(拥有该角色 OWNERSHIP 权限的角色) 会继承所拥有角色的权限。权限继承只能在角色层次结构中进行。

尽管可以向系统定义的角色授予附加权限,但不建议这样做。系统定义的角色是使用与账户管理相关的权限创建的。作为最佳实践,建议不要同时赋予同一角色账户管理权限和特定于实体的权限。如果需要附加权限,Snowflake 建议向自定义角色授予附加权限,并将自定义角色分配给系统定义的角色。

小技巧

您可以使用组织用户组在组织内跨账户实现一致的角色。有关更多信息,请参阅 组织用户

角色类型

以下角色类型的范围有所不同,使管理员能够授权和限制对账户中对象的访问。

备注

除非产品文档中另有说明,否则术语 角色 可以指任一类型。

账户角色:

若准许对您账户中的 任何 对象执行 SQL 操作,则需将对象的权限授予账户角色。

数据库角色:

若将 SQL 操作限制为在单个数据库以及数据库中的任何对象,则需将对象的权限授予 同一数据库 中的数据库角色。

请注意,数据库角色无法在会话中直接 激活。将数据库角色授予账户角色,账户角色在会话中可激活。

有关数据库角色的更多信息,请参阅:

实例角色:

若要允许访问 的实例,则需将实例角色授予账户角色。

一个类可以有一个或多个类角色,每个角色被授予不同的权限。在创建类实例时,可以将实例角色授予账户角色,以便授予访问实例方法的权限。

请注意,实例角色无法在会话中直接 激活。将实例角色授予账户角色,账户角色在会话中可激活。

有关更多信息,请参阅 实例角色

应用程序角色:

要启用使用者对 Snowflake Native App 中对象的访问,提供商创建应用程序角色,并在 设置脚本 中向应用程序角色授予权限。

System application roles:

To support specific functionality for a particular feature, such as granting access to objects in which Snowflake is the owner, Snowflake can provide one or more system application roles. You can grant the system application roles to account roles at your discretion.

系统应用程序角色在特定功能的上下文中讨论,因为该特定功能是可以使用系统应用程序角色的唯一位置。例如:

服务角色:

要允许角色访问服务端点,请将服务角色授予该角色。您可以将服务角色授予账户角色、应用程序角色或数据库角色。有关更多信息,请参阅 管理与服务相关的权限

活动角色

活动角色 是用户在会话中执行任何操作的授权来源。主要角色和任何次要角色 都可以在用户会话中激活。

角色可通过以下任一方式成为活动角色:

  • 首次建立会话时,用户的默认角色和默认次要角色分别激活为会话主要角色和次要角色。

    请注意,用于建立会话的客户端连接属性可以显式替换要使用的主要角色或次要角色。

  • 执行 USE ROLEUSE SECONDARY ROLES 语句可分别激活不同的主要角色或次要角色。如果再次执行任一命令,这些角色可能会在会话过程中发生变化。

系统定义的角色

GLOBALORGADMIN:

(又名组织管理员)

执行组织级任务的角色,如管理账户生命周期和查看组织级使用信息。该角色只存在于 组织账户 中。

ORGADMIN:

使用常规账户管理组织级操作的角色。ORGADMIN 角色将在未来的版本中逐步淘汰,因此鼓励组织管理员改用 GLOBALORGADMIN 角色。

ACCOUNTADMIN:

(又名账户管理员)

封装 SYSADMIN 和 SECURITYADMIN 系统定义的角色的角色。它是系统中的顶级角色,应仅授予您账户中有限/受控数量的用户。

SECURITYADMIN:

(又名安全管理员)

可以全局管理任何对象授权以及创建、监控和管理用户和角色的角色。更具体地说,这个角色:

  • 被授予 MANAGE GRANTS 安全权限,能够修改任何授权,包括撤销该权限。

    备注

    MANAGE GRANTS 权限提供了授予和撤销权限的能力。SECURITYADMIN 不具备执行其他操作(如创建对象)的能力。要创建对象,还必须授予 SECURITYADMIN 角色创建对象所需的权限。例如,要创建数据库角色,还必须授予 SECURITYADMIN CREATE DATABASE ROLE 权限,如 CREATE DATABASE ROLE 访问控制要求 中所述。

  • 通过系统角色层次结构(即将 USERADMIN 角色授予 SECURITYADMIN)继承 USERADMIN 角色的权限。

USERADMIN:

(又名用户和角色管理员)

仅专用于用户和角色管理的角色。更具体地说,这个角色:

  • 被授予 CREATE USER 和 CREATE ROLE 安全权限。

  • 可以在账户中创建用户和角色。

    该角色还可以管理它拥有的用户和角色。仅拥有对象 OWNERSHIP 权限的角色(即用户或角色)或更高级别的角色可以修改对象属性。

SYSADMIN:

(又名系统管理员)

有权在账户中创建仓库和数据库(以及其他对象)的角色。

如果您按照 建议 创建角色层次结构,最终将所有自定义角色分配给 SYSADMIN 角色,那么该角色还具有将仓库、数据库和其他对象的权限授予其他角色的能力。

PUBLIC:

自动授予账户中每个用户和角色的伪角色。PUBLIC 角色可以拥有安全对象,就像任何其他角色一样;但是,根据定义,该角色拥有的对象可供您账户中的所有其他用户和角色使用。

此角色通常用于不需要显式访问控制以及所有用户的访问权限都被视为平等的用例。

自定义角色

可以使用 USERADMIN 角色(或更高级别的角色)和获授了 CREATE ROLE 权限的任何角色创建自定义 账户角色

自定义数据库角色可以由数据库所有者(即具有数据库 OWNERSHIP 权限的角色)创建。

默认情况下,新创建的角色不会分配给任何用户,也不会授予任何其他角色。

在系统中创建充当安全对象所有者的角色时, Snowflake 建议创建自定义角色的层次结构,并将最顶层的自定义角色分配给系统角色 SYSADMIN。这种角色结构允许系统管理员管理账户中的所有对象,例如仓库和数据库对象,同时将用户和角色的管理限制为 USERADMIN 角色。

相反,如果未通过角色层次结构将自定义角色分配给 SYSADMIN,则系统管理员无法管理角色拥有的对象。只有那些获授了 MANAGE GRANTS 权限的角色(默认仅 SECURITYADMIN 角色)可以查看对象并修改其访问授权。

有关创建自定义角色的说明,请参阅 创建自定义角色

权限

访问控制权限决定了谁可以访问 Snowflake 中的特定对象并对其执行操作。每个安全对象都有一组可向其授予的权限。对于现有对象,必须向各个对象授予权限(例如 mytable 表的 SELECT 权限)。为了简化授权管理,未来的授权 允许为在架构中创建的对象定义一组初始权限(即将在 myschema 架构中创建的所有 表的 SELECT 权限授予指定角色)。

权限使用以下命令进行管理:

在常规(即非托管)架构中,这些命令的使用仅限于拥有对象的角色(即拥有对象的 OWNERSHIP 权限)或拥有对象的 MANAGE GRANTS 全局权限的任何角色或用户(默认仅 SECURITYADMIN 角色)。

托管访问架构 中,对象所有者会失去做出授权决策的能力。只有架构所有者或拥有 MANAGE GRANTS 权限的角色才能授予架构中对象的权限,包括未来的授权,从而集中进行权限管理。

请注意,拥有全局 MANAGE GRANTS 权限的角色可以授予当前(授予者)角色附加权限。

有关更多详细信息,请参阅 访问控制权限

角色层次结构和权限继承

下图说明了系统定义的角色的层次结构,以及其他用户定义的账户角色和数据库角色的建议结构。示例层次结构中的最高级别数据库角色被授予自定义(用户定义的)账户角色。接着,该角色被授予建议结构中的另一个自定义角色,该结构允许系统定义的 SYSADMIN 角色继承自定义账户角色和数据库角色的权限:

角色层次结构示例

备注

ORGADMIN 是一个单独的系统角色,用于管理组织级别的操作。该角色不包含在系统角色的层次结构中。

有关角色层次结构和权限继承的更具体示例,请考虑以下场景:

  • 角色 3 已授予角色 2。

  • 角色 2 已授予角色 1。

  • 角色 1 已授予用户 1。

已授予角色的权限继承

在这种情况下:

  • 角色 2 继承权限 C。

  • 角色 1 继承权限 B 和 C。

  • 用户 1 拥有所有这三项权限。

有关创建角色层次结构的说明,请参阅 创建角色层次结构

数据库角色和角色层次结构

目前,以下限制适用于数据库角色:

  • 如果授予数据库角色 共享,则不能向该数据库角色授予其他数据库角色。例如,如果授予数据库角色 d1.r1 共享,那么尝试将数据库角色 d1.r2 授予 d1.r1 时将被阻止。

    此外,如果向 其他 数据库角色授予数据库角色 ,则不能向被授予的数据库角色授予共享。

    可以将获授共享的数据库角色授予其他数据库角色和账户角色。

  • 账户角色不能授予角色层次结构中的数据库角色。

通过主要角色和次要角色进行授权

每个活动用户会话都有一个“当前角色”,也称为 主要角色。在会话启动(例如用户使用 JDBC/ODBC 连接或登录 Snowflake Web 界面)时,当前角色根据以下标准确定:

  1. 如果已将某个角色指定为连接的一部分,并且该角色是已授予连接用户,则指定的角色将成为当前角色。

  2. 如果未指定角色并且已为连接用户设置了默认角色,则该角色将成为当前角色。

  3. 如果未指定角色且没有为连接用户设置默认角色,则使用系统角色 PUBLIC。

要查看会话的当前角色,请执行 CURRENT_ROLE 函数。

此外,可以在用户会话中激活一组 次要 角色。用户可以使用授予主要角色和次要角色的聚合权限对会话中的对象执行 SQL 操作。将角色授予用户,然后才能在会话中激活这些角色。请注意,虽然会话一次必须只有一个活动主要角色,但可以同时激活任意数量的次要角色。

备注

数据库角色既不能是主要角色,也不能是次要角色。要获得授予数据库角色的权限,请将数据库角色授予账户角色。只有账户角色可以在会话中 激活

只有主要角色才有执行 CREATE <object> 语句的授权。创建对象时,其所有权将设置为当前活动的主要角色。然而,对于任何其他 SQL 操作,授予任何活动主要或次要角色的任何权限都可以用于授权该操作。例如,如果次要角色层次结构中的任何角色拥有一个对象(即具有对象的 OWNERSHIP 权限),则次要角色将授权对对象执行任何 DDL 操作。主要角色和所有次要角色都继承其角色层次结构中较低角色的权限。

主要角色和次要角色操作

对于安全模型包含大量角色且每个角色都通过权限定义细粒度授权的组织来说,使用次要角色可以简化角色管理。授予用户的所有角色都可以在会话中激活。次要角色特别适用于跨数据库联接等 SQL 操作,否则需要创建有权访问每个数据库中的对象的角色的父角色。

在会话过程中,您可以分别执行 USE ROLEUSE SECONDARY ROLES 命令更改当前的主要或次要角色。您可以使用 CURRENT_SECONDARY_ROLES 函数显示当前会话的所有活动次要角色。

如果您创建需要一项或多项权限才能使用的对象,那么在搜索这些权限的授予时,仅考虑主要角色及其直接或间接继承的角色。

对于任何其他需要一项或多项权限的语句(例如查询表需要对表具有 SELECT 权限,同时需要对数据库和架构具有 USAGE 权限),在搜索这些权限的授予时,会考虑主要角色、次要角色以及任何其他继承的角色。

备注

Snowflake 中不存在可以绕过授权检查的“超级用户”或“超级角色”概念。所有访问都需要适当的访问权限。

语言: 中文