annabellevibecodes/DMARCReporter

GitHub: annabellevibecodes/DMARCReporter

一个用于解析、存储和可视化 DMARC 聚合报告的轻量级 Web 应用,支持手动上传与 IMAP 自动获取,帮助邮件运维团队直观监控邮件认证状态。

Stars: 0 | Forks: 0

# DMARC Reporter 一个用于解析、存储和可视化 DMARC 聚合报告的 Web 应用程序。报告可以手动上传,也可以自动从 IMAP 邮箱中获取。 ## 功能 - 解析 DMARC 聚合报告 XML 文件(`.xml`、`.xml.gz`、`.gz`、`.zip`)和原始电子邮件文件(`.eml`) - 直接从 IMAP 邮箱获取报告;已处理的邮件会被移动到可配置的子文件夹中 - 仪表盘包含通过/失败统计数据、失败模式、主要失败来源以及每周趋势图表 - 三种 UI 主题 —— **Goth**(终端)、**Pink**(Y2K 魅力)、**Blue**(报纸)—— 可随时切换,并通过 cookie 持久化保存 - 域名和报告详情页上的 DKIM 选择器统计信息 - 支持导出 CSV、XLSX、PDF 和 DOCX 格式的管理报告 - 浏览带有可排序列标题的报告、域名和源 IP - 按域名和日期范围过滤报告;按 IP、envelope-from、disposition 和最小消息数(滑块)过滤来源 - 所有列表页均提供报告周期选择器 —— 所有时间、2 年、1 年、6/3 个月、上个月、30/14/7/3/2 天、过去 24 小时 - 支持配置用户名和密码的 HTTP Basic Auth - 针对上传和 IMAP 获取端点的速率限制 - SQLite 存储 —— 无需外部数据库 ## 要求 - Go 1.22 或更高版本 无需 C 编译器。SQLite 驱动程序 (`modernc.org/sqlite`) 是纯 Go 实现的。 ## 构建 ``` git clone cd DMARCReporter go build -o dmarcreporter . ``` 生成的 `dmarcreporter` 二进制文件是自包含的,没有运行时依赖项。 ## 运行 ### 不使用 IMAP(仅限文件上传) ``` ./dmarcreporter ``` 服务器默认在 `http://localhost:8080` 上启动。 ### 使用 IMAP ``` IMAP_HOST=mail.example.com \ IMAP_USER=dmarc@example.com \ IMAP_PASS=secret \ ./dmarcreporter ``` 配置 IMAP 后,导航栏中会出现一个 **Fetch IMAP** 按钮。点击它会从配置的邮箱中获取所有未读邮件,提取所有 DMARC 报告附件,将其导入,并将已处理的邮件移动到 `INBOX.Processed`(可配置)。 ## 配置 所有配置均通过环境变量进行。每个变量都有一个合理的默认值。 | 变量 | 默认值 | 描述 | |----------|---------|-------------| | `PORT` | `8080` | 要监听的 HTTP 端口 | | `DB_PATH` | `dmarc.db` | SQLite 数据库文件的路径 | | `SECURE_COOKIES` | `false` | 在通过 HTTPS 提供服务时设置为 `true`,以启用 cookie 的 `Secure` 标志和 HSTS | | `DEBUG` | `false` | 设置为 `true` 可向 stdout 和 syslog 输出详细的调试日志 | | `AUTH_USER` | `admin` | HTTP Basic Auth 用户名 | | `AUTH_PASSWORD` | _(必填)_ | HTTP Basic Auth 密码。除非设置此项,否则应用程序将拒绝启动。 | | `AUTH_DISABLED` | `false` | 设置为 `true` 可在没有身份验证的情况下运行。**仅供开发使用 —— 切勿在生产环境中使用。** | | `HSTS_ENABLED` | `false` | 设置为 `true` 以发送 `Strict-Transport-Security` 头。每当应用程序通过 HTTPS 提供服务时都应启用此项。 | | `UPLOAD_RATE_MAX` | `20` | 每个 IP 每分钟的最大文件上传次数(设为 0 可禁用) | | `FETCH_RATE_MAX` | `3` | 每个 IP 每 5 分钟的最大 IMAP 获取请求次数(设为 0 可禁用) | | `IMAP_HOST` | _(未设置)_ | IMAP 服务器主机名。未设置时禁用 IMAP。 | | `IMAP_PORT` | `993` | IMAP 服务器端口 | | `IMAP_USER` | _(未设置)_ | IMAP 用户名 | | `IMAP_PASS` | _(未设置)_ | IMAP 密码 | | `IMAP_MAILBOX` | `INBOX` | 用于获取报告的邮箱 | | `IMAP_PROCESSED_MAILBOX` | `INBOX.Processed` | 用于移动已处理邮件的目标邮箱 | | `IMAP_TLS` | `true` | 使用 TLS。仅在本地测试时设置为 `false`。 | ## 对互联网开放 如果您希望将此 Web 应用程序公开访问,我们建议使用带有预身份验证的反向代理,以实现通过互联网的安全访问。 ## 用法 ### 手动上传报告 导航至 **Upload** 并选择一个或多个报告文件。支持的格式: - `.xml` —— 纯 DMARC 聚合报告 XML - `.xml.gz` / `.gz` —— gzip 压缩的 XML - `.xml.zip` / `.zip` —— zip 归档的 XML - `.eml` —— 原始电子邮件文件;自动提取 DMARC 报告附件 重新上传已经导入的报告是安全的 —— 会检测到重复项并静默跳过。 ### 从 IMAP 获取 点击导航栏中的 **Fetch IMAP**。应用程序将: 1. 通过 TLS 连接到配置的 IMAP 服务器 2. 搜索 `IMAP_MAILBOX` 中的未读邮件 3. 提取所有 DMARC 报告附件 4. 解析并将其导入数据库 5. 将每封已处理的邮件移动到 `IMAP_PROCESSED_MAILBOX` 如果该子文件夹不存在,则会自动创建。 ### 查看数据 | 页面 | URL | 描述 | |------|-----|-------------| | 仪表盘 | `/` | 汇总统计数据和每周通过/失败趋势图表 | | 报告 | `/reports` | 所有导入的报告,可按域名和日期过滤 | | 报告详情 | `/reports/:id` | 单个报告,包含按 IP 划分的记录明细 | | 域名 | `/domains` | 所有域名及其汇总消息计数 | | 域名详情 | `/domains/:domain` | 所有报告中特定域名的记录 | | 来源 | `/sources` | 所有源 IP,可按周期、envelope-from、IP 和最小消息数过滤 | | 来源详情 | `/sources/:ip` | 所有报告中特定 IP 的记录 | | 导出 | `/export` | 管理报告下载(CSV、XLSX、PDF、DOCX);可选 `?domain=` 过滤器 | `/api/stats?days=90` 上的 JSON 端点返回用于编程使用的趋势数据。 ### 导出管理报告 在导航栏中导航至 **Export**。选择一个域名(或留空以选择所有域名)和一种格式: | 格式 | 描述 | |--------|-------------| | CSV | 扁平化的电子表格,每条 DMARC 记录占一行 | | XLSX | Excel 工作簿 | | PDF | 格式化的报告文档 | | DOCX | Word 兼容文档 | 下载的文件命名为 `dmarc-report--.`。 ### 切换主题 点击导航栏中的主题选择器(Pink / Blue / Goth)。所选内容会保存在 `ui_theme` cookie 中,并在不同会话之间持久保留。默认主题为 **Goth**。 ## 开发 直接运行而无需构建: ``` go run . ``` 运行测试: ``` go test ./... ``` 数据库文件会在首次运行时自动创建。要从头开始,请删除 `dmarc.db`。 ## 审计日志 所有导入事件都会写入 syslog(`facility=DAEMON`,标签 `dmarcreporter`)。如果本地 syslog 守护进程不可用,相同的事件将被写入 stderr。 记录的事件: | 事件 | 严重程度 | 字段 | |-------|----------|--------| | 报告已导入 | INFO | `source`、`org`、`domain`、`report_id`、`records` | | 报告重复(已跳过) | INFO | `source`、`org`、`report_id` | | 报告解析失败 | WARNING | `source`(仅文件名,无内部细节) | | IMAP 获取已开始 | INFO | `mailbox` | | IMAP 获取已完成 | INFO | `mailbox`、`imported` | | IMAP 获取失败 | ERROR | `mailbox` | 在 macOS 上,使用以下命令查看实时审计事件: ``` log stream --predicate 'senderImagePath contains "dmarcreporter"' ``` 在 Linux (journald) 上: ``` journalctl -t dmarcreporter -f ``` 在 Linux (syslog 文件) 上: ``` grep dmarcreporter /var/log/syslog ``` ## 网络通信 下表列出了应用程序建立或接受的每一个连接。使用它来为运行 DMARC Reporter 的主机配置防火墙规则。 ### 入站 | 端口 | 协议 | 方向 | 目的 | 是否必需 | |------|----------|-----------|---------|----------| | `8080` ¹ | TCP | → 服务器 | Web UI 和 API —— 浏览器或反向代理到应用程序 | 始终需要 | ¹ 可通过 `PORT` 环境变量进行配置。 ### 出站 | 端口 | 协议 | 方向 | 目的 | 是否必需 | |------|----------|-----------|---------|----------| | `993` ² | TCP | 服务器 → | 基于 TLS 的 IMAP —— 从邮箱获取 DMARC 报告 | 仅当设置了 `IMAP_HOST` 时 | | `143` ² | TCP | 服务器 → | 不带 TLS 的 IMAP —— **仅供开发/测试**,切勿在生产环境中使用 | 仅当 `IMAP_TLS=false` 时 | | `53` | UDP + TCP | 服务器 → | DNS —— DMARC (`_dmarc.*`)、BIMI (`default._bimi.*`)、MTA-STS (`_mta-sts.*`) 记录查找,以及源 IP 的反向 DNS;使用系统解析器 | 当使用 Enrich 或域名详情功能时 | | `43` | TCP | 服务器 → | WHOIS —— 源 IP 的组织、国家/地区、网络和滥用联系人查找;连接到每个 IP 块的权威 WHOIS 服务器(ARIN、RIPE、APNIC、LACNIC、AFRINIC 等) | 当使用 Enrich 或来源详情功能时 | ² 可通过 `IMAP_PORT` 环境变量进行配置。 ## 安全说明 - 启动时需要 `AUTH_PASSWORD`;除非显式设置 `AUTH_DISABLED=true`(仅供开发),否则应用程序将拒绝启动 - 所有更改状态的 POST 请求都需要 CSRF 令牌 - Flash 消息使用 `HttpOnly`、`Secure` 和 `SameSite=Lax` cookie - 所有响应均设置了 HTTP 安全头(CSP、X-Frame-Options、Referrer-Policy、Permissions-Policy) - 上传和获取的文件在解压前限制为 10 MB;解压后的内容上限为 50 MB,以防止解压炸弹攻击 - XML 实体扩展被禁用以防止 XXE 攻击 - IMAP 明文模式(`IMAP_TLS=false`)在启动时会记录警告,应仅用于本地测试
标签:DMARC, EVTX分析, Go, Mutation, Ruby工具, SQLite, 可视化, 日志审计, 邮件安全