Streamlit in Snowflake 的安全概述¶
本主题为在 Snowflake 账户中管理 Streamlit in Snowflake 的系统管理员提供安全概述。通过了解安全模型并实施适当的控制措施,既可确保开发人员构建安全的应用程序,也能帮助管理员对敏感数据和资源保持有效治理。
安全模型¶
Streamlit in Snowflake 遵循 Snowflake 的全面安全模型,其中包括身份验证、基于角色的访问控制、网络策略以及数据治理功能。应用程序是 Snowflake 中的一等对象,可与现有的安全基础设施无缝集成。
所有者权限执行¶
默认情况下,Streamlit 应用程序以所有者权限运行,其行为类似于存储过程。这会带来以下影响:
应用程序执行查询时使用的是应用程序所有者的权限,而非查看者的权限。
应用程序所有者的角色决定了应用程序可访问的数据和可执行的操作。
查看者无需直接访问基础表或视图,即可与应用程序进行交互。
该模型无需使用服务账户令牌,并可与 Snowflake 的身份验证和访问控制功能无缝集成。有关更多信息,请参阅 了解所有者的权限和 Streamlit in 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 限制的更多信息,请参阅 在 Streamlit in Snowflake 中加载外部资源时的限制。
基本安全设置¶
以下安全配置对于构建安全且运行良好的 Streamlit in Snowflake 环境至关重要。
网络访问配置¶
请配置网络访问,以确保应用程序能够与 Snowflake 通信。
适用于所有部署:
将
*.snowflakeapp.cn和*.snowflake.cn添加到网络允许列表中。确保在您的网络配置中未阻止 WebSockets。
有关更多信息,请参阅 You can't load the Streamlit app。
对于专用连接:
如果您的组织需要专用连接,请为 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 应用程序所需的权限。
密钥管理¶
为访问外部服务或敏感凭据的应用程序配置适当的密钥管理:
通过授予适当权限,为应用程序启用密钥访问:
-- 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;
对于容器运行时应用程序,应创建 SQL 函数来封装密钥访问,而不是将密钥直接嵌入应用程序代码中。
有关更多信息,请参阅 管理密钥并配置 Streamlit 应用程序。
上下文函数与行级安全¶
如果应用程序使用上下文函数(例如 CURRENT_USER())或访问具有行访问策略的表,请授予应用程序所有者角色全局 READSESSION 权限:
USE ROLE ACCOUNTADMIN;
GRANT READ SESSION ON ACCOUNT TO ROLE streamlit_developer;
备注
在行访问策略中使用 CURRENT_ROLE() 的应用程序将始终返回应用程序所有者的角色,而非查看者角色,因为应用程序默认以所有者权限运行。
有关详细信息和示例,请参阅 Streamlit in Snowflake 中的行访问策略。
仅限容器运行时:包存储库安全¶
为容器运行时配置一个或多个软件包索引。
容器运行时可以从外部存储库(例如 PyPI)安装软件包。您可以使用精选软件包索引(如 JFrog Artifactory)来管理软件包来源,或者使用默认软件包索引 PyPI。无论使用哪种软件包索引,都必须创建外部访问集成 (EAI),以允许应用程序安装依赖项。
使用精选软件包索引具有以下优势:
有助于防止供应链攻击,并确保软件包来自可信来源。
允许您控制哪些软件包及其版本可供应用程序使用。
它为软件包安装提供审计记录。
有关更多信息,请参阅 管理容器运行时的依赖项。
仅限仓库运行时:外部产品条款¶
仓库运行时使用 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 应用的数据库设置适当的日志和跟踪级别。
定期查看日志,以发现安全事件、错误及异常行为。
容器运行时尚不支持日志记录和跟踪。
有关更多信息,请参阅 Streamlit in Snowflake 日志记录和跟踪。
管理员最佳实践¶
以下最佳实践可帮助维护安全的 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;