借助 Looker 嵌入式分析,您可以让用户和客户探索在任何 HTML 格式的网页、门户或应用中嵌入 iframe 的数据。iframe 会执行整个 Looker 应用,仅请求显示查询所需的数据。根据设计,iframe 不能读取您的外部网站或应用中的数据,也不能向您的外部网站或应用写入数据。
嵌入数据有时可能会带来隐私或安全问题。为缓解这些疑虑,我们建议 Looker 管理员遵循以下最佳实践:
- 如果您要向客户嵌入 Looker 内容,请在与用于内部分析的实例不同的 Looker 实例中设置客户内容。
- 仅将数据连接到嵌入式用户(可能是公众)应该可以访问的 Looker 嵌入式实例。
- 像保护用户凭据一样保护公开嵌入网址中的随机令牌,并在不使用公开网址时将其停用。
- 分配的
external_user_id值对于每组给定的权限、用户属性和模型必须是唯一的。确保您没有针对不同的互动用户在不同的嵌入会话中使用相同的external_user_id,并且确保您没有针对具有不同权限、用户属性值或模型访问权限的单个用户使用相同的external_user_id。 - 启用封闭式系统。
- 请像保护嵌入式 Looker 实例的管理员凭据一样保护已签名的嵌入密钥,如果您不使用已签名的嵌入,请保持其处于停用状态。
- 为 Looker 嵌入式实例使用强身份验证(签名嵌入、SAML、Google OAuth、双重身份验证)。
- 如果您使用的是无 Cookie 嵌入,请保护会话引用令牌,使其只能在嵌入式应用宿主服务器中访问。会话引用令牌绝不应在浏览器中公开。
- 如果您使用的是无 Cookie 嵌入,并且在获取无 Cookie 会话时设置了允许的嵌入网域,则绝不要信任来自嵌入用户的浏览器的来源。始终在嵌入式应用服务器中维护嵌入式用户与嵌入式用户可信来源的映射。
Looker 提供不同类型的嵌入方法,具体取决于访问您数据的用户所需的身份验证级别:公开、私密和签名嵌入。通过上述任一方法,您都可以使用 JavaScript 与 iframe 进行交互。
公开嵌入
如果 Look 的公开访问选项处于启用状态,您可以使用 HTML iframe 标记将可视化图表或数据表嵌入到外部网站中。您还可以公开分享 Look 网址,或将数据导入到 Google 或 Excel 电子表格应用中。
iframe 标记中的网址和嵌入网址包含随机令牌,无法猜测,但拥有嵌入网址的任何人都可以访问数据,并且不会应用任何额外的过滤条件或限制。我们建议您在启用公开网址之前,先考虑为指定 Look 创建和共享公开网址所带来的安全隐患。
公开网址和公开嵌入网址永不过期,也无法撤消。当您共享公开网址时,共享的是查询,而不是实际的数据。
不公开嵌入
如果您不想允许公开访问 Look,还可以将 Look(或 Explore 或信息中心)以私密方式嵌入 iframe 中,这样一来,用户必须登录 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 中指定嵌入会话从网址用于登录时起可以持续多长时间。
管理已签名的嵌入访问权限
在为嵌入式内容构建网址时:
Looker API
借助 Looker 的 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。只有 Looker Web 应用静态资源(JavaScript 代码、HTML 网页、CSS 样式)通过 CDN 提供。
客户托管式部署
自行托管 Looker 实例似乎是锁定数据访问权限(尤其是嵌入式内容)的万无一失的方法。不过,如果用户需要通过互联网访问嵌入网址,自行托管 Looker 就没有任何特殊优势。
在以下情况下,客户托管部署可能最适合:
- 您的用户无需使用互联网即可访问 Looker。
- 您正在使用 API 前端处理 Looker 并访问嵌入式内容。