配置访问控制¶
本主题介绍如何为您的账户中的 安全对象 配置访问控制安全性。
本主题内容:
账户管理¶
指定其他用户作为账户管理员¶
默认情况下,每个账户都有一个被指定为账户管理员的用户(即被授予系统定义的 ACCOUNTADMIN 角色的用户)。我们建议至少指定一名其他用户作为账户管理员。这有助于确保您的账户始终拥有至少一名可以执行账户级任务的用户,特别是在您的账户管理员之一无法登录的情况下。
对于这些其他账户管理员,您可以选择创建新用户或指定现有用户,但请确保指定以下内容:
向用户授予 ACCOUNTADMIN 角色,但 不要 将此角色设置为默认角色。相反,指定一个较低级别的管理角色(例如 SYSADMIN)或自定义角色作为默认角色。这有助于防止账户管理员无意中使用 ACCOUNTADMIN 角色创建对象。
确保为每个用户指定电子邮件地址(多重身份验证所需)。
例如,将 ACCOUNTADMIN 和 SYSADMIN 角色授予名为 user2
的现有用户,并将 SYSADMIN 指定为默认角色:
GRANT ROLE ACCOUNTADMIN, SYSADMIN TO USER user2; ALTER USER user2 SET EMAIL='user2@domain.com', DEFAULT_ROLE=SYSADMIN;
为每个账户管理员启用 MFA¶
为了确保您的 Snowflake 账户的最高安全级别,我们 强烈 建议要求任何可以修改或查看敏感数据的用户使用多重身份验证 (MFA) 进行登录。
此建议特别适用于具有 ACCOUNTADMIN 角色的用户,但也可以扩展到包括具有 SECURITYADMIN 和 SYSADMIN 角色的用户。
有关更多详细信息,请参阅 访问控制注意事项 和 MFA(多重身份验证)。
创建自定义角色¶
为了遵循“最低权限”的一般原则,我们建议创建与您组织中的 业务职能相一致的 自定义角色,以允许对一组范围较小的安全对象执行 SQL 操作。
您可以使用 Snowsight 或 SQL 创建自定义角色。
工作流程如下:
创建自定义角色。
向角色授予一组权限。
将角色授予一个或多个需要授予该角色的权限的用户,以执行满足其业务需求的 SQL 操作。
将角色授予另一个角色以创建或添加到角色层次结构。虽然不是必需的,但强烈建议执行此步骤。有关更多信息,请参阅 创建角色层次结构 (本主题内容)。
本节提供创建名为 r1
的角色以及向该角色授予以下权限的说明。这些权限允许在会话中激活角色的用户查询单个表, d1.s1.t1
:
权限 |
对象 |
备注 |
---|---|---|
USAGE |
仓库 数据库 架构 |
要查询对象(例如表或视图),角色必须对仓库具有 USAGE 权限。仓库提供执行查询的计算资源。 要对架构中的任何对象进行操作,角色必须对容器数据库和架构具有 USAGE 权限。 |
SELECT |
表 |
创建角色后,可以向其授予额外的权限,以允许拥有该角色的用户对同一对象或其他对象执行额外的 SQL 操作。
创建角色¶
只有用户管理员(即拥有 USERADMIN 系统角色或更高角色的用户)或对账户拥有 CREATE ROLE 权限的其他角色才能创建角色。
- SQL:
使用 CREATE ROLE 语句创建
r1
角色:CREATE ROLE r1 COMMENT = 'This role has all privileges on schema_1';
- Snowsight:
登录 Snowsight。
切换到具有在账户中创建角色的权限的角色。
在导航菜单中选择 Admin » Users & Roles,然后选择 Roles。
选择 + Role。
随即出现 New Role 对话框。
对于 Name,请输入角色名称。例如
r1
。对于 Grant to role,可选择将新角色授予现有角色,并继承现有角色的权限。
可选择添加注释。
选择 Create Role。
向角色授予权限¶
您可以使用 SECURITYADMIN 角色将对象权限授予角色。有关其他选项,请参阅 GRANT <privileges>。
- SQL:
授予
r1
角色本节前面的表中定义的权限。GRANT USAGE ON WAREHOUSE w1 TO ROLE r1; GRANT USAGE ON DATABASE d1 TO ROLE r1; GRANT USAGE ON SCHEMA d1.s1 TO ROLE r1; GRANT SELECT ON TABLE d1.s1.t1 TO ROLE r1;
- Snowsight:
登录 Snowsight。
选择 Data » Databases。
针对特定数据库和架构,选择要向其授予权限的数据库对象。例如,名为
d1
的数据库。在 Object Details 中,找到 Privileges 部分。
选择 + Privilege。
选择要向其授予权限的角色。例如
r1
。选择要授予角色的权限。例如
USAGE
。如果希望角色能够将权限授予其他角色,请选中 Grant option 对应的复选框。
选择 Grant Privileges。
对于此示例,重复上述步骤对架构
s1
授予 USAGE 权限、对表t1
授予 SELECT 权限。要授予对仓库
w1
的 USAGE 权限,请完成以下步骤:登录 Snowsight。
选择 Admin » Warehouses。
找到并选择要向其授予权限的仓库。例如
w1
。在 Privileges 部分中,选择 + Privilege。
选择要向其授予权限的角色。例如
r1
。对于 Privileges,请选择要授予的权限。例如 USAGE。
如果希望角色能够将权限授予其他角色,请选中 Grant option 对应的复选框。
选择 Grant Privileges。
将角色授予用户¶
您可以使用 SECURITYADMIN 角色向用户授予角色。有关其他选项,请参阅 GRANT ROLE。
- SQL:
使用 GRANT ROLE 语句将
r1
角色分配给用户smith
:GRANT ROLE r1 TO USER smith;
(可选)将新的自定义角色设置为用户的默认角色。下次用户登录 Snowflake 时,默认角色将在会话中自动激活。
只有对用户拥有 OWNERSHIP 权限的角色或更高级别的角色才能执行此命令。
以下命令为用户
smith
设置默认角色:ALTER USER smith SET DEFAULT_ROLE = r1;
- Snowsight:
登录 Snowsight。
切换到有权向账户中的角色授予权限的角色。
在导航菜单中选择 Admin » Users & Roles,然后选择 Roles。
选择 Table,找到并选择您创建的角色。
在 0 users have been granted R1 部分中,选择 Grant to User。
对于 User to receive grant,请选择要向其授予角色的用户。例如 smith。
选择 Grant。
授予角色全局权限¶
您也可以向角色授予全局权限。有关可授予角色的全局权限列表,请参阅 访问控制权限。
- SQL:
使用 GRANT PRIVILEGE 命令。有关详细信息,请参阅 权限管理。
- Snowsight:
创建自定义只读角色¶
假设您需要一个仅限于查询特定架构中的所有表的角色(例如 d1.s1
)。使用此角色执行命令的用户无法更新表数据、创建其他数据库对象或删除表。该角色仅限于查询表数据。
若要创建只读角色,请完成 创建自定义角色 (本主题内容)中描述的基本步骤。在 向角色授予权限 部分中,向只读角色(在本说明中称为 read_only
)授予以下对象权限:
权限 |
对象 |
备注 |
---|---|---|
USAGE |
仓库 |
要查询对象(例如表或视图),角色必须对仓库具有 USAGE 权限。仓库提供执行查询的计算资源。 |
SELECT |
表 |
要对架构中的任何对象进行操作,角色必须对容器数据库和架构具有 USAGE 权限。 |
GRANT <privilege> 语句如下:
GRANT USAGE
ON DATABASE d1
TO ROLE read_only;
GRANT USAGE
ON SCHEMA d1.s1
TO ROLE read_only;
GRANT SELECT
ON ALL TABLES IN SCHEMA d1.s1
TO ROLE read_only;
GRANT USAGE
ON WAREHOUSE w1
TO ROLE read_only;
备注
GRANT SELECT ON ALL TABLES IN SCHEMA <schema>
语句仅授予对所有 现有 表的 SELECT 权限。要将 未来 所有表上的 SELECT 权限授予该角色,请执行以下语句:
GRANT SELECT ON FUTURE TABLES IN SCHEMA d1.s1 TO ROLE read_only;
创建角色层次结构¶
创建自定义角色时,请考虑创建最终分配给高级管理员角色的角色层次结构。一般来说, SYSADMIN 角色与层次结构中所有其他角色分配的角色一样工作良好,但需要注意的是,任何具有足够权限的角色都可以提供此功能。SYSADMIN 角色是系统定义的角色,有权在账户中创建仓库、数据库和数据库对象,并将这些权限授予其他角色。在默认系统层次结构中,顶层 ACCOUNTADMIN 角色管理系统管理员角色。
通过将一个角色授予第二个角色来创建角色层次结构。然后,您可以将第二个角色授予第三个角色。与某个角色相关联的权限由层次结构中该角色 之上 的任何角色(即父角色)继承。
下图显示了角色层次结构示例以及授予每个角色的权限:
将一个角色授予另一个角色¶
将角色分配给角色层次结构中的更高级别角色。在本例中,我们将在 创建自定义角色 (本主题内容)中创建的 r1
角色分配给 SYSADMIN 角色。SYSADMIN 角色继承授予 r1
角色的任何对象权限:
- SQL:
GRANT ROLE r1 TO ROLE sysadmin;
- Snowsight:
登录 Snowsight。
在导航菜单中选择 Admin » Users & Roles,然后选择 Roles。
选择 Table,找到要授予另一个角色的角色。例如
r1
。在 0 roles have been granted R12 部分中,选择 Grant to Role。
对于 Role to receive grant,选择 SYSADMIN。
选择 Grant。
备注
在更复杂的示例中,您可以将 custom
角色分配给 SYSADMIN 的另一个子角色(或另一个管理员角色,如具有足够权限创建数据库的自定义角色)。SYSADMIN 角色将继承分配给 custom
角色及其父角色的组合权限。如果层次结构中 custom
以上的角色拥有任何对象,那么角色层次结构将确保 SYSADMIN 角色的成员也拥有这些对象(间接),并可以按预期管理它们。
探索 Snowsight 中的角色层次结构¶
Snowsight 包括一个角色图表,显示账户中角色的层次结构。该图表按层次结构的降序排列,通过路径表示从父角色到子角色的继承。在拥有大量角色的账户中,加载图表可能需要一些时间。
备注
数据库角色不显示在角色图表中。
要打开角色图表,请执行以下操作:
登录 Snowsight。
在导航菜单中,选择 Admin » Users & Roles。
查看角色图表时,可以选择一个单独的角色或用户,该角色或用户就会成为角色图表的焦点。要进行探索,您可以放大或缩小图表,并在图表中间显示重点角色或用户。
选择一个角色可查看该角色的详细信息,如创建时间、所有者角色、授予该角色的角色数、已授予该角色的角色数、向其授予该角色的用户数,以及管理该角色授予的功能。
查看授予的权限¶
要查看当前授予对象的权限集,可以执行 SHOW GRANTS 命令。
备注
对特定对象执行 SHOW GRANTS 命令需要与运行该对象类型的 SHOW 命令相同的对象权限。
例如,在表上运行 SHOW GRANTS 命令需要对表以及容器数据库和架构具有以下权限:
- 数据库:
USAGE
- 架构:
USAGE
- 表:
任何权限
例如,要查看架构的当前权限,请执行以下命令:
SHOW GRANTS ON SCHEMA <database_name>.<schema_name>;
例如,执行以下命令查看在 创建自定义角色 (本主题内容)时授予的对 database_a.schema_1
的权限:
SHOW GRANTS ON SCHEMA database_a.schema_1;
Snowflake 返回以下结果:
+-------------------------------+-----------------------+------------+----------------------+------------+--------------------------+--------------+---------------+ | created_on | privilege | granted_on | name | granted_to | grantee_name | grant_option | granted_by | |-------------------------------+-----------------------+------------+----------------------+------------+--------------------------+--------------+---------------| | 2022-03-07 09:04:23.635 -0800 | USAGE | SCHEMA | D1.S1 | ROLE | R1 | false | SECURITYADMIN | +-------------------------------+-----------------------+------------+----------------------+------------+--------------------------+--------------+---------------+
您还可以运行 SHOW GRANTS 命令来查看当前授予某个角色的权限集或当前授予某个用户的角色集:
SHOW GRANTS TO ROLE <role_name>; SHOW GRANTS TO USER <user_name>;
例如,执行以下命令查看在 创建自定义角色 (本主题内容)中创建的角色 r1
上授予的权限:
SHOW GRANTS TO ROLE r1;
Snowflake 返回以下结果:
+-------------------------------+-----------+------------+----------------------+------------+--------------+--------------+---------------+ | created_on | privilege | granted_on | name | granted_to | grantee_name | grant_option | granted_by | |-------------------------------+-----------+------------+----------------------+------------+--------------+--------------+---------------| | 2022-03-07 09:08:43.773 -0800 | USAGE | DATABASE | D1 | ROLE | R1 | false | SECURITYADMIN | | 2022-03-07 09:08:55.253 -0800 | USAGE | SCHEMA | D1.S1 | ROLE | R1 | false | SECURITYADMIN | | 2022-03-07 09:09:07.206 -0800 | SELECT | TABLE | D1.S1.T1 | ROLE | R1 | false | SECURITYADMIN | | 2022-03-07 09:08:34.838 -0800 | USAGE | WAREHOUSE | W1 | ROLE | R1 | false | SECURITYADMIN | +-------------------------------+-----------+------------+----------------------+------------+--------------+--------------+---------------+
为对象分配未来的授权¶
为了简化授权管理,未来授权 允许定义一组初始权限,以授予数据库或架构中特定 类型 的新(即未来)对象。当在数据库或架构中创建新对象时,定义的权限将自动授予指定的角色。
未来授权仅定义对指定类型的新对象授予的 初始 权限集。创建单个对象后,管理员可以显式授予该对象的附加权限或撤销权限。这允许对架构或数据库中的所有对象进行细粒度的访问控制。
注意事项¶
当在同一数据库的 同一对象类型 和同一数据库中的架构上定义未来授权时,架构级授权优先于数据库级授权,而数据库级授权被忽略。此行为适用于授予一个角色或不同角色的未来对象的权限。
例如,以下语句在数据库和架构级别对同一类型的对象授予不同的权限。
将数据库
d1
中所有未来表的 SELECT 权限授予角色r1
:GRANT SELECT ON FUTURE TABLES IN DATABASE d1 TO ROLE r1;
将架构
d1.s1
中所有未来表的 INSERT 和 DELETE 权限授予角色r2
。GRANT INSERT,DELETE ON FUTURE TABLES IN SCHEMA d1.s1 TO ROLE r2;
架构
d1.s1
中对象类型上分配给r1
角色的未来授权将被完全忽略。在架构d1.s1
中创建新表时,只授予r2
角色在表上定义的未来权限。数据库级未来授权适用于常规和 托管访问架构。
定义对数据库或架构对象的未来授权¶
使用带有 ON FUTURE 关键字的 GRANT <privileges> 命令授予对指定类型的未来对象的权限。
撤销对数据库或架构对象的未来授权¶
使用带有 ON FUTURE 关键字的 REVOKE <privileges> 命令撤销对未来对象的授权。
对象克隆和未来授权¶
克隆数据库或架构时,未来的授权将复制到其克隆中。此行为与常规对象授权保持一致;也就是说,对源对象(即数据库)的权限授予不会复制到其克隆,但对所有子对象(即数据库中的表)的权限授予将复制到克隆。
克隆架构中的对象时,除非在克隆操作的 CREATE <object> 语句中指定了 COPY GRANTS 选项,否则在架构中为此对象类型定义的任何未来授权都将应用于克隆的对象。在这种情况下,新对象将保留原始对象的访问权限,并且 不会 继承该类型对象的任何未来授权。
使用 Classic Console 管理未来授予¶
您还可以使用 Classic Console 定义未来授权:
- 对未来数据库对象的授权:
- 对未来架构对象的授权:
要在 Snowsight 中管理未来授予,请在工作表中运行 SQL 语句。
创建托管访问架构¶
托管访问架构通过锁定对象的权限管理来提高安全性。
在常规(即非托管)架构中,对象所有者(即具有对象 OWNERSHIP 特权的角色)可以向其他角色授予对其对象的访问权限,并可以选择进一步授予这些角色管理对象授权的能力。
使用托管访问架构,对象所有者失去了做出授权决策的能力。只有架构所有者(即拥有架构 OWNERSHIP 权限的角色)或拥有 MANAGE GRANTS 权限的角色才能授予架构中对象的权限,包括 未来的授权,从而集中权限管理。
您可以使用 Web 界面或 SQL 创建托管访问架构:
- Classic Console:
- SQL:
执行具有 WITH MANAGED ACCESS 关键字的 CREATE SCHEMA 语句。
您可以使用 Web 界面或 SQL 将常规架构更改为托管访问架构(反之亦然):
- Classic Console:
点击 Databases » <db_name> » Schemas » <schema_name> » Alter a schema。
- SQL:
执行具有 ENABLE DISABLE MANAGED ACCESS 关键字的 ALTER SCHEMA 语句。
下表指示哪些角色可以管理常规或托管访问架构中的对象权限:
角色 |
可以在常规架构中授予对象权限 |
可以在托管访问架构中授予对象权限 |
---|---|---|
SYSADMIN |
否 |
否 |
SECURITYADMIN 或更高版本 |
是 |
是 |
数据库所有者 |
否 |
否 |
架构所有者 |
否 |
是 |
对象所有者 |
是 |
否 |
任何具有 MANAGE GRANTS 权限的角色 |
是 |
是 |
使用 Snowsight 管理对象权限¶
可以使用 Snowsight 管理向角色的数据库对象权限授权。要管理这些授权,请使用具有对象的 OWNERSHIP 权限或全局 MANAGE GRANTS 权限的角色。
使用 Snowsight 管理授予时,相当于在 SQL 中运行 GRANT PRIVILEGE 或 REVOKE PRIVILEGE 命令。例如,可以使用 Snowsight 将视图的 USAGE 权限授予 ACCOUNTADMIN 角色。
授予对象权限¶
要向角色授予数据库对象权限,请执行以下操作:
登录 Snowsight。
选择 Data » Databases。
针对特定数据库和架构,选择要向其授予权限的数据库对象。
在 Object Details 中,找到 Privileges 部分。
选择 + Privilege。
选择要向其授予权限的角色。
选择要授予角色的权限。
如果希望角色能够将权限授予其他角色,请选择 Grant option。
对要授予角色的每个对象权限重复上述步骤。
选择 Grant Privileges。
撤销对象的权限¶
要撤销角色的数据库对象权限,请执行以下操作:
登录 Snowsight。
选择 Data » Databases。
对于特定数据库和架构,请选择要撤销其权限的数据库对象。
在 Object Details 中,找到 Privileges 部分。
对于列出的特定角色,请选择 Edit Role 铅笔图标,当您将鼠标悬停在该行上时,该图标就会出现。
在出现的对话框中,选择 x 以撤销特定角色的权限。
选择 Update Privileges。
确定授予角色的权限¶
要显示对特定角色授予的权限,可以运行 SHOW GRANTS 命令或在 Snowsight 中执行以下操作:
登录 Snowsight。
选择 Admin » Users & Roles » Roles。
选择 Table,找到要查看所授予权限的角色。
选择要查看所授予权限的角色,以查看详细信息。
查看该角色的 Privileges 部分。
使非账户管理员能够在 Classic Console 中监控使用情况和账单历史记录¶
Snowflake 提供有关数据存储/传输和仓库使用/负载的广泛账户使用情况和账单信息:
- Snowsight:
选择 Admin » Cost Management。
- Classic Console:
- SQL:
查询以下任意一项:
默认情况下,只有账户管理员才能访问/查看此信息。
备注
目前, Snowsight 仅向账户管理员显示使用情况和账单信息。无法授予其他角色查看此信息的能力。
要使非账户管理员的用户能够访问/查看此信息,请向系统定义或自定义角色授予以下权限。向角色授予权限允许所有被授予该角色的用户访问此历史/使用情况信息:
权限
对象
描述
MONITOR USAGE
账户(即全局权限)
允许被授予该角色的用户在 Web 界面中查看使用情况和账单信息,并查询 Information Schema 中相应的表函数。
此外,使用此权限, SHOW DATABASES 和 SHOW WAREHOUSES 命令将分别返回账户中所有数据库和仓库的列表,而不管是否授予了其他权限。
IMPORTED PRIVILEGES
snowflake
数据库允许被授予该角色的用户查询所有 ACCOUNT USAGE 视图,包括包含使用情况和账单信息的视图。
有关更多信息,请参阅 为其他角色启用 SNOWFLAKE 数据库使用。
例如,要将这些权限授予 custom
角色:
GRANT MONITOR USAGE ON ACCOUNT TO ROLE custom;
GRANT IMPORTED PRIVILEGES ON DATABASE snowflake TO ROLE custom;