# ADR 006 加密的设备访问审计

## 状态

2026-10-18 采纳设计，2026-10-24 完成实现及现有入口功能验收。字节格式以 [FORMAT 第 11 节](../FORMAT.md#111-independent-access-audit-stream)为准，操作方式见[访问审计](../access-audit.zh.md)。

## 背景

签名索引证明已发表的变更，但不记录读取、缓存命中、访问拒绝和传输交接。服务器还需要记录实际认证适配层验证过的应用身份。文件访问日志应保留这些事实，同时避免把路径、正文和认证秘密放进可读的本机存储或服务商日志。

## 决策

Core 提供统一审计写入器，可信适配层选择入口上下文。FileId 与不可变 VersionId 来自操作实际使用的快照。前门交付与 Core 业务事实分别记录，通过父操作 ID 关联；同一业务事务内的事实共享事务 ID。字节数和项数表示该层实际接受的数量，不证明人已阅读。

每个入口独立选择 `off`、`best_effort` 或 `required`。HTTP 与 S3 默认 required；守护进程挂载和后台任务默认 best effort；其余入口默认 off。required 的意图记录在业务访问前落盘，提交事实与业务变更处于同一个事务，完成记录在成功返回前落盘。已知提交后的审计失败保留精确回执。best effort 显示有界丢失计数与缺口，不静默变成 required。密封期间以有界摘要累计拒绝，待可信写入器恢复后持久化。

存放点 `a/` 保存独立的 `CFSAUD01` 加密签名设备链。审计钥用 `cipherfs audit v1` 从纪元钥加作者 DeviceId 派生，不能用于签名。持有对应纪元钥的成员可以读取历史，包括后来被撤销的作者；后续纪元排除被撤销设备，恢复信封保留对应纪元历史的恢复能力。

意图、完成预留、提交事实与崩溃状态放入密封的本机表。发布 spool 前先持久化最终密文，崩溃重试沿用相同字节。私有 spool 的文件 fsync、重命名与目录 fsync 完成后才能丢弃 outbox；所有已配置存放点都明确确认后才能删除本机 spool。队列、事件、持久预算、查询输入与关闭等待都有上限。密封撤销审计钥副本，写入租约防止超时旧代与新归属进程同时写日志。

查询先验签再解密，全部有界输入验证后才筛选。文件/设备分页指向密封且会过期的本机快照，明确报告缺失前缀与未确认的远端尾部。审计保留采用独立的本机首次观察时间下限与删除权限，普通正文/索引 GC 不处理审计对象。

## 后果

运行 tracing、版本历史与访问审计保持独立。审计覆盖经过 Core 和可信适配层的操作及缓存命中，不观察在边界外复制的明文。UID/GID/PID 是 OS 观察，不是可执行程序身份认证。FUSE reply 没有接收回执，交付保持未知。存放点可以隐藏完整尾部，已验证的观察链不能证明全局完整。

required 增加持久屏障，在有界存储用尽或写入器失败时会拒绝访问，运行状态与就绪检查会显示原因。清空查询缓存不会删除已发表审计。本机新增表属于当前未发布 schema 的完整配置，本次不提供生产旧版本迁移。
