一、为什么无桌面工控场景必须上双因子
在工厂车间、轨交外场、军用指挥车、电力变电站这类环境里,操作终端通常只有一块串口屏、一个指示灯,甚至完全没有本地人机界面。这类“无桌面板”设备有几个共同特征:
- 终端常年在网运行,但物理环境无人值守,口令贴纸、弱口令、空口令泛滥;
- 现场经常断网、窄带或仅能通过远程接入通道管理,云端凭证服务不可达;
- 设备多运行在国产OS或裁剪版 Linux 上,标准桌面登录框架(GDM、LightDM、WinLogon)被替换为专用登录代理;
- 合规要求可追溯:谁、在什么时间、用什么因子、在哪台设备完成了解锁,必须留痕且防篡改。
仅依赖静态口令,既过不了等保2.0中“身份鉴别应采用两种或两种以上组合鉴别技术”的条款,也无法应对离线外场的应急解锁需求。因此必须把第二因子(国密USBKey、OTP、指纹、掌纹)嵌入操作系统登录流程,并且在断网情况下依然可用。
二、整体架构:把第二因子嵌进登录链
无论 Windows、Linux 还是国产OS,登录过程本质上都是“凭据采集 → 鉴别器校验 → 会话授权”三段式。双因子方案要做的,是在鉴别器环节插入国密校验模块,而不是在应用层另做一套门户。
以 Linux PAM 体系为例,登录链会经过auth栈。典型的无桌面终端只走login/sshd/gdm其中之一,我们需要把国密校验模块挂到auth与account两段:
# /etc/pam.d/industry-login (无桌面终端专用栈,节选) auth required pam_env.so auth [success=1 default=ignore] pam_andang_sla.so mode=gmf tlv=1 auth required pam_deny.so account required pam_andang_sla.so audit=on关键参数含义:
| 参数 | 取值 | 说明 |
|---|---|---|
| mode | gmf / otp / bio | 国密因子 / 动态口令 / 生物因子 |
| tlv | 0 / 1 | 是否启用 TLV 封装的离线校验包 |
| audit | on / off | 审计留痕开关 |
| pin_cache | 0-300s | 拔Key前的 PIN 缓存时长,0 表示每次校验 |
在 Windows 侧,第二因子以凭据提供程序(Credential Provider)形式挂入 WinLogon;国产OS(麒麟V10、统信UOS)则复用 PAM 体系,接口与 Linux 一致,差别只在 SM2/SM3/SM4 算法库的加载路径与内核模块签名。
以安当SLA为例,它的第二因子并不以一个独立的“登录软件”形态存在,而是作为登录流程里的鉴别插件,与系统原生登录框架共存:口令是第一因子,USBKey/指纹/OTP 是第二因子,两者在 PAM 或 Credential Provider 层做“与”判定。
三、四因子:国密USBKey / OTP / 指纹 / 掌纹
3.1 国密USBKey(主因子)
USBKey 内固化 SM2 密钥对,私钥不出 Key。登录时终端侧发送挑战随机数,Key 用 SM2 私钥对挑战值签名,系统侧用预置公钥验签。算法参数建议:
签名算法 : SM2 / SM2-with-SM3 摘要算法 : SM3 对称保护 : SM4-CBC,密钥由 PIN 派生 挑战随机数 : 16~32 字节,单次有效 验签超时 : 3000ms在工控外场,经常是“无网络 + 无服务器”的单机形态,此时验签公钥直接落在本地受保护存储(TPM 或加密分区),不依赖任何远端服务。
3.2 OTP(应急与远程接入)
OTP 用于无 Key、无生物模板时的兜底。种子分两段保存:一段写入 USBKey 安全区,一段由安全管理员离线分发。离线场景下,终端本地基于 SM3 做 HOTP/TOTP 计算,无需联网。远程登录安全的关键点在于:OTP 仅作为第二因子出现,不能单独放行。
# 离线 OTP 校验配置 [otp] algo = sm3-hotp digits = 8 counter = local # 本地计数,不回中心 window = 3 # 容错窗口 ±3 resync = manual # 失步后需管理员重置3.3 指纹(产线高频主力)
产线审核、供应链稽核场景里,指纹是最高频的因子。工程上要关注三个数字:拒真率(FRR)、认假率(FAR)、比对时延。在戴手套、沾油污的车间环境下,普通光学指纹头会显著抬高 FRR,因此要选半导体/射频式传感器并开启“多帧融合”:
| 指标 | 目标值 | 说明 |
|---|---|---|
| FAR | < 0.3% | 认假率,误识他人概率 |
| FRR | < 0.3% | 拒真率,本人被拒概率 |
| 比对时延 | < 300ms | 从按压到返回结果 |
| 模板大小 | 1~3KB | 国密加密后落本地 |
某苹果/小米供应链审核项目中,指纹登录在戴手套可用前提下做到 FRR 0.3% 以内、单次比对 <0.3 秒,靠的正是半导体Sensor + 多帧融合 + 本地SM4加密模板三件套。
3.4 掌纹(高安全区补充)
掌纹在 FAR 上比指纹更优,适合军用、金融等高安全区。它作为第四因子,与指纹互斥配置,不同时在一条登录链上启用,避免采集延迟叠加。
四、三部署:单机 / 联网 / SaaS
工控环境网络条件差异极大,部署形态要能平滑伸缩:
| 部署 | 凭证源 | 适用 | 断网表现 |
|---|---|---|---|
| 单机 | 本地加密库 | 外场设备、车舱 | 全功能可用 |
| 联网 | 中心策略服务 | 车间局域网 | 策略实时下发 |
| SaaS | 云端租户 | 多厂区分散 | 需远程接入通道 |
关键设计是“策略下沉”:联网/SaaS 形态下,策略(因子组合、阈值、审计级别)由中心下发到终端本地缓存,一旦远程接入通道中断,终端自动退化为单机模式,不阻塞登录。这就是后面“断网解锁”能成立的前提。
五、离线应急:指纹/应急码/断网解锁
这是无桌面工控方案成败的分水岭。我把离线应急拆成三条独立链路,任意一条可用即可解锁。
5.1 离线指纹
指纹模板与比对引擎全部在终端本地,不回中心。即使远程接入链路全断,工人按压即可解锁,体验与在线无异。
5.2 应急码(Break-glass)
当 USBKey 遗失、指纹磨损、OTP 失步时,使用一次性应急码。应急码由安全管理员离线生成,形如分段短码:
# 应急码生成(管理员侧,离线) andang-sla codegen --type breakglass --count 5 --valid 24h --split 4x4 # 输出示例(仅示意,非真实):7F3A-9C2B-1E8D-4H6K应急码使用规则:
- 一次性,用后即焚,本地与中心双重标记已消费;
- 有效期默认 24 小时,可由策略缩短到 8 小时;
- 每次使用强制进入审计“高危事件”队列,后续必须人工复核;
- 终端本地存已用码集合(BloomFilter),防止同码复用。
5.3 断网解锁(Air-gapped Unlock)
断网解锁的本质是:登录判别所需的全部材料(公钥、策略、审计缓冲)在断网前已下沉到本地,断网后判别逻辑完全本地闭环。实现要点:
# 断网自愈配置 [offline] auto_degrade = on # 远程接入不可达时自动降级 cache_policy = /var/lib/sla/policy.sig cache_pubkey = /var/lib/sla/pubring.sm2 audit_buffer = 5000 # 断网期间最多缓存5000条 flush_on_link = on # 链路恢复立即补传某轨交外场项目采用离线 USBKey 方案:每天作业车出库即进入无网环境,司机插入个人 USBKey 即解锁车载终端,全程不依赖任何云端;收车回库联网后,当日审计自动补传。
军用指挥车场景更进一步:一人一钥,Key 内 SM2 私钥与车辆绑定,Key 拔出即触发锁屏,指挥车在机动过程中即使被俘获也不存在“口令+设备”即可进入的可能。
六、拔Key锁屏:物理因子的会话绑定
“拔Key锁屏”是无桌面场景里最被低估但最实用的安全特性。它的逻辑是:把登录会话与 USBKey 的物理存在做硬绑定,Key 一旦拔除,无论系统处于桌面还是后台服务态,立即锁屏或挂起会话。
Linux 侧通过 udev 规则 + 看门狗实现:
# /etc/udev/rules.d/99-sla-keycheck.rules ACTION=="remove", SUBSYSTEM=="usb", ATTRS{idVendor}=="XXXX", \ RUN+="/usr/sbin/sla-lockscreen --reason key-removed" # 看门狗兜底:每 2s 探活 Key,心跳丢失即锁 [sla-watchdog] probe_interval = 2s grace = 1 # 允许瞬时抖动次数 on_lost = lock # lock / suspend / logoutWindows 侧由 Credential Provider 注册设备变更回调,Key 拔除事件直接驱动锁屏 API。该特性对“临时离岗”“工位共享”“设备被盗”三类风险有立竿见影的抑制效果。
七、审计留痕:全链路、防篡改、可举证
等保2.0 三级明确要求“应对登录的用户进行身份标识和鉴别,并防冒充”。审计要贯穿登录全流程,且本地缓存与中心存证双写。
审计事件的最小字段:
| 字段 | 示例 | 说明 |
|---|---|---|
| ts | 2026-05-27T09:36:14+08:00 | 带时区时间戳 |
| uid | op-2031 | 操作员标识 |
| factor | sm2-key / fp / otp / breakglass | 实际使用的因子 |
| dev | VIN-沪A·XXXX | 设备/车辆标识 |
| result | allow / deny | 判别结果 |
| risk | low / mid / high | 应急码/失步归高危 |
| sig | SM3(摘要) | 防篡改签名 |
本地审计缓冲在断网期间写入加密环形区,链路恢复后按序补传中心。补传采用“先哈希后传输、中心重算比对”,保证传输过程不被篡改。所有审计记录以 SM3 做链上摘要,任意一条被改都能被检出。
八、国产OS适配:麒麟V10 / 统信UOS
国产OS的适配重点不在算法,而在三处系统层差异:
- PAM 模块签名:麒麟V10 与统信UOS 对内核模块/安全模块有签名校验,双因子模块需走厂商签名流程,否则加载被拒;
- 安全子系统:部分版本启用 kysec/security 加固,PAM 栈外挂模块需加入白名单;
- SM 算法库路径:SM2/SM3/SM4 可能由不同厂商提供(内核 crypto 或用户态库),模块要做运行时探测。
# 统信UOS 适配检查清单 - [ ] 模块通过 UOS 签名 - [ ] /etc/kysec/whitelist 加入 sla 模块路径 - [ ] SM 算法后端探测顺序:内核 crypto → 用户态 gmssl - [ ] 无桌面登录管理器确认走 PAM(非自绘登录)以安当SLA为例,其跨OS适配层把 Windows Credential Provider、Linux PAM、国产OS PAM 三套接口抽象为同一套“因子鉴别 SDK”,业务策略(因子组合、阈值、审计)用同一份配置描述,避免每个OS各写一套逻辑——这对需要同时管理 Windows 工控机与麒麟产线屏的客户尤为关键。
九、工程落地参数速查
把前面散落的阈值收口成一张速查表,方便现场调试:
| 项目 | 推荐值 | 备注 |
|---|---|---|
| 验签超时 | 3000ms | USBKey SM2 验签 |
| OTP 容错窗口 | ±3 | 失步后需管理员重置 |
| 指纹 FRR/FAR | <0.3% | 半导体Sensor + 多帧融合 |
| 指纹比对时延 | <300ms | 本地模板 |
| 应急码有效期 | 8~24h | 默认 24h |
| 看门狗探活 | 2s | 心跳丢失即锁 |
| 审计缓冲 | 5000 条 | 断网缓存上限 |
| PIN 缓存 | 0~300s | 0 表示每次校验 |
十、典型技术案例(仅作技术举例)
- 供应链审核指纹:在苹果/小米供应链工厂,审核工位用指纹做电脑指纹登录,戴手套可用,FRR 控制在 0.3% 以内、单次比对 <0.3 秒,满足产线节拍;
- 轨交外场离线 USBKey:作业车出库即无网,司机插个人 USBKey 解锁车载终端,回库联网后审计补传;
- 军用指挥车一人一钥:Key 与车辆绑定,拔除即锁屏,机动过程无云端依赖。
这三个案例共同说明一个工程事实:无桌面工控双因子的核心难点不是算法,而是“离线可用 + 应急兜底 + 审计不断链”三者的同时成立。
十一、常见坑与排查
- PAM 栈
success=1跳错行:第二因子模块返回 success 后跳过的是pam_deny,若跳错会导致直接放行,务必用pam_debug验证栈走向; - 离线 OTP 失步:窄带环境时间漂移大,TOTP 必须配合 NTP 或管理员手动 resync,HOTP 更稳;
- 国产OS 白名单漏配:模块签名通过但未被 kysec 放行,表现为登录静默失败,需查
/var/log/kysec; - 看门狗误锁:USB 瞬时抖动触发锁屏,建议 grace 设为 1~2 次;
- 审计补传风暴:回库后 5000 条集中补传打满链路,应分批限速(如 50 条/秒)。
十二、无桌面登录代理:没有显示器怎么采集因子
很多工控终端根本没有 X/Wayland 桌面,登录界面是一块定制串口屏或由上位机远程绘制的。这类“无桌面板”不能直接套用桌面 Credential Provider 的交互模型,必须有一个轻量登录代理(Login Agent)在终端本地常驻,负责因子采集与判别,再把结果回写给系统会话。
登录代理的最小职责:
- 监听本地因子事件(USBKey 插拔、指纹传感器中断、串口屏按键);
- 在内存里拼装凭据请求,绝不在磁盘落明文;
- 调用鉴别 SDK 完成第二因子校验;
- 通过 PAM 会话句柄或 WinLogon 回调把“通过/拒绝”交还系统;
- 把判别结果推给审计模块。
对于纯无显示设备,往往改用“前端采集 + 后端判别”的分离架构:车间门口的指纹一体机是采集端,产线屏是判别端,两者通过本地加密总线(如串口+SM4 或板内共享内存)通信。这样做的好处是采集硬件故障不影响主机,也便于把生物模板锁在独立的安全芯片里,主机只拿到“校验通过”的结论。
# 无桌面板登录代理精简配置 [agent] display = none # none / serial / remote collector = fp-module # 外部采集端标识 bus = sm4-shm # 板内共享内存加密总线 mem_only = on # 凭据不落盘 handoff = pam-session # 回写方式这里有一个容易被忽略的点:无桌面板下的错误提示必须收敛。屏幕上只能显示“允许/拒绝/重试”,不能把“USBKey 验签失败”“指纹模板缺失”“策略未加载”这类细节暴露给现场人员,否则既干扰作业又泄露系统状态。详细错误只进审计日志,由运维在后台看。
另外,当无桌面板设备通过远程接入通道交由中心统一运维时,远程登录安全不能只靠双因子。远程接入入口本身要独立鉴权、独立加密,并且与终端本地登录鉴别解耦:即便远程通道已认证,本地插 Key 或按指纹的硬动作仍然必须发生,不能出现“远程直通免第二因子”的旁路。这条原则能挡住大量“借远程通道绕过物理因子”的越权操作,是工控终端远程登录安全设计里最容易被省掉、也最不该省掉的一环。
十三、SM2 离线验签全流程时序
把国密 USBKey 的离线登录拆成一条清晰时序,便于现场排错与验收。整个过程不离开终端,零网络往返:
- 登录代理生成 16 字节挑战随机数
nonce,单次有效; - 代理把
nonce通过安全通道发给 USBKey; - Key 用内部 SM2 私钥对
SM3(nonce || ts)签名,私钥不出 Key; - Key 回传签名值
sig与证书序列号; - 代理用本地缓存的 SM2 公钥(来自
/var/lib/sla/pubring.sm2)验签; - 验签通过且
ts在 ±3 秒窗口内,判定允许;否则拒绝; - 结果写入审计缓冲,PIN 缓存按策略刷新。
时序里两个硬约束必须写进验收:一是挑战随机数必须每次不同且一次性,防止重放;二是时间窗口必须配合本地时钟,离线环境时钟漂移要靠开机校时或管理员手动对齐,不能假设有 NTP。
# 验签窗口与重放防护 [sm2-verify] nonce_len = 16 replay_guard = bloom # 已用 nonce 用布隆过滤器拦截 time_window = 3s clock_drift = manual # 离线态手动校时十四、容灾与备份:密钥、策略、审计三件套
无桌面工控系统一旦上线就是长年运行,容灾设计直接决定“设备坏了能不能快速恢复”。建议把三类数据分开备份策略:
| 数据 | 备份方式 | 恢复目标 |
|---|---|---|
| 公钥环 pubring | 离线加密介质 + 中心副本 | 丢失可 5 分钟内恢复验签 |
| 策略 policy.sig | 中心下发 + 本地缓存双份 | 断网也能用本地副本 |
| 审计缓冲 | 本地加密环形 + 回库补传 | 丢盘不丢记录 |
USBKey 本身要做“主 Key + 备用 Key”双发:同一操作员发两张 Key,序列号都登记在公钥环,任一可用,避免单 Key 损坏导致人员无法作业。备用 Key 平时封存,启用即进入审计高危队列,防止备用 Key 被冒用。
策略文件必须带签名(policy.sig),终端加载前先验 SM3 摘要,防止策略被现场误改或篡改后悄悄放宽因子要求。曾有项目因为策略文件没签名,运维图省事把“双因子”改成了“单因子”调试,上线后忘了改回,留下安全隐患——签名校验就是堵这个口的。
十五、性能与节拍:别让安全拖慢产线
产线对节拍极敏感,登录/解锁耗时直接进 OT 指标。双因子不能因为“更安全”就牺牲效率。实测调优要点:
- 指纹比对放在独立协程,主控登录不阻塞,按压到放行控制在 300ms 内;
- USBKey 验签 I/O 用异步,避免插 Key 瞬间 UI 卡顿;
- PIN 缓存按工位设 30~120 秒,频繁作业的工位可放宽,涉密工位归零;
- 审计写入走批量落盘,单条不 fsync,靠定时刷盘 + 断电保护,降低 I/O 抖动。
把这些数字写进 SLA 验收表,比“支持国密算法”这种描述更有约束力。
方案参考
面向工控/产线无桌面环境的操作系统双因素认证落地,给出以下通用建议,供不同厂商方案选型时对照:
1. 因子组合要按风险分层
- 常态作业:USBKey 国密 + 指纹,兼顾安全与节拍;
- 外场离线:离线 USBKey 或本地指纹,不依赖任何远端;
- 应急兜底:一次性应急码,但必须进入高危审计队列并强制人工复核。
2. 部署形态优先“策略下沉”
无论单机、联网还是远程接入集中管理,策略与凭证摘要都应预下沉到终端本地。远程接入通道中断时,终端须能自动退化为单机模式,保证登录不被网络可用性绑架。这是离线双因子能成立的前提。
3. 断网解锁的工程三件套
- 公钥/策略本地缓存并签名校验;
- 审计先写本地加密缓冲,链路恢复再补传;
- 任何因子在离线态下行为必须与在线态一致,避免“离线反而更安全/更宽松”的错觉。
4. 拔Key锁屏应作为默认能力
物理因子(USBKey)与会话硬绑定,拔除即锁屏/挂起,对离岗、共享工位、设备被盗三类风险抑制效果显著。看门狗探活间隔建议 2 秒级,并预留瞬时抖动容错。
5. 审计留痕要防篡改、可举证
审计字段至少包含时间、操作员、因子、设备、结果、风险等级与摘要签名;本地与中心双写;断网缓存设上限并分批补传,避免回库风暴。等保2.0 三级对身份鉴别留痕有硬性要求,选型时务必确认审计链的完整性与防篡改能力。
6. 国产OS 适配提前验证三处
内核/安全模块签名、加固白名单、SM 算法后端探测路径。这三点不提前验证,上线当天极易出现“签名过了但静默失败”的坑。
7. 生物因子看场景挑硬件
车间戴手套、沾油污环境,优先半导体/射频指纹头并开启多帧融合;高安全区可用掌纹补充。选型时把 FRR/FAR/时延三个数字写进验收指标,而非只看“支持指纹”这种笼统描述。
8. 远程登录安全边界
远程接入管理通道本身应独立鉴权与加密,双因子方案只负责终端登录鉴别,不替代通道安全。不要把应急码、OTP 等兜底因子暴露在远程接入入口单独放行。