第 20 章 —— 消息安全与收敛前提
本章目标: 本章完成后,开发者能够区分集群准入、真实性、机密性、防重放、滥用控制与审计,并说明密钥轮换期间的兼容窗口。
学习目标
- 为远端 envelope 建立顺序明确的安全门。
- 区分 HMAC 验签、载荷加密和 nonce 防重放。
- 解释 key version、minimum acceptable version 与轮换窗口。
- 把每类拒绝落到结构化错误、指标和审计。
前置条件
- 已完成第 11 章 wire envelope 与第 19 章观察面。
- 理解 TLS/网络隔离不自动替代消息级身份与重放保护。
- 知道安全配置错误应 fail closed。
案例进度
履约集群开始接收跨节点 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 或完整敏感载荷。
反例与故障注入
- 篡改已签名 payload,预期验签失败并产生审计。
- 第二次提交同一 nonce,预期 replay rejection。
- 让接收方要求加密,再发送 plaintext,预期明确拒绝。
- 连续发送篡改消息达到阈值,预期 sender 被封禁;到期后恢复。
- 将最低 key version 提到 2,再提交 version 1 envelope,预期拒绝。
实验
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 安全集成测试 |
| 本实验未证明 | 密钥托管、证书体系、生产轮换流程、合规留存或网络边界已通过审计 |
回顾
- 准入、验签、加密、防重放、限流和审计是不同责任。
- 密钥轮换需要双版本兼容窗口与最终最低版本提升。
- nonce tracker 既要防重放,也要有发送者容量上限。
- 安全失败需要 fail closed,但不能把 secret 写入观测数据。
下一步
第 21 章把启动、注册冻结、准备就绪和关闭写成生命周期合同,防止部署系统把 STARTING 当 RUNNING。