嵌入式分析的安全性最佳实践

借助 Looker 嵌入式分析,您的用户和客户可以在任何 HTML 格式的网页、门户或应用中探索嵌入在 iframe 中的数据。iframe 会执行整个 Looker 应用,并且仅请求显示查询所需的数据。从设计上讲,iframe 不会从您的外部网站或应用中读取或写入数据。

嵌入数据有时可能会带来隐私或安全问题。为了缓解这些问题,我们建议 Looker 管理员遵循以下最佳实践:

  • 如果您要将 Looker 内容嵌入客户,请在用于内部分析的实例不同的 Looker 实例上设置客户内容。
  • 仅将数据连接到可供嵌入用户(可能是公开的)访问的 Looker 嵌入式实例。
  • 保护公开嵌入网址中的随机令牌(就像它们是用户凭据一样);如果不使用公开网址,请停用这些令牌。
  • 对于每组给定的权限、用户属性和模型,分配的 external_user_id 值必须是唯一的。确保没有针对不同的互动用户在不同嵌入会话中使用相同的 external_user_id,并确保没有针对具有不同权限、用户属性值或模型访问权限的单个用户使用相同的 external_user_id
  • 启用封闭系统
  • 保护已签名的嵌入密钥,就像它们是您嵌入的 Looker 实例的管理员凭据一样;如果您未使用签名嵌入,则请保持停用状态。
  • 为 Looker 嵌入式实例使用安全系数高的身份验证(签名嵌入SAMLGoogle OAuth2FA)。
  • 如果您使用的是无 Cookie 嵌入,请保护会话引用令牌,以便其仅可在嵌入应用主机服务器中访问。会话引用令牌绝不应在浏览器中公开。
  • 如果您使用不使用 Cookie 的嵌入方式,并在获取不使用 Cookie 的会话时设置了允许的嵌入网域,切勿信任嵌入用户的浏览器中的来源。在嵌入应用服务器中始终维护嵌入用户到嵌入用户的可信来源的映射。

Looker 提供不同类型的嵌入方法,具体取决于访问数据的用户所需的身份验证级别:公开私有签名嵌入。采用这些方法,您都可以使用 JavaScript 与 iframe 互动。

公开嵌入

启用 Look 的公开访问选项后,您可以使用 HTML iframe 标记将可视化图表或数据表嵌入到外部网站中。您还可以公开共享 Look 网址,或将数据导入 Google 或 Excel 电子表格应用。

iframe 标记中的网址和嵌入网址包含一个无法猜测的随机令牌,但任何拥有嵌入网址的任何人都可以访问相应数据,并且系统不会应用额外的过滤或限制。在启用公开网址之前,我们建议您先考虑为指定 Look 创建和共享公开网址会对安全造成的影响。

公开网址和公开嵌入网址永不过期且无法撤消。分享公开网址时,您分享的是查询,而不是实际数据

私有嵌入

如果您不想允许公开访问您的 Look,也可以在 iframe 中以私密方式嵌入 Look(或者探索信息中心),这样用户需要登录 Looker 才能查看相应内容。

通过身份验证的用户只能访问根据所分配的 Looker 权限所规定的内容。如果您在 Looker 中更改其权限,嵌入网址不会更改,但用户在访问该网址时可以查看的内容可能会发生变化。

如果用户未通过身份验证,您可以在 iframe 中显示错误或登录屏幕。但是,在 iframe 中启用登录屏幕与 Looker 的同源保护功能不兼容。

不公开的嵌入网址永不过期且无法撤消。不过,由于此链接仅适用于有权访问您的 Looker 实例及相应数据的用户,因此发送链接应该不会引起安全隐患。

签名嵌入

与 Google Cloud 销售专员联系,更新此功能的许可。

签名嵌入使私密嵌入更进了一步。签名嵌入不要求用户使用 Looker 用户帐号进行身份验证。您可以改为通过自己的应用使用 iframe 中的网址对他们进行身份验证。身份验证会创建一个新的浏览器会话,并向浏览器发出 Cookie。

用户权限、标识符和属性都将作为参数在网址中传递,该网址使用密钥进行签名。任何有权访问密钥的人都可以创建一个网址,以任何用户的身份使用任意权限来访问 Looker 实例所关联的任何模型。请参阅我们的示例代码,了解如何生成签名网址。

点击劫持是一种浏览器安全问题,如果嵌入的代码或脚本在用户不知情或未许可的情况下执行某项功能(例如,某个按钮看上去执行了其他操作),就可能会发生此类问题。点击劫持通常需要静态网址。为已签名的嵌入生成的网址是保密网址,只有查看嵌入内容的用户才能获取该网址。使用签名嵌入不会增加外部网站的点击劫持风险。

签名嵌入参数

iframe 网址中包含的参数对嵌入用户可见,但无法修改。这些事实可能包括:

  • user_attributes:用于进一步过滤数据。user_attributes 功能强大,因此请考虑将其如何应用于您的 Looker 实例。
  • session_length:尽量缩短所需的时间。

某些参数(例如 user_attributes)可以在界面中隐藏,但仍会在嵌入网址中进行编码。例如,如果密码是用户的 user_attribute 中的值,则可能不希望出现这样的情况。解决此问题的一种方法是,构建一个临时群组,将密码设置为群组级属性,然后在嵌入网址中传递群组 ID。您可以在嵌入会话后删除相应群组,以避免过多的流失群组。

网址的签名部分包含时间戳。使用网址登录后,该时间必须与当前时间相差 +/- 5 分钟。您可以在 session_length 中指定嵌入会话从使用网址登录时起可以持续的时长。

管理已签名的嵌入访问权限

当为嵌入的内容构建网址时,请执行以下操作:

  • 使用必要的最低级别的权限
  • 请仅分配用户应有权访问的特定模型的访问权限。
  • 使用 group_ids 可将用户分配给群组,并允许嵌入用户控制其 Looker 文件夹的访问权限。

Looker API

借助 Looker 的 API,您可以使用代理应用或反向代理服务器实现对嵌入内容的访问权限。在这种情况下,身份验证是使用 API 密钥执行的,API 密钥与特定用户绑定,且与生成密钥的用户具有相同的权限。API 密钥由客户端 ID 和客户端密钥组成。

使用 API 管理嵌入访问权限

使用 Looker 的 API 启用对嵌入内容的访问权限时,我们建议:

  • 创建用于程序化 API 访问的专用服务帐号,其中包含一组最低限度的必要权限。
  • 保护构成 API 密钥的客户端 ID 和客户端密钥(如果使用 SDK 进行身份验证)。

下次访问已签名的嵌入网址时,如果用户使用 API 为嵌入用户设置了未在签名嵌入网址中指定的任何用户属性,则这些属性会重置为默认值。

嵌入式 JavaScript 事件

设置嵌入 iframe(公开、私密、使用签名嵌入或通过 API)后,您可以使用 JavaScript 与该 iframe 进行交互。如需验证您处理的信息是否确实来自 Looker 的 iframe,您可以监听 JavaScript 事件

将网域添加到许可名单时,可以使用通配符来仅允许特定子网域访问您的 JavaScript 事件。

如果使用 JavaScript eval 函数,请确保 eval 参数中的字符串值来自可信来源(例如 Looker 服务器或 CDN),并且采用 HTTPS 传输机制。

没有任何客户数据经过 Looker CDN。CDN 仅提供 Looker Web 应用静态资源(JavaScript 代码、HTML 页面、CSS 样式)。

客户托管的部署

托管您自己的 Looker 实例似乎是一种万无一失的方法来锁定数据(尤其是嵌入式内容)访问权限。但是,如果您的用户需要通过互联网访问嵌入网址,自行托管 Looker 并没有任何特殊优势。

在以下情况下,由客户托管的部署可能最为合适:

  • 您的用户无需通过互联网访问 Looker。
  • 您正在使用前端 Looker,并使用 API 访问嵌入式内容。