ARC 5让系统可以运行和排查第 19–22 章

第 20 章 —— 消息安全与收敛前提

本章目标: 本章完成后,开发者能够区分集群准入、真实性、机密性、防重放、滥用控制与审计,并说明密钥轮换期间的兼容窗口。

学习目标

  1. 为远端 envelope 建立顺序明确的安全门。
  2. 区分 HMAC 验签、载荷加密和 nonce 防重放。
  3. 解释 key version、minimum acceptable version 与轮换窗口。
  4. 把每类拒绝落到结构化错误、指标和审计。

前置条件

案例进度

履约集群开始接收跨节点 delta。团队需要防止错误 token 的节点加入、载荷被篡改、旧签名长期有效、同一合法消息被重复播放,以及连续失败发送方消耗验证资源。

五道门各自回答一个问题

远端消息进入集合前的安全门

问题 典型组件
Admission 节点是否持有集群准入凭据 SharedKeyClusterTokenValidator
Authenticity 消息是否由可信 key 签名且未被篡改 HmacMessageAuthenticator
Confidentiality 载荷是否需要并成功解密 AES-GCM / ChaCha20 encryptor
Replay nonce 是否新鲜且未重复 SlidingWindowNonceTracker
Abuse 连续失败发送方是否应暂时封禁 SenderRateLimiter

加密不证明发送者身份,验签也不阻止合法包重放。把五类能力合并成「security enabled」会让故障和配置审查失去精度。

密钥轮换是一个窗口

安全集成测试验证 rolling migration:新旧签名可以在过渡期并存。接收方用 key version 选择验证 key;当所有发送方升级后,提高 min-acceptable-key-version,旧版本 envelope 才被明确拒绝。

阶段 A:active=1,accept >=1
阶段 B:发布 key 2,发送 active=2,接收仍 accept >=1
阶段 C:确认所有节点切换后,accept >=2

若一上来只保留新 key,尚未滚动到的节点会整体失联;若永不提高最低版本,旧 key 泄露风险长期存在。

Nonce 窗口与内存上限

SlidingWindowNonceTracker 接受递增或窗口内未见 nonce,拒绝重复、过旧和 0。它还限制 maxTrackedSenders 并按 LRU 淘汰,以免未知发送方无限占用内存。这个上限是安全与容量共同参数,过小会频繁遗忘发送者,过大则扩大内存面。

审计不是普通 debug log

SecurityAuditLog 记录 token mismatch、签名失败、重放、challenge timeout、sender ban、fencing reject 等安全结果。审计事件应包含稳定 reason、发送者和时间,不泄露 secret、明文 key 或完整敏感载荷。

反例与故障注入

实验

cd submodule/dsm
mvn -q -pl dsm-security,dsm-integration-test -am \
  -Dtest='HmacMessageAuthenticatorTest,SlidingWindowNonceTrackerTest,'\
'SharedKeyClusterTokenValidatorTest,SenderRateLimiterTest,'\
'BuiltInMessageEncryptorTest,SecurityIntegrationTest' \
  -Dsurefire.failIfNoSpecifiedTests=false test

使用 security-gates.json 核对每一道门的输入、拒绝原因、指标和审计结果;不得出现 secret 值。

实验验收卡

字段 内容
运行命令 上述 security unit + integration tests;书籍资产测试
输入或故障 token mismatch、篡改、明密文不兼容、nonce replay、sender ban、旧 key
可观察结果 消息 fail closed;结构化失败、指标和审计一致;滚动轮换可兼容
证据等级 E2 密码/状态组件行为 + E3 安全集成测试
本实验未证明 密钥托管、证书体系、生产轮换流程、合规留存或网络边界已通过审计

回顾

下一步

第 21 章把启动、注册冻结、准备就绪和关闭写成生命周期合同,防止部署系统把 STARTING 当 RUNNING。

证据链接