Streamlit in Snowflake 的安全概述

本主题为在 Snowflake 账户中管理 Streamlit in Snowflake 的系统管理员提供安全概述。通过了解安全模型并实施适当的控制措施,既可确保开发人员构建安全的应用程序,也能帮助管理员对敏感数据和资源保持有效治理。

安全模型

Streamlit in Snowflake 遵循 Snowflake 的全面安全模型,其中包括身份验证、基于角色的访问控制、网络策略以及数据治理功能。应用程序是 Snowflake 中的一等对象,可与现有的安全基础设施无缝集成。

所有者权限执行

默认情况下,Streamlit 应用程序以所有者权限运行,其行为类似于存储过程。这会带来以下影响:

  • 应用程序执行查询时使用的是应用程序所有者的权限,而非查看者的权限。

  • 应用程序所有者的角色决定了应用程序可访问的数据和可执行的操作。

  • 查看者无需直接访问基础表或视图,即可与应用程序进行交互。

该模型无需使用服务账户令牌,并可与 Snowflake 的身份验证和访问控制功能无缝集成。有关更多信息,请参阅 了解所有者的权限和 Streamlit in Snowflake 应用程序

或者,您可以将容器运行时应用程序配置为使用受限的调用方权限(预览版),这允许应用程序以查看者的权限(而非所有者的权限)运行。有关更多信息,请参阅 受限制的调用方的权限和 Streamlit in Snowflake

责任共担模型

安全责任由 Snowflake、账户管理员和应用程序开发者共同承担:

  • Snowflake 提供安全的平台、身份验证、加密以及各类安全功能。

  • 管理员负责配置账户级安全策略、管理角色和权限,并审计应用程序的使用情况。

  • 应用程序开发者负责编写安全的代码、妥善处理密钥,并遵循安全最佳实践。

有关 Snowflake 安全模型的更多信息,请参阅 Snowflake 的责任共担模型

内容安全策略

所有 Streamlit 应用程序都在 `内容安全策略 <https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP (https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP)>`_(CSP) 的约束下运行,该策略限制可以加载的资源类型。该策略通过纵深防御机制,防范跨站脚本攻击 (XSS) 以及其他代码注入攻击。该 CSP 目前尚不支持配置。

该 CSP 会阻止以下外部资源:

  • 从外部域加载代码(脚本、样式、字体)

  • 在来自外部域的 iframe 中嵌入应用程序

该 CSP 允许以下外部资源:

  • 来自 HTTPS 来源的图像和媒体:应用程序可以从任何 HTTPSURL 加载图像和媒体文件,包括外部图像托管服务以及返回图像的 APIs。这不需要配置外部访问集成。

  • 数据 URIs 和 blob URLs:应用程序可以使用嵌入式数据(数据 URIs)以及动态生成的内容(blob URLs)来呈现图像和媒体。这支持显示图表、示意图或用户上传内容等功能。

  • Mapbox 和 Carto 资源:允许使用来自 Mapbox 和 Carto 的有限资源子集,以支持地图可视化。

备注

  • 对于使用 conda 管理依赖项的仓库运行时,必须接受 Anaconda 的使用条款才能使用 Mapbox。有关更多信息,请参阅 使用 Anaconda 的第三方包

  • Streamlit in Snowflake 支持从外部域加载图像或媒体,但 Snowflake Native App Framework 不支持。

  • CSP 还会阻止通常被认为不安全的前端调用,例如 eval()

这种严格的策略意味着,大多数依赖外部脚本的第三方 JavaScript 库和自定义组件无法在 Streamlit 应用程序中正常运行。有关 CSP 限制的更多信息,请参阅 Loading external resources

基本安全设置

以下安全配置对于构建安全且运行良好的 Streamlit in Snowflake 环境至关重要。

网络访问配置

请配置网络访问,以确保应用程序能够与 Snowflake 通信。

适用于所有部署:

  • *.snowflakeapp.cn*.snowflake.cn 添加到网络允许列表中。

  • 确保在您的网络配置中未阻止 WebSockets。

有关更多信息,请参阅 无法加载 Streamlit 应用程序

对于专用连接:

如果您的组织需要专用连接,请为 Snowflake 访问和 Streamlit 应用程序访问同时配置 AWSPrivateLink、Azure 专用链接或 Google Cloud Private Service Connect。有关更多信息,请参阅 Streamlit in Snowflake 专用连接

基于角色的访问控制

建立用于管理 Streamlit 应用程序的角色层次结构。

推荐的角色结构:

  • 创建者角色:在将部署应用程序的架构上,具有 CREATESTREAMLIT 权限的角色。

  • 查看者角色:在应用程序上为最终用户授予 USAGE 权限的角色。

以下示例演示了如何为 Streamlit 应用程序创建角色层次结构。

-- Create dedicated roles for Streamlit
CREATE ROLE streamlit_developer;
CREATE ROLE streamlit_viewer;

-- Grant hierarchy
GRANT ROLE streamlit_viewer TO ROLE streamlit_developer;

-- Grant privileges for app creation
GRANT USAGE ON DATABASE streamlit_db TO ROLE streamlit_developer;
GRANT USAGE ON SCHEMA streamlit_db.apps TO ROLE streamlit_developer;
GRANT CREATE STREAMLIT ON SCHEMA streamlit_db.apps TO ROLE streamlit_developer;
GRANT USAGE ON COMPUTE_POOL streamlit_compute_pool TO ROLE streamlit_developer;
GRANT USAGE ON INTEGRATION python_package_index TO ROLE streamlit_developer;

-- Grant privileges for app viewing
GRANT USAGE ON WAREHOUSE streamlit_wh TO ROLE streamlit_viewer;
GRANT USAGE ON DATABASE streamlit_db TO ROLE streamlit_viewer;
GRANT USAGE ON SCHEMA streamlit_db.apps TO ROLE streamlit_viewer;
GRANT USAGE ON STREAMLIT streamlit_db.apps.my_app TO ROLE streamlit_viewer;

应用程序开发者还需要对 streamlit_wh 拥有 USAGE 权限,但这一权限是从查看者角色继承的。有关所需权限的更多信息,请参阅 创建和使用 Streamlit 应用程序所需的权限

密钥管理

为访问外部服务或敏感凭据的应用程序配置适当的密钥管理:

  1. 通过授予适当权限,为应用程序启用密钥访问:

    -- Grant privileges on secrets to app owner role
    GRANT READ ON SECRET my_secret TO ROLE streamlit_developer;
    GRANT USAGE ON INTEGRATION my_external_access_integration TO ROLE streamlit_developer;
    
  2. 对于容器运行时应用程序,应创建 SQL 函数来封装密钥访问,而不是将密钥直接嵌入应用程序代码中。

有关更多信息,请参阅 管理密钥并配置 Streamlit 应用程序

上下文函数与行级安全

在仓库运行时中,如果应用程序使用上下文函数(例如 CURRENT_USER())或访问具有行访问策略的表,请向应用程序所有者角色全局 READ SESSION 权限:

USE ROLE ACCOUNTADMIN;
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_developer;

备注

在行访问策略中使用 CURRENT_ROLE() 的仓库运行时应用程序将始终返回应用程序所有者的角色,而非查看者角色,因为应用程序默认以所有者权限运行。

有关详细信息和示例,请参阅 Streamlit in Snowflake 中的行访问策略

在容器运行时,基于所有者权限连接的上下文函数将返回来自所有者角色上下文的值,因此不适用于针对用户的行访问策略。但是,受限的调用方权限连接会返回查看者的上下文。有关更多信息,请参阅 受限制的调用方的权限和 Streamlit in Snowflake

仅限容器运行时:包存储库访问和安全性

为容器运行时配置一个或多个软件包索引。

容器运行时可以从外部存储库(例如 PyPI)安装软件包。您可以使用托管包索引(如 JFrog Artifactory)来管理软件包来源,或者使用默认软件包索引 PyPI。无论使用哪种软件包索引,都必须创建外部访问集成 (EAI),以允许应用程序安装依赖项。

使用托管包索引具有以下优势:

  • 有助于防止供应链攻击,并确保软件包来自可信来源。

  • 允许您控制哪些软件包及其版本可供应用程序使用。

  • 它为软件包安装提供审计记录。

有关开发者如何使用 EAIs 管理依赖项的更多信息,请参阅 管理容器运行时的依赖项。有关使用身份验证设置托管包存储库的更多信息,请参阅 示例:对私有 JFrog Artifactory 存储库进行身份验证

设置适用于应用程序开发者的 PyPI EAI

容器运行时应用程序默认会尝试从 PyPI 安装依赖项。Snowflake 提供托管网络规则,SNOWFLAKE.EXTERNAL_ACCESS.PYPI_RULE,这允许出口至 PyPI。您可以使用此规则创建 PyPI EAI,无需定义自己的网络规则。有关托管网络规则的更多信息,请参阅 Snowflake-managed egress network rules

以下 SQL 命令使用 Snowflake 托管的网络规则创建 PyPI EAI,并将 USAGE 授予应用开发角色:

USE ROLE ACCOUNTADMIN;

CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION pypi_access_integration
  ALLOWED_NETWORK_RULES = (snowflake.external_access.pypi_rule)
  ENABLED = true;

GRANT USAGE ON INTEGRATION pypi_access_integration TO ROLE app_developer_role;

仅限仓库运行时:外部产品条款

仓库运行时使用 conda 来管理应用程序的依赖项。如果您希望在应用程序中使用 Mapbox,必须确认 外部产品条款

有关使用该软件包的信息,请参阅 使用 Anaconda 的第三方包

可用的安全功能

以下安全功能可用于增强应用程序的安全性和治理能力。

外部访问集成

控制应用程序可访问的外部网络和服务:

  • 创建网络规则以定义允许的端点,包括包索引。

  • 创建引用网络规则和身份验证密钥的外部访问集成。

  • 将外部访问集成分配给 Streamlit 应用程序。

可防止应用程序进行未经授权的出站连接,并提供外部访问的审计记录。

有关更多信息,请参阅 Streamlit in Snowflake 中的外部网络访问

Git 集成

将 Streamlit 应用程序与 Git 仓库集成,实现版本控制和变更追踪:

  • 授予 Git 仓库对象(READ、WRITE 或 OWNERSHIP)的适当权限。

  • 使用 Git 集成记录代码变更的审计轨迹。

  • 在将变更部署到生产应用程序之前,执行代码审查流程。

有关更多信息,请参阅 将 Streamlit in Snowflake 应用程序与 Git 存储库同步

专用连接

对于具有严格网络安全要求的组织,请配置专用连接,以确保所有 Streamlit 流量都保留在专用网络内。Streamlit in Snowflake 支持以下专用连接选项:

专用连接可消除对公共互联网的暴露,并提供额外的网络隔离。

有关更多信息,请参阅 Streamlit in Snowflake 专用连接

日志记录和跟踪

启用日志记录以监控应用程序行为并排除故障:

  • 为您的账户配置事件表。有关更多信息,请参阅 事件表概述

  • 对于仓库运行时,为包含 Streamlit 应用程序的数据库设置适当的日志和跟踪级别。有关更多信息,请参阅 为日志、指标和跟踪设置级别

  • 定期查看日志,以发现安全事件、错误及异常行为。

对于容器运行时,Snowflake 会自动从容器中捕获标准输出和标准错误,并将它们存储在账户的事件表中。无需额外配置。

有关更多信息,请参阅 Streamlit in Snowflake 日志记录和跟踪

将用户的访问权限限制为仅访问 Streamlit in Snowflake

为了限制用户仅访问 Streamlit in Snowflake 并防止其访问 Snowflake 的其他部分,账户管理员可以通过 SQL 或 SCIM 属性添加自定义用户属性。

  • 要限制用户,请使用 ALTER USER SQL 命令设置 ALLOWED_INTERFACES 属性以包含 STREAMLIT:

    ALTER USER <user_name> SET ALLOWED_INTERFACES = (STREAMLIT);
    

如果您正在使用 SCIM APIs 预置用户,可以使用自定义属性 allowedInterfaces 进行相同的设置。有关 SCIM 自定义属性的更多信息,请参阅 SCIM 用户 API 参考

配置仅限 Streamlit 的访问权限后,用户除了其有权访问的 Streamlit in Snowflake 应用程序外,无法访问 Snowflake 的任何部分。此外,他们只能访问这些应用程序的应用程序查看器 URL。如果仅限 Streamlit 的用户尝试导航到 Snowflake 中的任何位置(包括任何应用程序构建器 URL),则会导致访问控制错误。

将应用程序查看者重定向到您的身份提供商

账户管理员可以配置所有应用程序查看器 URLs,以便在未经身份验证的查看者访问应用程序时重定向到您的身份提供商 (IdP)。此过程省去了用户登录流程中的一个步骤。

  • 要将未经身份验证的用户从应用程序查看器 URLs 重定向到您的 IdP,请使用 ALTER ACCOUNT SQL 命令设置 LOGIN_IDP_REDIRECT 账户属性以包含 STREAMLIT:

    ALTER ACCOUNT SET LOGIN_IDP_REDIRECT = (STREAMLIT = <your_security_integration>);
    

有关配置 Snowflake 账户以使用 IdP 的更多信息,请参阅以下主题:

管理员最佳实践

以下最佳实践可帮助维护安全的 Streamlit 环境。

使用专用角色和架构:

  • 为开发、测试和生产应用创建独立架构。

  • 为每个环境使用不同角色,以防止对生产应用的意外更改。

  • 将生产应用的所有权授予服务角色,而非单个用户账户。

实施最小权限访问:

  • 仅向每个角色授予所需的最低权限。

  • 定期审查并审计角色成员及权限。

  • 除非绝对必要,否则避免向应用所有者角色授予 ACCOUNTADMIN 或其他高权限角色。

管理应用生命周期:

  • 建立应用审批与部署流程。

  • 在将应用推广到生产环境前,需进行代码审查。

  • 记录访问敏感数据的应用,并对其进行额外审查。

  • 定期检查并删除未使用或已弃用的应用。

监控资源使用情况:

  • 为应用工作负载设置合适的仓库规模。

  • 监控计算成本,并针对异常使用模式设置警报。

  • 对于容器运行时,请为计算池配置合适的 MIN_NODES 和 MAX_NODES 设置。

  • 为不同应用环境使用独立仓库,以隔离成本和资源。

有关资源管理的更多信息,请参阅 Streamlit in Snowflake 的管理成本Streamlit 应用程序的运行时环境

使用安全的应用程序开发实践:

  • 切勿将凭据或 API 密钥直接嵌入应用程序代码中。

  • 使用 Snowflake 密钥存储敏感信息。

  • 验证并清理用户输入,以防止 SQL 注入攻击。

  • 通过应用程序公开的数据应仅限于查看者所需查看的内容。

  • 在与更广泛的用户共享应用程序之前,请进行彻底测试。

有关所有者权限安全注意事项的更多信息,请参阅 所有者权限和应用程序安全性

定期执行安全审计:

  • 检查哪些角色拥有 CREATE STREAMLIT 权限。

  • 审计各应用程序访问的数据源。

  • 检查外部访问集成及网络规则。

  • 检查前员工或非活跃账户拥有的应用程序。

  • 检查 Git 仓库访问权限及提交历史。

使用以下查询来审计您的 Streamlit 应用程序:

-- List all Streamlit apps and their owners
SHOW STREAMLITS;

-- Check privileges on a specific app
SHOW GRANTS ON STREAMLIT streamlit_db.apps.my_app;

-- List all roles with CREATE STREAMLIT privileges
SHOW GRANTS OF CREATE STREAMLIT;