架构
组件与数据流
每一个活动部件、它运行在哪里,以及它们之间的每一条连接,包括所用的协议和每一方使用的凭据。
本文描述截至 2026年10月3日 已实现的 LayerT。尚未实现的内容均已标注。
浏览器端
LayerT 的浏览器端是一个 Manifest V3 扩展程序。您的 MDM 使用适用于 macOS 和 Windows 的 Chrome 企业策略文件安装它,并将其图标固定到工具栏(也有适用于 Linux 的文件)。同一策略会关闭无痕模式、访客模式和 Chrome 自带的密码管理器;在 Windows 上,它会将 LayerT 添加到您其他强制安装的扩展程序中,而不是替换它们。人员也可以使用自己的工作账号,在浏览器中自行设置 LayerT。
此后,无论 LayerT 以何种方式安装,每个新浏览器都要等待所有者或 IT 管理员批准。在获得批准之前,它得不到任何规则,也不能使用共享账号。
| 部分 | 是什么 | 说明 |
|---|---|---|
| Service Worker | 扩展程序的后台进程 | 保存浏览器自己的签名密钥及其短期令牌,获取并校验签名策略,批量上报审计事件,代理共享账号授权,运行会话到期计时器 |
| 内容脚本 | Chrome 在每个页面的隔离环境(isolated world)中运行的脚本 | 与页面自身的 JavaScript 相互隔离。它们只读取您的规则指定的字段中的值,检查交给文件规则所指定位置的文件,并填写共享账号登录信息 |
| 页内提示 | 阻止卡片、通知、账号菜单和会话标签 | 绘制在封闭的 Shadow Root 中,因此页面脚本无法读取或更改其样式。按钮只响应真实的点击和按键。它们使用系统字体,因此 LayerT 绝不会向其他公司的页面加载网络字体 |
| 账号菜单框架 | 在提示内以框架形式显示的扩展程序页面 | 共享账号列表位于扩展程序自己的源(origin)中,而不在页面中 |
| 工具栏弹出窗口 | 启动器、审批和快速添加 | 一个扩展程序页面;绝不属于任何网站 |
页面无法伪造的信任标识. 只要某个标签页上显示着 LayerT 提示,LayerT 就会在自己的工具栏图标上点亮一个琥珀色圆点。网站可以模仿提示的外观,但无法在浏览器工具栏中绘制内容。LayerT 提示也从不索要密码,并且有一项测试确保任何提示都不包含密码字段。
LayerT 云端
| 部分 | 是什么 | 说明 |
|---|---|---|
| 控制台和 API | 一个 Web 应用 | 管理控制台、扩展程序的 API、SCIM 2.0 服务器和 OpenID Connect 客户端 |
| Worker | 一个没有公网地址的独立服务 | 运行定时任务并发送通知 |
| 运营控制台 | 供 LayerT 员工使用的独立站点 | 创建和管理组织。员工只有在获得该组织批准后才能查看组织内部(见身份、租户与角色) |
| Postgres | 记录系统 | 签名策略版本、审计事件、目录数据、请求和会话。共享账号密钥以密文形式保存在单独的表中 |
| 对象存储 | Google Cloud Storage | 仅存放会话录制,在设备上加密后再上传。存储桶中从不保存明文 |
| 密钥服务 | 云端密钥服务 | 使用 Ed25519 为每个策略版本签名,并封装用于密封每个共享账号密钥和每段录制的密钥。密钥可以通过该服务使用,但永远无法从中复制出来。策略签名密钥受软件保护:该服务只以软件形式提供这种类型的密钥,而不在硬件安全模块中提供。已构建,并已在 LayerT 的测试环境中使用。生产环境将使用 Google Cloud KMS,目前未部署 |
| 定时任务 | Worker 上的周期性任务 | 关闭过期的请求和会话、执行保留期限、在策略过期前重新签名、目录变更后重建策略、发送通知和提醒、检查网关健康状况 |
托管. LayerT 尚未投入生产。目前它运行在只保存模拟数据的测试环境中。投入生产后,它将运行在位于欧盟的 Google Cloud 上,区域为米兰(
europe-west8),其密钥和数据库备份保存在 Google 的欧盟多区域(multi-region)中。Cloudflare 将负责 DNS 并发送通知邮件。服务提供方列于数据处理。目前尚不提供其他数据驻留选项。LayerT 之外
| 部分 | 归属 | LayerT 如何使用它 |
|---|---|---|
| 您的身份提供商 | 您 | 通过 SCIM 2.0 向 LayerT 发送人员和组,并通过 OpenID Connect 让管理员和人员登录。为 JumpCloud 构建 |
| 您的 MDM | 您 | 推送 Chrome 策略,用于安装 LayerT、固定其图标,并告诉它所属的组织 |
| 您的网关 抢先体验 | 您 | 您租用的小型服务器。开启了路由的共享账号会让它自己的网站经由其中一台访问,因此供应商看到的是一个地址。LayerT 从外部检查每个网关,并告诉它接纳哪些连接。LayerT 不运行网关 |
| 员工使用的网站 | 供应商 | LayerT 读取并填写这些网站上的表单。它从不更改供应商的服务器或流量 |
数据流
以下每一条数据流都通过 HTTPS 传输。
| 数据流 | 方向 | 传输内容 | 身份验证方式 |
|---|---|---|---|
| 目录同步 | 身份提供商 → API | 人员、组、在职状态(SCIM 2.0) | LayerT 签发的 SCIM 令牌,仅以哈希形式保存 |
| 控制台登录 | 浏览器 ↔ API ↔ 身份提供商 | OpenID Connect 授权码流程 | 签名的 ID 令牌,依据提供商公布的密钥进行校验 |
| 控制台使用 | 浏览器 → API | 决定、规则、设置 | 服务器端会话,每次请求都重新检查 |
| 注册 | 扩展程序 → API → 身份提供商 | 人员登录一次。浏览器发送它自己生成的密钥的公钥部分,证明它持有私钥部分,并获得一个短期设备令牌。随后它等待管理员审批 | 身份提供商的登录,以及由浏览器的密钥生成的签名 |
| 令牌续期 | 扩展程序 → API | 一个新的短期设备令牌 | 由浏览器的密钥签名的证明,依据 LayerT 在注册时保存的公钥进行校验 |
| 策略同步 | API → 扩展程序 | 贵组织的签名策略 | 设备令牌;策略本身在浏览器中使用 Ed25519 校验 |
| 人员所属的群组 | API → 扩展程序 | 此浏览器自己的使用者所属的目录群组,不含其他任何人的,以有效期 24 小时的签名应答形式提供 | 设备令牌;该应答在浏览器中使用 Ed25519 校验 |
| 审计 | 扩展程序 → API | 关于阻止、匹配、审批和会话的事件,附带规则匹配到的值 | 设备令牌,必须与事件所属的设备一致 |
| 说明理由后继续 | 扩展程序 → API | 当事人越过阻止继续的理由,连同规则、页面和值。只有在服务器保存了它之后,该操作才会继续 | 设备令牌;当事人的身份取自令牌,从不取自页面 |
| 请求与授权 | 扩展程序 ↔ API | 访问请求、决定、共享账号授权 | 设备令牌,绑定到具体人员和已注册的浏览器 |
| 录制 | 扩展程序 → API → 对象存储 | 加密的录制分块 | 设备令牌;分块已经加密 |
| 网关会话 抢先体验 | API → 扩展程序 | 对于已开启路由的账号:使用哪个网关、仅用于本次会话的凭据,以及供应商将看到的地址。其中不传输密码 | 设备令牌,绑定到该人员的活动会话 |
| 网关准入 抢先体验 | 网关 → API | 网关询问是否接纳每一个新连接 | 网关自己的密钥。LayerT 只就该网关所属组织的会话向它作出答复 |
| 定时任务 | Cloud Scheduler → Worker | 仅触发信号 | 由 Google 签名、属于调度器自身服务账号的身份令牌 |
| 登录结果 | 扩展程序 → API | 共享账号登录是否成功、在哪一步停止,以及不含查询字符串的页面地址。从不包含值、标签或页面文本 | 设备令牌 |
| 设备信息 | 扩展程序 → API | 扩展程序版本、浏览器自己报告的安装方式、浏览器、操作系统和策略版本 | 设备令牌 |
| 版本检查 | 扩展程序 → API | 哪个 LayerT 版本是最新的。每个组织得到的答复都相同 | 无。该请求不携带凭据,也不携带任何关于人员的信息 |
| 通知 | Worker → 审批人 | 等待某人处理的请求、答复和警报,通过电子邮件、Slack 和扩展程序发送。不含密钥,也不含完整的值 | 电子邮件通过 SMTPS;Slack 通过其 API 和贵组织的 Slack 连接;扩展程序使用设备令牌 |
| Slack 中的决定 | Slack → API | 审批人对请求点击的批准或拒绝 | Slack 的请求签名,并在点击的那一刻再次检查审批人的权限 |
扩展程序发送什么,不发送什么
LayerT 只读取您的规则所指定的字段。规则匹配时,LayerT 会记录匹配到的内容,对于输入规则则会记录该字段的文字,以便审计人员核查这一判定。规则可以遮盖或隐藏其值。
- 当规则匹配时,它会发送审计事件:规则、页面地址、字段以及匹配的值。对于表单规则,值是该字段的文字;对于粘贴规则,值是粘贴的文字。审计人员正是借此看到某个个人邮箱地址被阻止了。
- 对于输入规则,值是规则匹配时该字段的全部文字,而不仅是匹配的部分,最多 10,000 个字符。
- 对于文件规则,它会发送文件的名称、类型和大小、文件交给页面的方式,以及 LayerT 是否能够读取它。文件中的文字在浏览器中读取以作出判断,从不发送。
- 浏览器始终发送完整的值。 规则的遮盖或隐藏其值的设置是在 LayerT 的服务器上、在存储任何内容之前应用的。值不会在浏览器中脱敏。
- LayerT 填写的密码或验证码从不会被任何规则读取,因此没有任何内容可发送。输入规则完全不读取密码框或一次性验证码框。表单或粘贴规则读取它所指定的字段,其中可能包括某人自己输入了内容的密码框。
- 它会发送附有人员理由的访问请求;当某个共享账号开启录制时,它会发送加密的录制分块。
- 在规则允许的情况下,它会发送当事人为越过阻止继续而给出的理由。
- 它会报告每次共享账号登录是否成功,以及浏览器的基本信息,以便 IT 了解哪些笔记本电脑受到保护。这些报告不包含输入的值,也不包含页面文本。
- 等待发送的事件会保存在扩展程序的存储中,直到送达为止,其中可能包含匹配到的值。
- 它不发送页面。在录制的共享账号会话之外,它发送的页面内容只有规则所匹配字段的文字,并且不发送在您的规则未指定的字段中输入的任何内容。它从不发送浏览历史、已访问页面的列表或 Cookie 值。在录制的会话中,人员输入的内容在输入位置被遮盖,即在表单字段和富文本编辑器中,录制仍会显示页面回显的内容:详情见会话与录制。