架构
共享账号
LayerT 将团队的共享登录信息密封保存,让合适的人在规定时间内使用它们,并为他们填写供应商的登录表单。任何人都不需要知道密码。
本文描述截至 2026年10月3日 已实现的 LayerT。尚未实现的内容均已标注。
存储密钥
密码、验证器(TOTP)设置密钥和保密的登录字段使用 AES-256-GCM 信封加密:
- 每个共享账号都有自己的随机 256 位数据密钥。每个密钥(secret)都在该数据密钥下使用各自的随机 nonce 加密。
- 数据密钥本身由保存在密钥服务中的密钥加密密钥进行加密(“封装”)。该服务按请求解封,从不交出密钥加密密钥,并记录每一次使用。此功能已构建,并已在 LayerT 的测试环境中使用,那里的共享账号都是练习网站的账号。生产环境将使用 Google Cloud 的密钥服务,目前未部署。
- 只存储密文,保存在单独的表中,与账号设置分开。删除账号会同时删除其密钥。
- 更改密码会在新的数据密钥下重新加密两个密钥,并被记录。
谁可以使用账号
| 控制项 | 工作方式 |
|---|---|
| 访问权限 | 授予目录组、角色或指定人员。组成员关系通过 SCIM 从您的目录获取 |
| 敏感级别 | 低、中或高。默认情况下,中级和高级账号每次使用前都需要审批人批准。只有 IT 可以将账号标记为高级 |
| 审批 | 请求在 30 分钟后过期。任何人都不能审批自己的请求。批准时会重新检查申请人是否仍在职、是否仍有权使用。如果两位审批人同时做出决定,只有一个决定有效 |
| 同一时间只有一人持有 | 可选,按账号设置。第二个人会看到谁正在使用以及使用到何时 |
| 会话时长 | 按账号设置,默认 1 小时。可以延长,但从批准起总计不超过 8 小时 |
让人员登录
- 浏览器选择人员从字段中的 LayerT 图标或工具栏启动器中选择账号。
- LayerT 云端检查会话必须处于活动状态,属于此人和这个已注册并已获批准的浏览器,并且此人必须仍在职且仍有权使用。
- LayerT 云端解密只有这时,密码才会在内存中解密,并通过 HTTPS 返回一个授权。
- 浏览器匹配网站只有当页面是该账号的确切网站之一时,扩展程序才会交出授权。位于框架内的表单还必须通过下文的框架规则。
- 页面填写扩展程序从 Chrome 的隔离环境中填写供应商自己的表单。LayerT 从不显示密码。
确切网站规则
共享账号绑定到确切的网站:协议、主机和端口必须完全匹配,不允许通配符。一个账号可以列出多个网站,但每一个都必须是确切的。必须使用 https。浏览器会检查页面,LayerT 的 Service Worker 会使用 Chrome 为发起请求的框架报告的地址再次检查,而不是依据页面自称的任何信息。仿冒域名什么也得不到。
框架内的登录表单
有些网站把登录表单显示在来自同一公司另一个地址的框架中,因此页面本身没有可填写的内容。LayerT 会在那里找到表单,像往常一样在页面中提供账号,填写该框架,并在页面上说明该表单属于哪个地址。只有当以下条件全部成立时,它才会填写框架:
- 顶层页面是该账号指定的地址,按上文方式完全匹配;
- 框架与该页面属于同一网站,使用
https,它们之间的每一层框架也是如此; - 框架未被沙盒化;并且
- 框架可见。无人能看到的框架从不会被填写。
来自无关网站的框架会被拒绝,LayerT 会说明原因。对于值得多花一些设置功夫的登录,账号也可以设置为对框架同样要求确切地址。LayerT 从不替框架中的表单按下登录按钮。
当账号经由网关出去时 抢先体验
对于开启了网关路由的账号,先有会话,后有页面。LayerT 启动会话,把该账号的网站切换到其网关,然后才加载登录页面。如果当事人是在自己打开的登录页面上选择了该账号,LayerT 不会填写那个页面:它会启动路由,清除该账号的 Cookie,经由网关重新加载该页面,并在那里填写。详情和局限见会话与录制。
保护账号菜单
账号列表是一个显示在封闭 Shadow Root 内的扩展程序页面,因此网站无法读取它或更改其样式。它只接受真实的点击,并且只在完全可见一小段时间之后才接受,以防范将菜单滑到光标下方的伎俩。这降低了点击劫持的风险,但并未消除风险。如果页面移动、遮挡或更改其样式,它会关闭。账号也可以设置为只能从工具栏启动,从而完全关闭页内菜单。
提交表单
自动提交默认关闭。只有在账号通过测试登录之后,账号负责人才能开启它;发布新的登录配方会再次将其关闭。即使开启,LayerT 也只在以下条件全部满足时才提交:人员明确选择了该账号、位于确切的网站、处于顶层框架、所有已填写的字段仍然可见,并且绝不会在页面加载时提交。遇到 CAPTCHA 时,LayerT 会暂停,并交由人员处理。
验证器代码
LayerT 在其服务器上生成验证器代码(RFC 6238)。只有当前的六位代码会在需要时发送到浏览器,并像密码一样被填写。审计日志记录的是使用了代码这一事实,从不记录代码本身。
如果代码未能填入,持有会话的人可以在 LayerT 工具栏弹出窗口中查看并复制当前代码。其他任何人都不能查看,并且每次查看都会被记录。
设置密钥(TOTP 种子)保存在 LayerT 的服务器上。查看它的唯一方式是提交一个由两人批准的密码请求,其中一人必须是所有者或合规官。它只显示一次(见密码请求)。
通过电子邮件发送的验证码
有些供应商会在登录时,或在不认识当前浏览器时,通过电子邮件发送验证码。如果这封邮件发到 vendors@ 这样的团队地址,所有者或 IT 管理员可以将该邮箱连接到 LayerT,并将其关联到邮件会发到这里的共享账号。
- 在源头只读。 LayerT 通过 IMAP 读取邮箱,只使用一小组只读命令。它从不将邮件标记为已读,也从不移动、删除或发送任何内容。
- 仅限组织邮箱地址。 连接邮箱时,所有者需确认这是共享地址或角色地址,而不是某个人的个人邮箱,并确认读取它的合法依据。
- 只有登录邮件,只在会话期间。 仅有验证码访问权限的人,只能看到其当前登录账号的登录邮件,并且只限在其会话期间收到的邮件。验证码通常在邮件到达后两到三秒内出现在弹出窗口中;如果账号的登录步骤在等待邮件验证码,LayerT 会自动填写。
- 重置邮件交给负责人。 密码重置和账号变更邮件从不向仅有验证码访问权限的人显示,即使它来自该账号自己的供应商。账号负责人会在收件箱中收到通知。未通过发件人检查的邮件从不显示。
- 负责人可以教它识别。 每个账号都可以设置规则,指定发送其验证码的发件人。在设置规则之前,LayerT 根据邮件措辞识别登录邮件,这只是一种尽力推测。
读取整个邮箱
完整访问是一项单独的授权,其运作方式与敏感共享账号相同:默认需要审批,默认持续 30 分钟,并显示在“会话”中。邮箱在控制台中以只读方式显示,并带有阅读者姓名的水印。每一封被打开的邮件都会被记录。邮件显示时会关闭脚本、表单和远程内容,链接会经过一个显示真实目标地址的页面,附件会列出,但除非贵组织允许,否则无法下载。
设备信任
会话结束时,LayerT 会清除该网站的 Cookie,从而让人员退出登录。这也会清除供应商“记住此设备”的 Cookie,因此每次登录都可能看起来像一台新设备。账号可以指定要保留的 Cookie。只有在一次测试登录证明安全之后,LayerT 才会保存该列表:在模拟会话结束后,登录页面必须再次出现。如果没有出现,该列表会被拒绝,并提示“保留这些 Cookie 会让人员保持登录状态。”
登录字段与备注
有些网站需要的不只是用户名和密码,例如账户 ID、组织 ID 或 PIN。一个账号可以保存额外的登录字段。新字段默认为保密字段:保密字段像密码一样被密封,并且只会填入密码类型的输入框。显示字段(例如 AWS 账户 ID)对可以使用该账号的人可见。额外字段由账号的登录配方填写,从不靠猜测。
每个账号还有备注,用于记录人员需要了解的事项(“使用新加坡区域”、“不要勾选记住我”),每条备注都有作者和编辑历史。
人员能看到什么、不能看到什么
在登录过程中,LayerT 从不显示密码。它不会出现在启动器、菜单、通知或审计日志中,LayerT 也从不将其保存在浏览器中。无论规则指定了哪些字段,任何规则都不会读取 LayerT 填写的密码或验证码,因此规则的记录中也不可能有它。唯一的例外是下文的密码请求。
结束会话
- 按时结束。 在结束前一分钟,LayerT 会提供延长或立即退出登录选项。到时后,它会清除该网站的 Cookie 和该标签页的网站存储,从而使人员退出登录。
- 由管理员结束。 所有者或 IT 管理员可以在控制台中结束正在进行的会话,并注明原因。LayerT 会立即拒绝该会话的后续授权,人员的浏览器会在大约一分钟内退出登录。他们会被告知会话已由管理员结束,但不会被告知是谁或原因。
- 在人员离职时。 当您的目录停用某人或将其从某个组中移除时,LayerT 会在所有地方关闭其请求和会话。
设置账号
- 检测。 LayerT 会自动查找登录字段。在无法确定时,它会请人员指出字段,并将其保存为建议的修正,供账号负责人审核。它从不自动应用于其他任何人。
- 录制配方。 对于多步骤登录,负责人只需录制一次步骤。配方存储的是字段的位置,从不存储输入的内容。
- 测试登录。 仅限负责人执行、并会被记录的一次运行,用于在开启自动提交之前证明配方有效。
- 其他网站。 一个账号可以列出它使用的其他网站,例如单独的登录地址,每行一个确切的地址。
- 签名配方。 每个配方在运行前都会进行签名检查。如果检查失败,LayerT 会退回到自动检测,绝不提交表单,并报告原因。
- LayerT 自带的配方。 对于某些网站,LayerT 自带已签名的配方,账号的“登录”选项卡会说明使用的是哪个配方。这些配方是在虚构的供应商网站和仿制网站上测试的。
- 登录健康状况。 控制台会按网站和账号,以文字形式显示过去 7 天、30 天或 90 天内哪些登录成功,以及其他登录在哪一步停止。
- 导入。 管理员可以从 JumpCloud Password Manager 的导出文件中导入账号。文件在管理员的浏览器中读取;预览从不显示密码,所创建的账号随后会像其他账号一样在 LayerT 的服务器上密封保存。每次导入都会被记录。
密码请求
有时,某人确实需要查看密码、设置密钥或保密字段:例如交给供应商的支持团队,或设置一台新设备。
- 控制台申请人员提出申请并说明原因。所有者和 IT 管理员可以针对任何账号提出申请;其他人只能针对自己可以使用或负责的账号提出申请。
- 控制台两人批准由申请人以外的两个人批准,其中一人必须是所有者或合规官。这类请求不能在 Slack 中或通过电子邮件做出决定。
- 控制台查看一次在一小时内,如果申请人上次登录已超过 10 分钟,需要重新登录,然后可查看该值一次。第二次查看会被拒绝。
- LayerT 云端标记为已查看该值被标记为已查看。所有者、合规官和账号负责人会收到警报,账号负责人会被要求在供应商处更改该值。
紧急访问导出
用于灾难恢复的离线导出是加密的,需要两名保管人各自使用自己的密码短语才能打开。生成导出会被记录。
限制
- LayerT 从不替框架内的表单按下登录按钮:它负责填写,由当事人提交。来自无关网站的框架、被沙盒化的框架和无人能看到的框架都会被拒绝。
- 不支持绘制在 canvas 上的表单,或位于网站自身封闭 Shadow Root 内的表单。
- LayerT 目前还不会自动轮换密码。
- 不处理通过短信发送的验证码或推送审批。通过电子邮件发送的验证码可以处理,前提是接收地址是已连接的共享邮箱。
- 密码请求会在值被查看后立即发送警报。导出目前还不会发送警报 提议中;它们记录在审计日志中。