slicedearth/breachgazette
GitHub: slicedearth/breachgazette
Breach Gazette 是一个聚合澳大利亚和美国官方数据泄露通知与监管行动的公共记录观测平台,以溯源优先的方式提供经过隐私最小化处理的静态可搜索站点。
Stars: 0 | Forks: 0
# Breach Gazette
**公开的数据泄露通知,关联与解析。**
Breach Gazette 是一个以溯源为优先的公共数据平台,提供官方的澳大利亚和美国数据泄露通知统计、公共通知登记册以及监管行动信息。它保留了不同来源之间的特定差异,包括汇总统计数据、具名通知、调查、裁决、法律程序和判决。
Breach Gazette 不会独立核实底层事件。它不对组织进行评分,不识别受害者,不检索通知信件,也不会将指控转化为调查结论。
[访问 Breach Gazette](https://breachgazette.netlify.app/)
## 公共站点
- 证据层将汇总统计数据、具名通知和法律状态记录严格区分开。
- 静态通知页面在不启用 JavaScript 的情况下依然可用,并以每 50 条为一组展示最新发布的记录。
- 浏览器本地过滤器会对完整的有界发布内容进行搜索,将所有匹配项以每 50 条为一组进行分页,在 URL 片段中保留过滤器和页面状态,并支持导出所有匹配项,而不仅仅是当前可见页面的内容。
- 来源健康度视图使用经过审核的公共来源名称,并保留诸如 NSW、MNDB、OAIC、NDB 和 HHS 等缩写。
- 响应式表格将水平滚动限制在表格区域内;页面标题、导航和记录标签在桌面端和移动端均保持正常的词边界。
## 初始来源覆盖范围
| 来源 | 发布模式 | 首次发布边界 |
| --- | --- | --- |
| OAIC NDB 统计数据 | 全国汇总 | 当前官方 Data.gov.au XLSX |
| NSW IPC MNDB 快照 | 州级汇总 | 最新索引 PDF 中已审核的行业表格 |
| NSW IPC 公共通知登记册 | 滚动具名登记册 | 仅限登记册行和安全的来源链接 |
| OAIC 监管行动 | 选择性法律状态时间线 | 已审核的固定官方 OAIC URL |
| 华盛顿州总检察长 | 具名通知 | 固定的 Socrata 数据集和确切字段 |
| 加利福尼亚州总检察长 | 具名通知 | 官方完整 CSV,不含通知信件 |
| 马萨诸塞州 OCABR | 具名通知 | 已审核的 2025 和 2026 年度报告,不含通知信件 |
| HHS OCR | 暂缓处理 | 尚未验证到稳定且具备机器可读性的公共列表契约 |
汇总行永远不会成为具名的事件记录。具名的通报方不会被悄无声息地重新标记为事件发生的实体。在经过审核之前,跨司法管辖区的关系仍然只是可解释的候选项。
## 架构
Python 3.12 pipeline 使用特定于来源的 HTTPS 客户端、Pydantic v2 契约、确定性归一化、不可变的比较事件、经审核的组织别名与关系决策、来源新鲜度监控、记录计数漂移防护、事务性更新周期、有界保留和恢复工具,以及 fail-closed 隐私检查。持久的来源状态存储在此仓库之外的 `BREACHGAZETTE_DATA_ROOT` 目录下。
Astro 从一个临时的隐私最小化发布目录渲染静态网站。生产构建会拒绝测试夹具和缺失必需的真实来源的情况。浏览器搜索使用紧凑的 facet 和 trigram-Bloom 清单,仅加载候选来源/年份分区,并可将每个过滤后的匹配项导出为公式安全的 CSV。静态和过滤后的结果均以每 50 条为一组进行分页。
过滤器和页面状态可以作为 URL 片段复制,而无需将搜索请求发送至服务器。一个隐私最小化的 Atom feed 会暴露最新的公共通知。这里没有运行时的应用服务器、账户系统、分析工具、cookie 或远程收集的搜索查询。
有关完整模型,请参阅[架构](docs/architecture.md)、[方法论](docs/methodology.md)和[数据字典](docs/data-dictionary.md)。
## 本地设置
要求:
- Python 3.12 或更高版本
- Node.js 24
- npm 11
```
python3 -m venv .venv
.venv/bin/python -m pip install --upgrade pip==26.1.2
.venv/bin/pip install -r requirements.lock
.venv/bin/pip install -e . --no-deps --no-build-isolation
cd site
npm ci
```
运行确定性测试:
```
.venv/bin/ruff check .
.venv/bin/mypy src
.venv/bin/pytest --cov=breachgazette --cov-report=term-missing --cov-fail-under=80
.venv/bin/breachgazette validate-monitoring --json
.venv/bin/breachgazette validate-aliases \
--catalogue tests/fixtures/reviews/organization-aliases.yml --json
.venv/bin/breachgazette validate-relationships \
--catalogue tests/fixtures/reviews/relationship-decisions.yml --json
cd site
npm run check:test
npm run build:test
npm run test:e2e
```
本地浏览器命令仅使用 Chromium。Linux CI 通过 `npm run test:e2e:ci` 运行 Chromium、Firefox 和 WebKit;这避免了启动与旧版 macOS 不兼容的 Playwright 浏览器包。
普通测试仅使用特定于测试的夹具和注入的传输方式。夹具只能被摄取到最终名称包含 `fixture` 的 data-root 目录中:
```
.venv/bin/breachgazette ingest-fixture \
tests/fixtures/australia/oaic-aggregate.json \
--data-root /tmp/breachgazette-fixture
```
## 手动真实来源更新
实时更新是深思熟虑的、有界的,且独立于普通测试:
```
export BREACHGAZETTE_DATA_ROOT=/absolute/private/path/breachgazette-data
.venv/bin/breachgazette validate-source-policies
.venv/bin/breachgazette validate-monitoring
.venv/bin/breachgazette update-cycle \
--data-root "$BREACHGAZETTE_DATA_ROOT" \
--promote
```
该周期会更新一个隔离的副本,运行健康度、质量、发布、隐私和公共树检查门,然后仅提升完整的候选版本。如果不使用 `--promote`,这就是一个非变异的全周期演练。当单个检索失败时,每个来源也会保留其之前完整的快照。来源策略验证会拒绝标有未来日期或超过 366 天的权利审查。
## 经审核的组织别名
近似名称匹配仅创建私有审核提案。它绝不会更改公共组织的身份:
```
.venv/bin/breachgazette propose-aliases \
--data-root "$BREACHGAZETTE_DATA_ROOT" \
--output "$BREACHGAZETTE_DATA_ROOT/reports/alias-proposals.json"
.venv/bin/breachgazette alias-decision-id \
"Source-reported alias" "Reviewed canonical name" --json
.venv/bin/breachgazette validate-aliases \
--data-root "$BREACHGAZETTE_DATA_ROOT" --json
```
操作员必须核实官方证据,并将批准或拒绝的决定添加到 `$BREACHGAZETTE_DATA_ROOT/reviews/organization-aliases.yml` 中。经审核的目录是私有的操作状态,永远不会被提交。决策是确定性的、带有证据的、非链式的且可审计的。被拒绝的配对会被保留,因此不会被重复提案。
经审核的事件链接决策使用单独的目录:
```
.venv/bin/breachgazette relationship-decision-id \
rel_000000000000000000000000 \
--record-id source:one --record-id source:two --json
.venv/bin/breachgazette validate-relationships \
--data-root "$BREACHGAZETTE_DATA_ROOT" --json
```
确认的链接依然是有证据支持的公共记录关系,而非合并后的事件或法律裁决。
## 计划内的私有更新
计划内的工作流已实现,但默认处于禁用状态。只有在显式将仓库变量 `BREACHGAZETTE_SCHEDULE_ENABLED` 设置为 `true` 之后,它才会运行。除非选择了 `persist_private_state`,否则手动运行默认采用 dry-run 行为。
每次运行都会调用本地使用的同一个经过测试的候选事务,写入经过净化的来源 ID/状态/计数作业摘要,仅上传非敏感的健康报告,并且只有在所有来源、新鲜度、质量、隐私和发布检查门都通过的情况下,才会推送私有状态。请参阅[操作](docs/operations.md)。
成功的 `main` 分支 CI 运行会自动从配置的私有生产状态发布经过审计的静态树;在刻意启用计划变量之前,源数据收集功能将保持禁用状态。
## 生产环境静态构建
生成临时的真实发布数据,然后让 Astro 指向它:
```
publication_dir="$(mktemp -d /tmp/breachgazette-publication.XXXXXX)"
.venv/bin/breachgazette build-site-data \
--data-root "$BREACHGAZETTE_DATA_ROOT" \
--output "$publication_dir"
cd site
BREACHGAZETTE_SITE_DATA_DIR="$publication_dir" \
BREACHGAZETTE_SITE_URL="https://breachgazette.example" \
npm run build:budget
../.venv/bin/breachgazette audit-public-tree dist
```
如果真实数据根目录不完整,或者发布数据声明自身为测试夹具,生产构建将会失败。它还要求提供确切的生产环境 HTTPS 源,以确保 canonical 链接、feed、社交元数据、robots 指令和站点地图不会带有占位符 URL 就被发布出去。构建和公共树审计会强制执行时间、文件数量、HTML 大小和总大小的预算。
生成的生产记录、搜索索引和发布数据不会被提交。Netlify 仅接收经过审计的 `site/dist` 树。
## 隐私与安全
pipeline 会排除受害者与联系信息、完整叙述、样本通知信件、完整的监管机构决定、凭据和表单状态。它会扫描归一化的状态数据、生成的发布数据以及最终的静态树,以排查个人联系方式模式、不安全的标记、危险 URL、电子表格公式、控制字符和未批准的字段。
搜索和过滤功能在浏览器中针对已发布的有界数据集运行。可共享的过滤器使用 URL 片段,浏览器不会在 HTTP 请求中发送这部分内容。没有任何查询会离开访问者的设备。经审核的别名和关系目录保持为私有的操作状态。请参阅 [PRIVACY.md](PRIVACY.md) 和 [SECURITY.md](SECURITY.md)。
## 来源新鲜度与更正
来源覆盖页面会显示最新尝试、上次成功更新、修订或校验和、接受和拒绝的计数以及特定于来源的限制。在更改精选策略或清单之前,应对照官方来源核对更正内容。请使用 [docs/methodology.md](docs/methodology.md) 中记录的更正流程。
## 限制
- 官方来源在阈值、群体、日期、时间窗口和法律含义上存在差异。
- 通知计数不一定等于现实世界中独立的事件数量。
- 公共登记册可能是选择性的或滚动更新的。
- 组织名称由来源报告,可以进行更正。
- 关系候选者并不能证明存在共同事件。
- 不计算通用的澳大利亚与美国对比数据。
- 搜索路由使用仅存在假阳性的 Bloom 索引;候选分区可能会被不必要地加载,但匹配的分区绝不会被遗漏。
- 只要 `BREACHGAZETTE_SCHEDULE_ENABLED` 未设置为 `true`,计划内的源数据收集功能就将保持休眠状态。
- 华盛顿州的数据集没有特定于数据集的许可标识符;其发布边界需要持续审查。
- HHS 保持暂缓处理状态,而不是使用脆弱的浏览器自动化。
## 许可边界
原始源代码和项目编写的文档采用 [MIT 许可证](LICENSE) 授权。该许可证不会对官方源数据进行重新授权。
OAIC、NSW IPC、华盛顿州、加利福尼亚州、马萨诸塞州及其他派生自来源的材料保留其各自的署名、条款和限制。请参阅 [docs/legal-and-licensing.md](docs/legal-and-licensing.md) 和 [NOTICE](NOTICE)。
标签:MITM代理, 信息汇聚, 数据平台, 特征检测, 监管记录, 静态站点