如何安全共享带行级安全的Snowsight工作表与仪表板?
Snowflake中安全共享带行级安全的Snowsight工作表与仪表板方案
一、Snowsight工作表的安全共享配置
限制查询历史访问权限:
不要直接共享完整工作表权限,而是创建只读角色并严格限制其查询历史访问能力:-- 撤销角色的全局监控权限 REVOKE MONITOR ON ACCOUNT FROM ROLE READ_ONLY_ROLE; -- 仅允许角色查看自身的查询历史 GRANT SELECT ON VIEW SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY TO ROLE READ_ONLY_ROLE WITH GRANT OPTION FALSE;共享时选择仅共享可视化结果,不开放查询编辑器权限,阻止用户查看原始查询语句和历史记录。
确保行级安全绑定到底层表:
行级安全策略(Row Access Policy)必须直接绑定到工作表依赖的表/视图,而非仅在工作表查询中做临时过滤,这样即使用户接触到查询逻辑,也无法绕过权限控制:CREATE OR REPLACE ROW ACCESS POLICY region_rlp ON sales_table AS (region VARCHAR) RETURNS BOOLEAN -> CURRENT_ROLE() IN ('REGION_NORTH', 'REGION_SOUTH') AND region = CURRENT_ROLE()::STRING; ALTER TABLE sales_table ADD ROW ACCESS POLICY region_rlp ON (region);
二、解决仪表板绕过行级安全的问题
启用实时数据刷新模式:
默认仪表板会缓存最后更新用户的查询结果,导致行级安全失效。需在仪表板编辑模式的「设置」选项卡中,将「数据刷新」设置为每次查看时刷新,禁用「使用缓存结果」,确保每个用户查看时都用自身权限重新执行查询。基于受保护视图构建仪表板:
创建绑定了行级安全策略的专用视图,让仪表板基于该视图构建,同时仅授予指定角色访问该视图的权限:CREATE OR REPLACE VIEW dashboard_sales_view AS SELECT * FROM sales_table; -- 已绑定行级安全策略 GRANT SELECT ON VIEW dashboard_sales_view TO ROLE DASHBOARD_VIEWER;
三、无历史结果存储的「安全模式」实现
使用可视化-only共享选项:
共享工作表或仪表板时,选择「仅允许查看可视化内容」,不开放编辑、查看查询的权限。这种模式下用户无法访问查询历史,只能看到基于自身权限生成的实时可视化结果。零拷贝克隆+行级安全隔离:
对目标数据创建零拷贝克隆表,绑定行级安全策略后再构建工作表和仪表板,即使存在查询历史,也只能访问克隆表中被授权的数据,不会触及原始数据:CREATE OR REPLACE TABLE sales_table_clone CLONE sales_table; ALTER TABLE sales_table_clone ADD ROW ACCESS POLICY region_rlp ON (region);
四、关键注意事项
- 遵循最小权限原则,仅授予用户完成工作所需的最低权限,避免使用
ACCOUNTADMIN、SYSADMIN等高权限角色。 - 定期审计权限和查询历史,排查未授权访问:
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY WHERE ROLE_NAME = 'READ_ONLY_ROLE' AND QUERY_TEXT LIKE '%sales_table%'; - 禁止在工作表/仪表板查询中硬编码数据过滤逻辑,必须依赖行级安全策略,防止用户修改过滤条件绕过权限。
内容的提问来源于stack exchange,提问作者Marco Roy
相关产品推荐
相关产品推荐

