Harden sip-call ownership and capture failure handling
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
# sip-call 配置归属恢复与抓包权限修复(2026-10-09)
|
||||
|
||||
## 授权与完成标准
|
||||
|
||||
使用者明确批准以下顺序:
|
||||
|
||||
1. 测试机只恢复 `pjsip.conf` 正确所属用户/组,不改变内容与 `0600`。
|
||||
2. 本地修复独立 sip-call,并补回归测试;不部署新版、不重启服务、不拨号。
|
||||
3. 追加批准:仅为 tcpdump 设置独立抓包权限,普通用户做不拨号的启动/停止检查。
|
||||
|
||||
完成标准:原配置归属和可读性恢复、内容未变;工具在写入前拒绝错误用户;临时/恢复配置保留归属和权限;调试启动失败提示准确;本地检查、构建及覆盖率通过;原通话证据不改写。
|
||||
|
||||
## 现场恢复
|
||||
|
||||
连接前核对已登记 SSH 主机指纹,使用 StrictHostKeyChecking。
|
||||
|
||||
对 `~/.config/go-sip-asterisk/pjsip.conf` 使用不跟随符号链接的文件描述符检查:普通文件、`0600`、内容与原备份一致;同时确认 Asterisk 以 `rogee` 运行。仅通过该描述符更改所属用户/组为 `rogee:rogee` 并复核路径仍指向同一文件。
|
||||
|
||||
| 项目 | 前后事实 |
|
||||
| --- | --- |
|
||||
| 所属用户/组 | `root:root` → `rogee:rogee` |
|
||||
| 权限 | 始终 `0600` |
|
||||
| 内容 SHA-256 | 始终 `c319476e7e4962008899a11ae0461db282eed3d63871b2d8adcd143812408cf8` |
|
||||
| Asterisk 用户读取 | 从不可读恢复为可读 |
|
||||
|
||||
未 reload 或重启 Asterisk;此检查只证明原文件可读,不代签本次业务配置重新加载。未更改 `go-sip-managed.conf`、线路 ENV、静态 transport、数据库、原结果或抓包文件。
|
||||
|
||||
## tcpdump 独立权限
|
||||
|
||||
先核对 `/usr/bin/tcpdump` 是 root 所有的 `0755` 普通文件,原本没有文件能力,再设置 `cap_net_raw,cap_net_admin=eip`。
|
||||
|
||||
- tcpdump 4.99.5,二进制内容 SHA-256 始终为 `0d426e2571a22de0d30996fd01bb44c1f267f33065023abea092c88bad16d2d2`。
|
||||
- 由普通用户 `rogee` 启动,监听 `any`,仅筛选 loopback UDP port 9,输出写入 `/dev/null`,不生成流量。
|
||||
- 启动成功、进程保持运行;SIGINT 正常停止,退出码 0、捕获 0 包。
|
||||
- 未对 sip-call 或 tshark 提权,未开放配置文件读取权限,未抓取实际呼叫。
|
||||
|
||||
## 本地工具修复
|
||||
|
||||
- `internal/sipcall/run.go`:在创建结果、抓包及访问 Asterisk 前检查配置类型、权限和所属用户;拒绝 root 或不匹配用户,明确提示不要 `sudo sip-call`。
|
||||
- `internal/sipcall/configuration.go`:临时 include 和原子替换文件保留原配置的所属用户/组;拒绝不合要求的现有文件;恢复前后及 reload 后检查原配置归属和权限,不以测试 endpoint 消失替代这些检查。期间归属/权限变化则报错,保留恢复资料。
|
||||
- `internal/sipcall/capture.go`:启动失败返回私有 `tcpdump.log` 的具体路径,并说明抓包权限应单独交给 tcpdump,不能 sudo 主程序。
|
||||
- `cmd/sip-call/main.go`:已指定 `-D` 但抓包未启动时输出“已请求,但未启动”,不再误报“未启用”。
|
||||
- 操作说明和 AGENTS.md 同步更新;未修改业务合同、内部 RPC、任务、配额或未知执行规则。
|
||||
|
||||
## 验证
|
||||
|
||||
新增测试先在旧实现上失败,再通过修复:恢复覆盖了已变更权限、原子替换接受非私有/符号链接/缺失文件、写入前未拦截无效配置、调试失败误报未启用。另覆盖 root/不同 UID 拒绝、UID/GID 比对、临时与恢复配置归属保持、抓包失败诊断。
|
||||
|
||||
| 检查 | 结果 |
|
||||
| --- | --- |
|
||||
| `go test ./internal/sipcall ./cmd/sip-call -count=1 -cover` | 通过;83.0% / 68.3% |
|
||||
| `make check build-sip-call` | 通过;格式、Proto 来源/哈希、现行固定合同、`go vet ./...`、`go test -race ./...`、构建 |
|
||||
| 隔离 RabbitMQ/HTTPS/mTLS 本地验收 | A01–A12 及 P08/current-mq 现有本地脚本通过;不代表真实外部签收 |
|
||||
| `make coverage` | 通过;排除生成代码后的覆盖率 70.5%,达到 65% |
|
||||
| `git diff --check` | 通过 |
|
||||
| 本地 `dist/sip-call --help` | 通过,未调用 Asterisk 或发起呼叫 |
|
||||
| 本地新工具 SHA-256 | `c6999f84692e31704915450151f9c6c1a31b3e5920acc58a1d3164aafb0941ba` |
|
||||
|
||||
## 边界与结束状态
|
||||
|
||||
归属修复结束时,测试机独立 sip-call 尚未更新,安装文件 SHA-256 仍为 `5a4da5af12a9e9f685ed767daa11cef90c1eaebb08cdd71014d1e61d695c922f`。结束时 Asterisk 与 Agent active,Dispatcher activating;原生 Asterisk 零活动通道、零活动通话。这不证明 Dispatcher ready,也不允许工具接管正在运行的 Agent。
|
||||
|
||||
此前普通用户中鼎调用的 20 秒等待接通超时仍缺少 SIP 抓包证据,线路/网络/程序原因未证实。本轮没有重新拨号、调用 AI/OSS、重拨、换线或改写原结果;本地修复与抓包权限验证不能代签中鼎接通或真实媒体。
|
||||
|
||||
## 后续工具部署(同日,独立批准)
|
||||
|
||||
使用者提出部署独立 sip-call,明确选择“仅部署并检查版本和帮助命令”,未批准启动抓包或 tcpdump→TShark 联合自检。
|
||||
|
||||
本地仓库 `git pull --ff-only` 已同步、无新远程提交。保留现存修改,以当前源码重新构建、检查 Go 元信息、再次通过独立工具单元测试。此版本来源为 Git 基线及本地已测试代码差异,不伪称所有修改已提交或推送。
|
||||
|
||||
| 项目 | 事实 |
|
||||
| --- | --- |
|
||||
| 源码基线 | `4b27ef31cab4d9fedb080e7a9eb2fed9cc7c1aee` |
|
||||
| 两处 Go 目录差异 SHA-256 | `7647db0ee8c3f6871b3e8b1145beeaee8862217d9950dc86c0e8e6f122749dde`(`git diff --binary -- cmd/sip-call/*.go internal/sipcall/*.go`) |
|
||||
| Go /主机 | Go 1.27.1;x86_64,测试机 glibc 2.41 |
|
||||
| 部署文件 | `/home/rogee/.local/bin/sip-call` |
|
||||
| 所属用户/组与权限 | `rogee:rogee`,`0755` |
|
||||
| 新工具 SHA-256 | `c6999f84692e31704915450151f9c6c1a31b3e5920acc58a1d3164aafb0941ba` |
|
||||
| 旧工具 SHA-256 | `5a4da5af12a9e9f685ed767daa11cef90c1eaebb08cdd71014d1e61d695c922f` |
|
||||
| 私密备份目录 | `~/sip-call/tool-backups/20261009T021242Z-c6999f84692e/`,`0700` |
|
||||
| 备份与来源清单 | `sip-call.before`、`manifest.json`(清单 `0600`),复核 hash 与部署状态 |
|
||||
| 帮助检查 | 上传候选及安装文件的 `--help`、`call --help` 均退出 0;保留 `--sip`/`--debug` |
|
||||
| 配置保护 | `pjsip.conf` 和三份线路 ENV 的内容/所属用户/组/权限前后相同 |
|
||||
|
||||
先确认没有 sip-call 进程,再在目标文件同一目录上传私有候选、校验内容和帮助命令;旧文件完成私密备份与清单记录后,原子替换目标文件并同步目录,复核安装后的文件与帮助。未执行任何 call、capture、reload、restart 或业务发布操作。
|
||||
|
||||
工具没有独立 `--version` 参数,本次通过 Go 构建元信息、源码基线/差异和安装文件 hash 固定版本。SSH 非登录环境 PATH 不含 `~/.local/bin`,全部检查使用明确的安装绝对路径;没有修改 shell 配置或其他二进制。
|
||||
|
||||
结束时 Asterisk/Agent 仍 active,Dispatcher 仍 activating;这不是 Dispatcher ready 或真实通话验证。Agent 正在运行仍会按工具原有规则阻断独立试拨,本次没有停止它。tcpdump→TShark 联合自检及真实线路接通保持未验证。
|
||||
Reference in New Issue
Block a user