架构
签名策略与执行
规则在控制台中编写,作为一个签名版本发布,由每个浏览器校验,并在表单发送之前在页面中执行。如果浏览器无法证明其策略是最新的,它会故障时默认阻止(fail-closed)。
本文描述截至 2026年10月3日 已实现的 LayerT。尚未实现的内容均已标注。
策略的生命周期
- 控制台起草IT 以草稿形式编写或修改规则。此时还不会下发到任何浏览器。
- 控制台发布发布会将所有待处理的草稿合并应用为一个新版本。可选的双人审阅可防止有人发布自己的草稿。
- LayerT 云端签名该版本被序列化为规范 JSON(canonical JSON),并使用 Ed25519 签名。
- 浏览器获取每 15 分钟一次,另外在启动时和页面跳转后获取,使用条件请求。
- 浏览器校验在使用任何一条规则之前,都会检查签名、密钥、组织、版本和有效期。
- 页面执行规则在网站自身代码运行之前作用于表单提交和粘贴操作。针对文件和输入文字的规则同样在页面中执行。
什么是规则
一条规则说明它何时采取行动、适用于哪里、监视哪些字段、什么值会触发它,以及会发生什么。
| 部分 | 选项 |
|---|---|
| 何时 | 五种触发方式之一,列于下一张表中 |
| 哪里 | 网站匹配模式:精确 URL、通配模式(如 https://*.postbox.example/*)或正则表达式 |
| 哪些字段 | 该页面上字段的 CSS 选择器。管理员可以使用扩展程序的选取器直接在页面上点选来生成 |
| 什么值 | 针对触发方式所读取的值的条件:等于、匹配某个模式、电子邮件域名、属于某个列表,以及用与/或/非进行组合。条件还可以与人员自己的目录身份进行比较,例如“只允许其本人的工作邮箱” |
| 适用于谁 | 条件也可以针对人员而不是值:当在该浏览器中登录 LayerT 的人属于您指定的某个目录群组时,条件成立,而不论其输入了什么。放在“非”之下时,它对该群组之外的所有人成立 |
| 会发生什么 | 监视(仅记录)、阻止、阻止并允许申请(人员可以申请访问),或强制退出登录(清除该网站的 Cookie 和存储,然后显示已退出登录页面) |
对于表单或粘贴规则,还有一种操作:阻止,人员可在说明理由后继续。详见说明理由后继续。
在规则指定之前,LayerT 不监视页面上的任何内容。五种触发方式,以及每一种读取的内容:
| 触发方式 | LayerT 读取的内容 |
|---|---|
| 提交表单(submit 事件、提交按钮、在字段中按 Enter 键) | 规则指定的文本框和多行文本框 |
| 粘贴 | 规则指定的单行文本框 |
| 在字段中输入 | 规则指定的文本框、多行文本框和富文本编辑器。LayerT 在人员停止输入片刻之后读取该字段,并在文字即将发送时再读取一次 |
| 上传文件,按文件名 | 文件的名称,当文件通过文件选择框、拖放或粘贴交给页面时 |
| 上传文件,按文件中的文字 | 不超过 1 MB 的纯文本文件中的文字,在浏览器中读取 |
被阻止规则匹配的文件从不会到达页面。针对文件文字的规则还会拦下 LayerT 无法读取的文件(图片、PDF、Office 文档、压缩包、文件夹、任何超过 1 MB 的文件),并说明它无法检查该文件。
内置规则涵盖个人 Google 账号登录、Telegram Web 和 WhatsApp Web。规则编辑器只提供扩展程序实际执行的触发方式、检查和操作;已保存的规则如果使用了其他内容,会在其页面上说明。
规则看不到什么
- 网站自身的后台上传。 页面在没有表单、粘贴、输入字段,或通过文件选择框、拖放或粘贴交给它的文件的情况下自行发送的数据,不在任何规则的范围之内。
- 非纯文本文件的内部。 LayerT 不查看 PDF、Office 文件或图片的内部。针对文件文字的规则会拦下它们,但不读取它们。
- 已经离开的文字。 输入的文字从第一次按键起就在页面中,而边输入边发送的页面(搜索建议、自动保存的草稿)已经拿到了它。输入规则会告知当事人,并阻止这些文字通过表单、提交按钮或 Enter 键发送出去。它无法把文字收回来。
- 剪贴板。 粘贴规则对粘贴到规则指定的单行文本框中的内容采取行动。LayerT 不读取也不控制剪贴板。
- LayerT 填写的密码或验证码。 任何规则,无论采用哪种触发方式,都不会读取 LayerT 填写的密码、一次性验证码或机密登录字段,因此共享账号的密码不可能进入规则的记录。
- 对于输入规则:任何密码框。 输入规则从不读取密码框、一次性验证码框或 LayerT 填写的字段。表单或粘贴规则读取它所指定的字段,其中可能包括某人自己输入了内容的密码框。
- 现成的检测器。 没有针对银行卡号或证件号码的检查库。规则使用管理员编写的模式。
针对文件和输入的规则只是普通的阻止、警告或监视:它们不提供申请例外,也不提供说明理由后继续。
签名
每个已发布的版本都会以确定性的方式序列化(键按顺序排列,不含签名字段),并使用 Ed25519 签名。策略包含版本号、所属组织、签发时间和过期时间。
- 版本号只增不减。每次发布都会在加锁的情况下为贵组织取下一个编号,因此两位管理员无法发布同一个版本。
- 回滚会将旧规则作为一个新的、更高的版本发布。此后批准的例外会被保留,除非恢复后的规则不再允许它们。
- 签名密钥由密钥服务保管且无法导出:LayerT 的服务器向该服务请求每一次签名。该密钥受软件保护。该服务只以软件形式提供这种类型的密钥(Ed25519),因此它并不保存在硬件安全模块中。此功能已构建,并已在 LayerT 的测试环境中使用。生产环境将把该密钥保存在 Google Cloud KMS 中,目前未部署。开发构建使用本地密钥签名,而生产构建的扩展程序不信任该密钥。
浏览器收到的签名版本称为策略包。其中包含什么(包括其他人的允许列表和已批准的例外)、它在笔记本电脑上存放在哪里,以及控制这台笔记本电脑的人能对它做什么,请见策略包与设备失陷。
在浏览器中校验
扩展程序在使用每个策略之前,都会使用浏览器自身的 Web Crypto 实现对其进行检查。按顺序,出现以下情况之一时它会拒绝该策略:
- 其版本不比已有的版本新;
- 它属于另一个组织;
- 它使用扩展程序不认识的密钥签名;
- 签名无法通过扩展程序内置公钥的校验;或
- 按笔记本电脑的时钟,它已经过期。
被拒绝的策略会被丢弃,浏览器保留原有的策略。扩展程序可以同时内置多个公钥,因此签名密钥可以无缝轮换。
默认阻止
无法获得最新且真实策略的浏览器,不会悄悄停止执行策略。
- 策略在签发 7 天后过期,LayerT 会在此之前 48 小时自动重新签名。只有当浏览器已经连续数天无法连接 LayerT 时,才会遇到过期的策略。
- 在受阻止或强制退出登录规则覆盖的页面上,过期的策略会阻止所有表单提交,以及向该规则字段的所有粘贴,并显示一张“需要网络连接”卡片。卡片会说明发生了什么,并且只提供“返回”选项。
- 它还会在不读取任何内容的情况下,拦下交给文件规则所指定字段的文件,以及在输入规则所监视字段中按下的 Enter 键。
- 监视规则继续记录。
- 群组成员关系未知时同样默认阻止。 每个浏览器都会获得一份关于其使用者所属目录群组的签名应答,有效期 24 小时。没有当前有效应答的浏览器,会在阻止规则指定了群组的页面上拦下相应操作,就像其策略过期时一样,并立即再次向 LayerT 询问。
- 浏览器重新连接后,卡片会在大约 30 秒内自行消失,无需重新加载页面。
紧急停止
所有者可以为整个组织关闭所有执行。紧急停止本身也是一个签名策略版本,因此没有人能向浏览器发送伪造的停止指令。它会被记录,并通知所有者和 IT 管理员。它只会关闭执行:不存在反过来锁定一切的开关。
浏览器会在下一次同步时收到它:15 分钟之内,如果人员进行页面跳转则会更快。停止指令在策略中被标记为紧急,但目前扩展程序获取它的速度并不比其他变更更快。吊销浏览器和回滚也以同样的方式送达。
在页面中执行
LayerT 的内容脚本会在网站自身代码看到提交和粘贴之前进行监听。当规则匹配时,LayerT 会取消该事件,因此网站的请求永远不会发出。端到端测试会检查请求确实没有发出。
文件的处理方式相同:LayerT 在页面自身代码看到之前拦下文件选择框、拖放或粘贴,被阻止规则匹配的文件从不会到达页面。输入则不同,因为文字已经在页面中。此时 LayerT 会显示阻止提示,并阻止这些文字通过表单、提交按钮或 Enter 键发送出去。
LayerT 的提示在设计上使页面无法干扰它们:
- 它们绘制在封闭的 Shadow Root 中,页面脚本无法访问。
- 它们的按钮只响应真实的点击和按键,不响应脚本生成的事件。
- 它们从不显示规则的内部名称,而是显示管理员编写的消息。
- 它们从不索要密码,也从不包含密码字段。有一项测试会检查每个提示。
- 当页面上显示提示时,LayerT 工具栏图标会显示一个页面无法伪造的琥珀色圆点。
申请访问
如果规则允许,被阻止的人员可以申请访问。
- 浏览器申请人员说明原因。请求有截止时间,默认为 30 分钟。
- 控制台或弹出窗口决定审批人选择:单次尝试(五分钟)、15 分钟、1、8 或 24 小时,或永久。
- LayerT 云端应用批准会在一个原子步骤中成为新签名策略中的一个例外。
- 浏览器重试提示会自行更新。如果人员已经离开,桌面通知会告知他们。
- 任何人都不能审批自己的请求。服务器会拒绝这样的审批。
- 永久例外只能由合规官或所有者授予,IT 永远不能授予。
- 无人处理的请求会自动过期。
- 审批人会通过控制台收件箱、扩展程序,以及电子邮件、Slack 或浏览器通知得知请求,具体方式由每个人自行选择。他们可以在控制台中或直接在 Slack 中做出决定,在 Slack 中做出的决定会被如实记录。
说明理由后继续
对于表单或粘贴规则,管理员可以选择阻止(人员可在说明理由后继续)。当事人会看到阻止提示和一个填写理由的输入框。只有在服务器记录了理由之后,LayerT 才会放行该操作。
- 没有记录,就不能继续。 如果因为浏览器离线或无法连接到 LayerT 而无法记录理由,该操作保持阻止,卡片会保留已输入的内容。
- 不涉及审批人,也不会通知任何人。 在任何内容继续之前,理由会连同当事人的姓名一并记录。它会显示在规则命中的给出的理由下,也会出现在审计日志和导出文件中。
- 文件规则和输入规则不提供此选项。当浏览器的策略过期时,这条规则会像其他任何阻止一样默认阻止,且没有填写理由的输入框。
记录哪些内容
每一次阻止、警告、监视匹配和例外的使用都会生成一条审计事件,包含规则、页面地址、字段、匹配的值和人员。规则匹配时,LayerT 会记录匹配到的内容,对于输入规则则会记录该字段的文字,以便审计人员核查这一判定。规则可以遮盖或隐藏其值。
- 表单或粘贴规则记录该字段的文字,或粘贴的文字。
- 输入规则记录规则匹配时的整个字段,而不仅是匹配的部分,最多 10,000 个字符。更长的文字会在此处截断,记录中会注明这一点。
- 文件规则记录文件的名称、类型和大小、它交给页面的方式,以及 LayerT 是否能够读取它。文件中的文字在浏览器中读取以作出判断。它从不发送,也从不存储。
- 为越过阻止继续而给出的理由按当事人的原话记录。如果他们把被阻止的值写进了理由,而规则隐藏或遮盖值,那么它在理由中同样会被隐藏或遮盖。
- LayerT 填写的密码或验证码从不会被任何规则读取,因此不会记录任何内容。输入规则完全不读取密码框或一次性验证码框。
- 某人自己输入的密码会被指定了其输入框的表单或粘贴规则读取,并以可读形式记录,除非该规则设置为遮盖或隐藏其值。
- LayerT 为共享账号填写的用户名仍会由覆盖该页面的登录规则进行判定。该规则会放行这次登录,并将其记录为一次例外,同时记录用户名。如果当事人把它替换成自己的地址,那就是他们自己的文字,表单规则会读取它。
这些值默认保持可读,以便审计人员能看到被阻止的登录使用的是个人地址。每条规则可以选择审计日志保留其值的方式:按输入原样、部分遮盖,或完全不保留。浏览器始终发送该值,规则的设置在存储任何内容之前在服务器上应用。审计事件默认保留 365 天,每个组织都可以更改这一期限。