docs: record authenticated free-text redaction and readable body deployment

This commit is contained in:
2026-10-10 01:22:56 +08:00
parent 6ee95e4bfb
commit 2bfe4ec7e8
3 changed files with 24 additions and 5 deletions
+2
View File
@@ -81,6 +81,8 @@
- **当前日志与抓包规则**:Dispatcher、Agent 的 `--debug/-D` 仅开启 Logrus 详细收发日志;普通模式记录自身关键工作流程、方向、身份、结果、耗时及错误。HTTP/MQ/RPC 正文只在 Debug 中记录安全副本,禁止密钥、Token、签名 URL、完整提示词/对话/音频及原始 SIP;不截断其余可读业务 JSON,不修改发送数据、不吞错误。Agent 原 `--debug` 抓包含义移除,逐通外部抓包凭证检查改为独立 `--capture`,不足时仍失败关闭。独立 `sip-call` 的 Debug 抓包参数不变。详细规则见 [`docs/logging.md`](docs/logging.md)。
- **2026-10-10 01:19 Logrus 自由文本最终修复现场**:第二次审查指出 Basic/无标签 PEM 及非 JSON 正文缺口,已在 `6ee95e4` 修复并重验安装。自由文本认证头(Basic/Digest/Proxy)、无标签私钥 PEM 块均排除;Debug 保留可读 text/XML/form 原正文的安全副本,二进制仅类型长度,原收发 bytes 不改、不截断。新断言先失败后通过(长 text/plain、Markup/form、多行提示词、JSON 错误中认证不隐藏后续业务原因)。最终完整检查/发布检查/Python21通过,业务覆盖率72.0%。两实际 SHA-256为 `38a1e553312ea7ffbff6e11ad9ececc99cb73b6dedb3339f03f55a71568f72b1`,Agent2901719/Dispatcher2901731 enabled+active、0重启、Debug无Capture,Asterisk777461不变,零通道/tcpdump。14HTTP/两端RPC正文与敏感检查再验证通过;现场没有非JSON正文/MQ/通话/真实恢复故障,不伪造验证。仍固定nonprod-real,未reset/迁移/额外投递。最终源码为 `.local/logging-isolated` main,根并行改动保留;证据顶部最终版本见 [`docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md`](docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md)。
- **2026-10-10 00:37 Logrus 最终固定版本**:源码 `fd37a67` 已推送并安装;在完整阶段/原失败原因日志之外,补齐损坏结果 JSON 和文件 stat 的具体原因、私钥/Pem 与签名 WS/WSS 排除。新增断言先失败后通过,最终完整检查/发布检查、Python 21 测试通过,业务覆盖率 71.7%。两实际制品 SHA-256 `7b606adf83147fdf966d455b6a2d3543955adcedca608b306f438dcbfcc424ad`,Agent PID 2901612、Dispatcher 2901624,enabled+active/零重启、真实 `--debug` 无 `--capture`;Asterisk 777461 不变。14 次 HTTP/两端各 8 条 Debug RPC 正文、敏感字段/签名 URL 检查复核通过;现场无 MQ/呼叫/真实恢复故障,不代签这些事项。停止 D 关准入后复核零通话/未知执行再部署,未 reset/迁移或额外投递。隔离 main `.local/logging-isolated` 为最终源码基线,根工作区并行修改保留。证据见 [`docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md`](docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md)。
- **2026-10-09 23:57 Logrus 最终排障日志部署**:独立审查指出初版拒绝/等待及逐条恢复原因不足,已在 `592c2fe` 全面补齐已有关联身份、实际原因、各节点阶段、尝试/下次重试、未知及到期保留;失败原因不只记录类型,嵌入错误的 JSON 对象/数组也做结构化排除。新增断言先失败后通过,最终完整检查/发布检查与 Python 21 测试通过,业务覆盖率 71.7%。固定提交已推送、重部署,两业务服务 PID 2900896/2900908、enabled+active/零重启、真实 `--debug` 无抓包,制品 SHA-256 为 `e3aa61d75768e6aca2b3567864890da4ba5bf3ebd53fba678cca242ae030a2b4`。14 次 HTTP/两端 RPC 正文复核及敏感检查通过,仍无现场 MQ/呼叫/真实恢复故障,不以本地断言冒充;未清数据、改重试/数据规则或重启 Asterisk,PID 777461 不变。根工作区并行改动保留,权威源码在 `.local/logging-isolated` main。完整证据见 [`docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md`](docs/evidence/dispatcher-agent-logrus-debug-deployment-20261009.md)。
@@ -1,6 +1,23 @@
# Dispatcher / Agent Logrus Debug 实现与固定环境部署
## 最终已安装版本:fd37a67(2026-10-10 00:37 CST 现场)
## 最终已安装版本:6ee95e4(2026-10-10 01:19 CST 现场)
第二次独立审查发现自由文本 Basic 认证/无标签 PEM 及非 JSON 可读正文仍有缺口;下述旧 fd37a67 记录是历史,不作为最终完成。现已实际修复:
- `cleanString` 隐藏自由文本中的 Authorization/Proxy-Authorization(包含 Basic/Digest)、Cookie,以及没有字段标签的 RSA/EC/OpenSSH/PKCS8 私钥 PEM 块。JSON 嵌入错误先结构化处理,已隐藏的认证值不导致其后非敏感业务原因/标识被删掉。
- HTTP Debug 观察 JSON 之外的可读文本(text/*、XML、表单),按 UTF-8 记录实际读取的正文,不按 JSON MIME 单独决定是否可记录;普通模式仍没有完整正文。原请求/响应 bytes 不改、不截断,二进制仍仅记录类型/长度。
- 文本内 JSON、敏感键值/多行提示词、Markup 敏感标签及 password/API-key input 值、表单敏感字段作安全副本;使用项目现有 x/net HTML tokenizer,不另造解析器。裸 PEM、认证、签名地址仍排除。
- 新 `internal/logging/text_security_test.go` 先失败后通过:两种模式下 Basic/Digest/裸 PEM 排除;超过 150 KB 的 text/plain 请求与响应保留非敏感业务详情且 bytes 完全不变;HTML/XML、form、多行提示词排除;JSON 错误认证字段不删除后面的 task_id/reason。
最终代码 `6ee95e4bfbaada6b46f5967a149d1fed4134093d` 已推送远端 main,干净固定提交构建安装。最终 `make check`/完整 race-vet-build/合同 Proto/实际隔离 RabbitMQ HTTPS mTLS/`make release-check-local` 全部通过;Python 21 项通过,业务覆盖率 **72.0%**。最终检查记录在隔离工作区 `.local/text-accepted-{check,coverage,release-check}.log`。
2026-10-10 01:19 CST:Agent PID `2901719`、Dispatcher `2901731`,两实际制品 SHA-256 同为 `38a1e553312ea7ffbff6e11ad9ececc99cb73b6dedb3339f03f55a71568f72b1`;enabled+active/running、0 重启、真实 Debug、无 Capture。Asterisk `777461` 不变;零活动通道、零 tcpdump。部署前关 D 准入再复核零通话/未知执行/恢复状态,未 reset/迁移/重启 Asterisk、投递外呼或额外调用 AI/OSS。
现场再次观测 14 HTTP 请求/响应(200)、两端各 8 Debug RPC 正文、仅 Logrus JSON,无 error/redaction_error;已发生正文敏感字段/签名 URL 检查 0 泄露、13 隐藏标记。**现场没有非 JSON HTTP 正文、MQ 业务收发、呼叫或真实恢复故障**;新增格式/失败分支的本地断言不代签现场发生。独立 probe 的 `saas_pending/business_ready=false` 仍保留,不伪造业务/生产签收。
最终现场私密摘要:本机 `.local/logging-deployment/text-{preflight,deploy,field-summary}.json`(0600);源码及本文权威位置为隔离工作区 `/home/rogee/Workspace/sip-go-agent/.local/logging-isolated` 的 main,根工作区并行改动保留。
## 上一版部署记录:fd37a67(2026-10-10 00:37 CST 历史)
最终源码 `fd37a67ef888c6ca7b49cc43e473e3b54e5781fb` 已提交并推送 main,远端核对一致,制品来自干净固定提交。包含下述完整诊断修复,并额外保留文件 stat/JSON decode 的原失败原因;私钥/Pem 及签名 WS/WSS 地址在普通/Debug 模式均隐藏,相关新断言先失败后通过。
+4 -4
View File
@@ -9,13 +9,13 @@ sip-go-agent dispatcher --mode nonprod-real --debug
sip-go-agent agent --mode nonprod-real -D
```
不传 `--debug/-D`:记录工作流程、交互方向、阶段、关联身份、结果、耗时和错误,不记录收发正文。传入后:保留这些记录,并增加实际 HTTP、MQ、Unary RPC 收发正文的安全副本;不截断非敏感 JSON 业务字段。
不传 `--debug/-D`:记录工作流程、交互方向、阶段、关联身份、结果、耗时和错误,不记录收发正文。传入后:保留这些记录,并增加实际 HTTP、MQ、Unary RPC 收发正文的安全副本;不截断非敏感可读业务正文。
Agent 的抓包开关独立为 `--capture`:只在显式开启时要求 `AGENT_EVIDENCE_ROOT` 及逐通有效的外部抓包凭证。`--debug/-D` 不启动抓包、不要求 tcpdump 或证据凭证;`--capture` 也不自动开启详细日志。独立 `sip-call` 的 `--debug/-D` 仍保留原有抓包含义,本次不改。
## 记录内容
- HTTP:请求开始、实际被读取的请求/响应 JSON、响应状态、正文读取结果。认证头不记录;URL 的认证、查询和 fragment 部分删除。SDK/native ARI 的 HTTP 客户端使用同一观察输出,保留 TLS、超时、重定向和 WebSocket 升级行为。
- HTTP:请求开始、实际被读取的可读请求/响应正文(JSON、text/*、XML、form)、响应状态、正文读取结果。认证头不记录;URL 的认证、查询和 fragment 部分删除。SDK/native ARI 的 HTTP 客户端使用同一观察输出,保留 TLS、超时、重定向和 WebSocket 升级行为。
- MQ:实际入站/出站字节;接收、校验、处理、ACK/NACK/Reject、发布及 broker confirm。`publisher_confirmed` 只证明 RabbitMQ 确认,记录 `saas_processed=false`,不能据此声称 SaaS 已处理。
- RPC:实际边界的 protobuf 请求/响应投影,明确 `wire_encoding=protobuf`。冻结配置中的 `*_json` 字节展开为 JSON,其余字节仅记录长度;不是业务内部 CallSpec,也不声称 JSON 是 protobuf 原始线格式。客户端响应收到和服务端响应准备完成分别记录,服务端返回不能冒充对端收讫。
- 业务流程:持久接纳/重复忽略、号码拒绝、未来 issued_at/容量/准入等待、选线、预占及拨号前取消、请求执行、交付未知保留占用、Agent 排程/执行/结束、结果回报及恢复。拒绝和等待不是无日志的返回;节点失败记录具体原因,而不是只有错误类型。
@@ -25,9 +25,9 @@ Agent 的抓包开关独立为 `--capture`:只在显式开启时要求 `AGENT_
## 正文边界
密钥、Token、认证信息、完整 prompt/messages/transcript/text/content/结束语、原始 SIP 内容及音频不输出。敏感字段按键名隐藏,重复键逐个处理;其他 JSON 的空白、重复键和数字写法保留,原业务字节与对象不修改。HTTP 二进制和升级后的 WebSocket 流不进入正文日志。
密钥、Token、认证信息、完整 prompt/messages/transcript/text/content/结束语、原始 SIP 内容及音频不输出。敏感字段按键名隐藏,重复键逐个处理;其他 JSON 的空白、重复键和数字写法保留,原业务字节与对象不修改。纯文本以 UTF-8 安全副本记录;敏感键值/多行提示词、Markup 的敏感标签/输入值、表单敏感字段排除,其他可读正文保留。HTTP 二进制和升级后的 WebSocket 流不进入正文日志。
错误消息中嵌入的 JSON 对象/数组和 quoted API key/Token 也作同样处理,实际错误仍返回,原原因保留。非法 JSON、无法安全展开的嵌套数据或部分读取不能退回打印未经处理的正文:输出 `redaction_error`、字节数及 SHA-256。HTTP `body_complete=false` 只表示已观测部分,不能把它当作完整网络正文;原读取/关闭错误继续返回,不因日志改变重试、确认或业务结果。
自由文本里的 Authorization/Proxy-Authorization(包括 Basic/Digest)、Cookie、无字段名的私钥 PEM 块,以及错误里嵌入的 JSON 对象/数组和 quoted API key/Token,同样排除;已隐藏的 JSON 认证字段不删掉后面的非敏感业务原因。实际错误仍返回,原原因保留。非法 JSON、无法安全展开的嵌套数据或部分读取不能退回打印未经处理的正文:输出 `redaction_error`、字节数及 SHA-256。HTTP `body_complete=false` 只表示已观测部分,不能把它当作完整网络正文;原读取/关闭错误继续返回,不因日志改变重试、确认或业务结果。
## 固定环境部署及查看