在应用程序中使用所有者权限和受限制的调用方权限¶
本主题介绍如何将应用程序配置为使用所有者权限和受限制的调用方权限。
关于应用程序中的所有者权限和受限制的调用方权限¶
在 Snowflake Native App 中,可执行文件以所有者权限或受限制的调用方权限运行。在 Snowflake Native App Framework 的上下文中,支持以下类型的可执行对象:
应用程序拥有的存储过程
带有容器的应用程序中提供的服务
- 所有者权限:
使用所有者权限的可执行对象,以授予可执行对象所有者的权限运行。默认情况下,应用程序中的可执行对象使用所有者权限。在应用程序中,可执行对象的所有者是应用程序本身。
例如,CREATE PROCEDURE 命令创建了默认使用所有者权限的存储过程。如果向使用者授予了使用应用程序角色的访问权限,则使用者可以调用该存储过程。如果应用程序具有执行任务的权限,则该存储过程可以执行该操作。
有关所有者权限的信息,请参阅 了解调用方权限和所有者权限存储过程。
- 调用方权限:
使用调用方权限的可执行文件以授予调用方的权限运行。但是,出于安全原因,Snowflake Native App Framework 不支持具有调用方权限的可执行文件。
- 受限制的调用方的权限:
受限制的调用方权限允许可执行文件以调用方的权限运行,但限制可执行文件以调用方的哪些权限运行。在受限制的调用方权限下,应用程序拥有的可执行文件无法以某项特定权限运行,除非使用者账户中的管理员通过使用 GRANT CALLER 命令明确允许该权限。
为简洁起见,以受限制的调用方权限运行的可执行文件也称为 RCR 可执行文件。
有关受限制的调用方权限的一般信息,请参阅 受限制的调用方的权限。
确定应用程序的访问权限要求¶
Snowflake Native App Framework 使提供商可以灵活地配置对应用程序管理的数据和可执行文件的访问权限。下表提供了根据应用程序的访问权限要求应使用何种机制的相关指南:
所需的访问权限 |
如何获得访问权限 |
---|---|
应用程序拥有的数据或函数 |
默认使用所有者权限。提供商无需向使用者请求访问权限即可创建或访问应用程序拥有的对象。 |
使用者账户中的特定表、视图或函数 |
向使用者请求参考 |
其他用户或角色拥有的表、视图、函数和行策略。 |
使用受限制的调用方权限,从而让使用者能够访问这些对象。 |
广泛访问使用者拥有的数据库 |
使用数据库角色授权 |
访问使用者和提供商数据组合的查询 |
同时使用参考和所有者权限 |
账户级对象 |
提供自定义脚本,其中包含用于授予对特定对象的权限的 GRANT 命令。 |
将 restricted_callers_rights
属性添加到清单中¶
作为提供商,如果您在应用程序中添加 RCR 可执行文件,Snowflake 建议您将 restricted_callers_rights
添加到清单文件中,如以下示例所示:
restricted_callers_rights:
enabled: true
description: This app includes stored procedure that uses restricted caller's rights.
尽管 restricted_callers_rights
不是必填项,但如果它已存在且 enabled
设置为 true,
则 Snowsight 会在应用程序的列表中添加一个名为 Restricted caller's rights 的部分。
将过程或服务配置为使用受限制的调用方权限¶
要创建使用受限制的调用方权限的存储过程,请使用 EXECUTE AS RESTRICTED CALLER 子句,如以下示例所示:
CREATE OR REPLACE PROCEDURE CORE.HELLO()
RETURNS STRING
LANGUAGE SQL
EXECUTE AS RESTRICTED CALLER
AS
BEGIN
RETURN 'Hello Snowflake!';
END;
有关更多信息,请参阅 CREATE PROCEDURE。
在应用程序中使用受限制的调用方权限服务¶
有关将服务配置为使用受限制的调用方权限的更多信息,请参阅 使用调用方限从容器内部连接到 Snowflake。
在应用程序中,Snowpark Container Services 服务可以使用应用程序的权限(所有者权利)或服务调用方的权限(受限制的调用方权限)运行。但是,服务所有者角色是应用程序,而不是服务用户角色。在授予调用方授权时,使用者通过 TO APPLICATION 子句指定应用程序,如以下示例所示:
GRANT CALLER USAGE ON DATABASE consumer_db TO APPLICATION hello_snowflake_app;
此示例允许该服务使用受限制的调用方权限运行,从而使用调用方角色访问 consumer_db
数据库。
对应用程序中受限制的调用方权限的限制¶
在应用程序中使用受限制的调用方权限时,适用以下限制。
对受限制的调用方权限的一般限制¶
有关对受限制的调用方权限的一般限制,请参阅 具有受限制的调用方权限的可执行文件的限制。此处列出的限制也适用于应用程序。
应用程序的其他限制¶
除了对受限制的调用方权限的一般限制外,应用程序还有以下限制:
应用程序中的可执行文件不支持 不受限制 的调用方权限。
无法执行以下命令:
SHOW ROLES
SHOW USERS
SHOW [CALLER] GRANTS
SHOW AVAILABLE LISTINGS
无法执行以下函数:
ALL_USER_NAMES
GET_USERS_FOR_COLLABORATION
CURRENT_IP_ADDRESS
CURRENT_AVAILABLE_ROLES
CURRENT_SECONDARY_ROLES
SYSTEM$ALLOWLIST(或已弃用的 SYSTEM$WHITELIST)
不支持持久引用函数。
不支持暂存区上对象的相对路径。
RCR 可执行文件无法访问应用程序的内部对象。
如果可执行文件使用所有者权限,则无法调用使用不受限制的调用方权限的其他可执行文件。
尽管使用应用程序拥有的所有者权限的可执行文件可以调用 RCR 可执行文件,但 RCR 可执行文件也必须归应用程序所有。例如,具有所有者权限的应用程序的存储过程无法调用具有受限制的调用方权限的使用者的存储过程。
从应用程序中受限制的调用方权限过程中调用计费函数¶
无法从 RCR 可执行文件中调用 SYSTEM$CREATE_BILLING_EVENT 或 SYSTEM$CREATE_BILLING_EVENTS 等计费函数。要从应用程序中的 RCR 可执行文件中调用这些函数,请在所有者权限过程中添加这些函数,并从受限制的调用方权限过程中调用该过程。
知识产权保护和受限制的调用方权限¶
包含所有者权限存储过程的应用程序会编辑有关应用程序内部实现的信息。有关更多信息,请参阅 保护提供商的知识产权。
具有受限制的调用方权限的存储过程还会编辑有关应用程序的内部信息。对于以下命令、视图和函数(其中部分信息经过编辑)尤其如此:
Information Schema 的 PROCEDURES 视图
Account Information Schema 的 PROCEDURES 视图
GET_DDL 函数
但是,与使用所有者权限的存储过程不同,使用受限制的调用方权限的过程不会编辑查询历史记录和查询配置文件中的信息。
开发使用受限制的调用方权限的应用程序¶
通常,只有被授予 MANAGE CALLER GRANTS 权限的角色才能向可执行文件授予调用方权限。但是,在 Snowflake Native App 的开发生命周期中,提供商可能需要经常创建和删除应用程序。Snowflake Native App Framework 提供了一种为 开发模式下的应用程序 创建调用方授权的机制。
提供商可以使用不具备 MANAGE CALLER GRANTS 的角色向应用程序授予调用方授权。但是,这需要满足以下所有条件:
应用程序必须在 开发模式 下创建。
当前角色在角色层次结构中具有应用程序所有者角色。
应用程序所有者角色拥有所授予的调用方授权的超集。
备注
ALL CALLER PRIVILEGES 权限是任何调用方权限集的超集。
超集要求无法通过 INHERITED CALLER 授权来满足,该授权通常涵盖特定容器下特定类型的所有当前和未来对象。有关更多信息,请参阅 GRANT CALLER。
为了满足此要求,向应用程序所有者角色授予的调用方授权必须明确涵盖要授予的调用方授权。
允许应用程序开发者在开发模式下向应用程序授予调用方权限¶
要允许应用程序所有者角色向开发模式下的应用程序授予特定的调用方授权集,如果用户拥有 ACCOUNTADMIN 角色或已被授予 MANAGE CALLER GRANTS 权限的角色,则必须首先授予调用方授权,该调用方授权涵盖向应用程序所有者角色授予的授权集。
以下示例展示了在账户中如何授予所需的对数据库的调用方权限:
GRANT ALL INHERITED CALLER PRIVILEGES
ON ALL DATABASES IN ACCOUNT
TO ROLE app_dev_role;
此命令向 app_dev_role
角色授予对所有数据库的所有调用方授权。
备注
此命令仅授予调用方授权。此命令不允许应用程序开发者访问尚未允许他们访问的对象。
开发模式下应用程序的其他安全措施¶
允许不具备 MANAGE CALLER GRANTS 权限的应用程序开发者所有者角色简化应用程序开发过程,但这也会带来潜在的安全风险。为了尽可能降低这些风险,Snowflake 会验证应用程序所有者是否仍然需要调用方授权才能使用该应用程序。如果应用程序所有者失去了所需的调用方授权,则应用程序也会失去这些授权。