1. Snowflake安全体系总览

Snowflake 的安全体系并不是单一功能,而是一套围绕“身份、权限、数据、网络、审计”五个维度协同工作的分层控制框架。理解这套框架的关键,是先分清 Snowflake 与客户之间的责任边界,再理解访问控制在 Snowflake 内部是如何逐层收敛的,最后才能把各个安全组件放到正确的位置上。

共享责任模型:谁保护什么

Snowflake 采用共享责任模型(Shared Responsibility Model)。Snowflake 负责云基础设施、存储层加密、计算资源隔离、平台自身补丁与物理安全;客户负责身份管理、访问策略、数据分类、网络策略配置以及审计监控。这条边界决定了:即使 Snowflake 默认对存储数据做了 AES-256 加密,客户仍然必须自己决定“谁能解密、谁能查询、谁能导出”。

一个常见的误解是“用了 Snowflake 就自动安全了”。实际上,Snowflake 提供的是安全能力(capability),而不是安全结果(outcome)。例如,默认情况下账户管理员拥有极大权限,如果没有启用 MFA、没有限制网络策略、没有做角色最小化设计,数据仍然可能被内部人员或泄露的凭据访问。因此共享责任模型的核心实践含义是:Snowflake 保证平台可信,客户保证使用可信。

访问控制层次:从账户到行级

Snowflake 的访问控制是分层收敛的,从外到内大致可分为五层:

  • 网络层:通过 Network Policy 限制允许访问的 IP 范围,可作用于整个账户或单个用户。
  • 身份层:通过用户、MFA、SSO(SAML/OAuth)确认“你是谁”。
  • 角色层:通过 RBAC 决定“你以什么身份操作”,角色是权限的载体。
  • 对象层:通过 GRANT 决定角色能对哪些数据库、Schema、表、视图执行哪些操作。
  • 数据层:通过行访问策略(Row Access Policy)、列级掩码(Masking Policy)、安全视图等决定“你能看到哪些行、哪些列、什么值”。

这五层是“与”关系:任何一层拒绝,访问就不成立。例如一个用户即使拥有 SELECT 权限,如果其 IP 不在网络策略白名单内,连接仍会被拒绝;即使连接成功,如果查询的表上绑定了行访问策略,返回结果也会被过滤。

Snowflake 访问控制五层收敛模型 请求必须逐层通过,任一层拒绝即终止 ① 网络层 Network Policy 检查来源 IP 是否在允许列表内 账户级 / 用户级策略 · 拒绝即断开连接 ② 身份层 User / MFA / SSO 验证用户身份与登录凭据 SAML / OAuth / 密钥对 · 失败即拒绝登录 ③ 角色层 RBAC 确定当前会话激活的角色及其继承链 角色层级 · 权限继承 · 无权限即拒绝 ④ 对象层 GRANT 检查角色对目标对象的操作权限 Database / Schema / Table / View · SELECT / INSERT 等 ⑤ 数据层 Policy 行访问策略 / 列掩码 / 安全视图 决定可见行、可见列与脱敏值 全部通过 → 返回查询结果

核心组件与设计目标

围绕上述五层,Snowflake 提供了一组核心安全组件,它们各自解决不同层面的问题:

组件作用层次典型用途
Network Policy网络层限制 IP 范围,防止凭据泄露后的异地登录
MFA / SSO身份层强化登录验证,统一企业身份源
RBAC 角色体系角色层按职能划分权限,实现最小权限
Dynamic Data Masking数据层对敏感列按角色返回脱敏值
Row Access Policy数据层按用户属性过滤可见行
Secure View数据层隐藏底层表结构与过滤逻辑
Access History / ACCOUNT_USAGE审计层追踪谁在何时访问了哪些数据
Object Tagging治理层标记敏感级别,驱动策略自动化

这些组件的设计目标可以归纳为四条:最小权限(默认拒绝,按需授予)、纵深防御(多层独立控制,单点失效不致命)、可审计(所有访问可追溯)、可治理(策略集中管理、可复用、可自动化)。

在实际落地中,建议先建立角色层级和网络策略这两个“骨架”,再逐步叠加数据层策略。因为角色决定了权限边界,网络策略决定了访问入口,这两者稳定后,行级和列级策略才有明确的挂载对象。

一个具体的权限判断示例

假设分析师 Alice 使用角色 ROLE_ANALYST 查询 SALES.ORDERS 表。系统会依次判断:她的 IP 是否在公司网络策略白名单内;她的登录是否通过了 MFA;ROLE_ANALYST 是否被授予了对该表的 SELECT 权限;该表上是否绑定了行访问策略,如果有,则按策略表达式过滤行;如果查询涉及 CUSTOMER_EMAIL 列且该列绑定了掩码策略,则根据角色返回掩码值(如 ****@***.com)。只有全部通过,Alice 才能看到符合策略的结果。

这个例子说明:Snowflake 的安全不是靠某一个开关,而是靠多层策略的组合。设计安全体系时,应该先明确“谁、在什么网络环境、以什么角色、访问什么对象的什么数据”,再把这四个问题分别映射到对应的控制层上。