内容提要
本文介绍Databricks AI/BI仪表板嵌入客户应用时的行级安全模式。通过单一权限表驱动访问控制,结合`__aibi_external_value`、Unity Catalog行过滤器和身份组同步,实现外部合作伙伴与内部团队共享同一仪表板但查看不同数据切片。后端签发令牌时设置查看者范围,查询以服务主体身份运行,视图按范围过滤,支持列掩码和默认拒绝,并扩展至直接SQL查询路径。
延伸解读
单一权限表:集中管理访问控制
该模式的核心是使用一张权限表集中管理所有查看者的数据访问范围,而不是为每个客户创建单独的仪表板或在每个查询中重复过滤条件。这样既能避免仪表板副本因更新不同步而漂移,也能减少在查询中遗漏过滤条件的风险。权限表可以由上游系统自动填充,并支持查询、审计和动态修改,无需改动仪表板本身。
令牌签名与默认拒绝机制
后端在签发嵌入令牌时,会将查看者的范围(如 partner_acme 或 finance_all)签名到令牌中,查看者无法篡改。查询以服务主体身份运行,视图通过 __aibi_external_value 过滤数据。如果范围未知,则匹配不到任何行,从而实现默认拒绝。此外,在签发令牌前检查权限表,拒绝零权限的范围,可提前阻止未授权访问,并记录日志以便审计。
身份组同步与多组场景的局限
内部用户的组信息可通过身份提供商(如 Okta)同步,后端在签发令牌前需解析查看者的组,因为嵌入查询以服务主体身份运行,无法在 SQL 中直接判断用户身份。但令牌只能携带一个 external_value,对于多组联合权限的场景,需使用全访问组或直接 SQL 路径(利用行过滤器 OR 多个组)。复合范围可打包进 external_value,但受 1KB 限制。
列掩码与直接 SQL 路径的补充防护
行级安全控制行访问,列掩码则控制敏感列的可见性,例如合作伙伴看到掩码后的邮箱,内部团队看到完整邮箱。嵌入路径通过视图和令牌保护,而直接 SQL 查询路径则通过 Unity Catalog 行过滤器和列掩码保护,基于实际用户的身份和组进行判断。两条路径共用同一权限表,但执行机制不同,需分别配置。
Q&A
如何为嵌入的Databricks AI/BI仪表板实现行级安全,使不同查看者看到不同数据?
通过结合使用`__aibi_external_value`、Unity Catalog行过滤器和身份组同步,并利用一个集中的权限表来驱动访问控制。后端在签发嵌入令牌时设置查看者的范围(external_value),查询以服务主体身份运行,视图根据该范围过滤数据,从而实现每个查看者只能看到其被授权的数据行。
在Databricks AI/BI仪表板嵌入中,`__aibi_external_value`的作用是什么?
`__aibi_external_value`是嵌入令牌中携带的查看者范围值,由后端在签发令牌时设置,并暴露给仪表板的SQL。视图通过`WHERE viewer_scope = __aibi_external_value`来过滤数据,确保每个查看者只能看到与其范围匹配的数据。该值由Databricks签名,查看者无法修改。
嵌入仪表板时,查询以什么身份运行?为什么不能使用`is_account_group_member()`来识别查看者?
嵌入的查询以配置的发布身份(通常是服务主体)运行,而不是查看者的Databricks身份。因此,`is_account_group_member()`会检查服务主体的组成员身份,而不是实际查看者的,所以无法用于识别查看者。
如何将内部用户的组映射到嵌入令牌的external_value?
后端在签发令牌前,需要解析查看者的组。一种方法是在Databricks Apps上运行应用并启用用户授权,平台会转发用户的身份上下文和OBO令牌,后端使用该令牌调用SCIM /Me读取用户的组,然后将组名(如finance_all)作为external_value。
除了行级过滤,还提供了哪些额外的安全层?
还提供了列掩码(通过mask_pii标志控制敏感列如邮箱的显示)、默认拒绝(未知范围返回空结果)以及令牌签发前的访问检查(拒绝无权限的查看者)。这些层都基于同一个权限表。
对于直接SQL查询路径,如何保护数据安全?
在基础表上添加Unity Catalog行过滤器,该过滤器基于查询用户的身份和组(通过`is_account_group_member()`)来限制访问。同时,可以对敏感列应用列掩码。这些控制与嵌入路径分开,但使用相同的权限表。
如果查看者属于多个有不同权限的组,如何处理?
嵌入令牌只能携带一个external_value,因此对于多组联合的情况,可以使用一个全访问组,或者使用直接SQL路径(行过滤器可以OR所有组)。也可以将复合范围(如JSON)打包进external_value,但需注意1KB的负载限制。
在嵌入场景中,如何确保外部合作伙伴只能看到自己的数据?
外部合作伙伴没有Databricks身份,其范围是登录时分配的固定合作伙伴ID(如partner_acme)。后端在签发令牌时将该ID作为external_value,视图根据该值过滤,确保合作伙伴只能看到与其ID匹配的数据行。