standalonedefense/dns-witness
GitHub: standalonedefense/dns-witness
一个具备密码学签名和哈希链验证的被动 DNS 监控工具,提供防篡改的域名解析历史记录与多点地理异常检测能力。
Stars: 0 | Forks: 0
# dns-witness
**可验证、防篡改的被动 DNS —— 具备多点地理异常检测功能。**
在线演示:**https://aegis-dns.standalonedefense.com**
dns-witness 会随时间推移记录 DNS 观测结果,并**对其进行签名和哈希链处理**,因此这段历史可以被独立验证为未经修改且未回溯的——而不仅仅是被盲目信任。它可以从多个**观测点**(备选解析器 / EDNS Client Subnet)收集数据,从而使地理围栏和地理引导的解析结果表现为跨观测点的差异。
基于 Aegis 项目的防篡改证据方法论构建。
## 为什么需要它
被动 DNS —— 即域名在何时解析为什么 —— 是一项核心的供应链和威胁情报信号。但几乎所有的被动 DNS 源都要求你*信任*运营者没有遗漏、篡改或回溯记录。对于用于安全决策的证据来说,“相信我”是远远不够的。dns-witness 使记录变得**可验证**,并发布观测结果(事实),而非指控。
## 功能介绍
- **`collect`** —— 在一个或多个观测点上解析配置的域名(A / AAAA / CNAME / MX / NS / TXT);通过 Team Cymru 丰富 IP 的 ASN / 运营者 / 国家信息;将每次观测追加到经过签名和哈希链处理的日志中。
- **`verify`** —— 重新检查整个日志:链是否完整、顺序是否正确、每个签名是否有效。发现任何篡改时以非零状态退出。
- **`report`** —— 生成一个独立、可搜索的 HTML 报告,显示数据和实时链状态(高亮显示非美国国家代码)。
- **`changes`** —— 显示每条记录随时间推移的值和**管辖权(ASN/国家)变化**;在后端跨越国家时进行标记。发现变化时以非零状态退出(对 cron 友好)。
- **`check-canary`** —— 监控一个你已通过带外方式知道其真实值的域名;漂移意味着*你的*数据收集被篡改了,而不是外界的客观状态发生了变化。
## 完整性模型
每次观测都会被追加到只允许追加的 JSONL 日志中:
```
content = the observation fields (including prev_hash)
canonical = deterministic JSON of content (sorted keys)
entry_hash = sha256(canonical)
sig = Ed25519_sign(canonical)
```
每个条目都与前一个条目链接并进行单独签名,因此日志无法在不破坏链的情况下被重新排序、截断或更改,而且如果没有私钥,条目就无法被伪造。这是将 Certificate-Transparency / Sigstore 的只允许追加签名日志理念应用于你自己的 DNS 观测结果。任何拥有公钥的人都可以独立验证整个日志——不要信任,去验证它。
## 观测点(地理异常检测)
DNS 解答取决于你*在何处以及如何*提问 —— GeoDNS、CDN 地理引导、审查。配置多个**观测点**(备选解析器和/或用于探测的 EDNS Client Subnet),同一个域名在不同观测点上解析结果不同的现象就会成为可见的信号。请参阅 `config.example.yaml`。
## 快速开始
```
python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
cp config.example.yaml config.yaml # edit domains / vantages
.venv/bin/python dns_witness.py keygen
.venv/bin/python dns_witness.py collect
.venv/bin/python dns_witness.py verify
.venv/bin/python dns_witness.py report --output report.html
.venv/bin/python dns_witness.py changes
```
安排 `collect` 定期运行(通过 cron 或内置的 systemd timer)以便不断累积历史记录 —— 变更检测需要不止一次的运行结果来进行比对。
## 部署
`deploy.sh`、`deploy-nginx.sh` 和 `deploy-timer.sh` 会将该工具安装在 nginx 之后,并配置 Let's Encrypt 证书和每日执行的 systemd timer。签名**私钥保留在 web 根目录之外**;仅对外提供报告、日志和公钥服务。在运行 `deploy-nginx.sh` 之前请先设置 `CERTBOT_EMAIL`。
## 路线图
- **OpenTimestamps 锚定** —— 独立于运营者的验证。
- **分布式观察者节点**,相互交叉验证(透明日志的 *witness* 模型)—— 同时在架构上具备多观测点特性,因此地理围栏和日志造假行为会被同一机制捕获。
- **取证级的单条记录时间线**视图。
- **Merkle-tree 日志**,带有已签名的树头(高效的包含/一致性证明)。
## 关于出处的说明
本项目在 AI 协助下构建 —— 并被刻意公开披露,因为一个以“*不要信任,去验证*”为前提的工具,应该对其自身的起源保持透明。代码是开源的;请自行验证它。
## 许可证
MIT —— 请参阅 [LICENSE](LICENSE)。
标签:Go, IP 地址批量处理, Ruby工具, 哈希链, 威胁情报, 开发者工具, 异常检测, 数据防篡改, 时序数据库, 被动DNS, 逆向工具