借助 Looker 嵌入式分析,您可以让用户和客户探索在任何 HTML 格式的网页、门户或应用中嵌入 iframe 的数据。iframe 会执行整个 Looker 应用,只请求显示查询所需的数据。根据设计,iframe 不能读取您的外部网站或应用中的数据,也不能向您的外部网站或应用写入数据。
嵌入数据有时可能会带来隐私或安全问题。为缓解这些问题,我们建议 Looker 管理员遵循以下最佳实践:
- 如果您要向客户嵌入 Looker 内容,请在与用于内部分析的实例不同的 Looker 实例中设置客户内容。
- 请仅将数据连接到嵌入用户(可能为公众)应能访问的 Looker 嵌入式实例。
- 将公开嵌入网址中的随机令牌视为用户凭据进行保护,并在未使用公开网址时将其停用。
- 对于每组给定的权限、用户属性和模型,分配的
external_user_id
值必须是唯一的。确保您不会在不同的嵌入会话中为不同的互动用户使用相同的external_user_id
,也不会为具有不同权限、用户属性值或模型访问权限的单个用户使用相同的external_user_id
。 - 启用封闭系统。
- 请像保护嵌入式 Looker 实例的管理员凭据一样保护已签名的嵌入密钥,如果您不使用已签名的嵌入,请将其停用。
- 为 Looker 嵌入式实例使用强效身份验证(已签名嵌入、SAML、Google OAuth、2FA)。
- 如果您使用的是无 Cookie 嵌入,请保护会话引用令牌,以便其只能在嵌入应用主机服务器中访问。会话引用令牌绝不应在浏览器中公开。
- 如果您在获取无 Cookie 会话时使用无 Cookie 嵌入并设置允许的嵌入网域,请勿信任嵌入用户浏览器中的来源。始终在嵌入式应用服务器中维护将嵌入用户与嵌入用户的可信来源进行映射的操作。
Looker 提供不同类型的嵌入方法,具体取决于访问您数据的用户所需的身份验证级别:公开、私享和已签名嵌入。通过上述任一方法,您都可以使用 JavaScript 与 iframe 进行交互。
公开嵌入
启用数据探索的公开访问选项后,您可以使用 HTML iframe 代码将可视化图表或数据表嵌入到外部网站中。您还可以公开分享 Look 网址,或将数据导入 Google 表格或 Excel 电子表格应用。
iframe
标记中的网址和嵌入网址包含随机令牌,无法被猜到,但拥有嵌入网址的任何人都可以访问数据,并且系统不会应用任何其他过滤或限制。我们建议您在启用公开网址之前,考虑为给定外观创建和共享公开网址的安全影响。
公开网址和公开嵌入网址永不过期,也无法撤消。共享公开网址时,您共享的是查询,而不是实际的数据。
不公开嵌入
如果您不想允许公众访问您的外观,还可以将外观(或探索或信息中心)以私密方式嵌入 iframe 中,这样查看者就必须登录才能查看内容。
经过身份验证的用户只能访问其所分配的 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。
- 您将 Looker 用作前端,并使用 API 访问嵌入的内容。