dmarcguardhq/dmarcguard
GitHub: dmarcguardhq/dmarcguard
轻量级自托管DMARC报告解析器,自动从IMAP收件箱获取并解析DMARC聚合报告,通过美观的仪表板直观展示域名邮件认证状况与潜在仿冒风险。
Stars: 121 | Forks: 11
# 解析 DMARC
[](https://github.com/meysam81/parse-dmarc/blob/main/LICENSE)
[](https://github.com/meysam81/parse-dmarc/releases)
[](https://github.com/meysam81/parse-dmarc/stargazers)
[](https://github.com/meysam81/parse-dmarc/issues)
[](https://goreportcard.com/report/github.com/meysam81/parse-dmarc)
[](https://go.dev)
[](https://vuejs.org)
[](https://hub.docker.com/r/meysam81/parse-dmarc)
[](https://hub.docker.com/r/meysam81/parse-dmarc)
[](https://hub.docker.com/r/meysam81/parse-dmarc)
**监控谁在代表您的域发送电子邮件。识别伪造。阻止网络钓鱼。**
[](https://github.com/meysam81/parse-dmarc)
## 部署您自己的实例
一键将 Parse DMARC 部署到您最喜欢的云服务提供商:
### 平台即服务
| 提供商 | 部署 | 备注 |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
| **Railway** | [](https://railway.com/deploy/4kqQ_I?referralCode=meysam) | 推荐新手使用 |
| **Render** | [](https://render.com/deploy?repo=https://github.com/meysam81/parse-dmarc) | 提供免费套餐 |
| **Koyeb** | [][koyeb-1click] | 全球边缘部署。需手动挂载 `/data` 作为卷。 |
| **Zeabur** | [](https://zeabur.com/templates/YB3TS7?referralCode=meysam) | 亚太地区优化 |
| **Northflank** | [](https://app.northflank.com/s/account/templates/new?data=693e394eb41e1e64db65187e) | 专注于开发者 |
### 自托管
| 提供商 | 部署 | 备注 |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- |
| **CapRover** | [](./deploy/captain-definition) | 自托管 PaaS |
| **Coolify** | [](./deploy/coolify.yaml) | 开源 Heroku 替代品 |
| **Dokploy** | [](./deploy/dokploy/) | 自托管部署平台 |
| **Docker** | [](https://hub.docker.com/r/meysam81/parse-dmarc) | 可在任意位置运行 |
### 基础设施
| 提供商 | 部署 | 备注 |
| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- |
| **DigitalOcean Droplet** | [](./deploy/digitalocean/) | 使用 Packer 镜像的虚拟机 |
## 为什么我需要它?
**DMARC** (基于域的消息身份验证、报告和一致性) 有助于保护您的域免受电子邮件伪造和网络钓鱼的侵害。当您在您的域上启用 DMARC 时,Gmail、Outlook 和 Yahoo 等电子邮件提供商会向您发送**聚合报告**,其中显示:
- 谁在发送声称来自您域的电子邮件
- 哪些电子邮件通过或未通过身份验证 (SPF/DKIM)
- 发送了多少封电子邮件,以及来自哪些 IP 地址
- 是否有恶意攻击者试图冒充您的域
**问题在于:** 这些报告会作为压缩的 XML 附件到达您的收件箱中 - 几乎无法手动阅读或分析。
**解决方案:** Parse DMARC 会自动从您的收件箱中获取这些报告,对其进行解析,并在美观的仪表板中展示所有内容。所有这些都包含在一个 14MB 的 Docker 镜像中。
## 功能
- 📧 自动从任何 IMAP 收件箱 (Gmail、Outlook 等) 获取报告
- 📊 具有实时统计数据的精美仪表板
- 🔍 准确查看谁在以您的域名义发送电子邮件
- 🔧 内置 DNS 记录生成器,便于 DMARC 设置
- 📦 单个二进制文件 - 无需安装数据库,无需复杂设置
- 🚀 仅 14MB 的超小 Docker 镜像
- 🔒 安全的 TLS 支持
- 🌙 暗黑模式支持
## 安装
### Homebrew (macOS/Linux)
```
brew tap meysam81/tap
brew install parse-dmarc
```
### Docker
```
docker pull meysam81/parse-dmarc
```
### 二进制文件下载
从 [Releases 页面](https://github.com/meysam81/parse-dmarc/releases) 下载预构建的二进制文件。
## 快速开始
### 步骤 1:设置 DNS 以接收 DMARC 报告
**这是最重要的一步!** 如果没有这一步,您将不会收到任何可供分析的报告。
将 DMARC TXT 记录添加到您域的 DNS 中:
```
Name: _dmarc.yourdomain.com
Type: TXT
Value: v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com
```
**这代表什么含义:**
- `p=none` - 仅监控 (暂不拦截电子邮件)
- `rua=mailto:dmarc@yourdomain.com` - 将聚合报告发送到此电子邮件地址
**重要提示:** 将 `dmarc@yourdomain.com` 替换为您控制的实际电子邮箱收件箱。这是 Gmail、Outlook、Yahoo 等向您发送 DMARC 报告的地址。
**DNS 示例:**
- **Cloudflare:** DNS > 添加记录 > 类型:TXT,名称:`_dmarc`,内容:`v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com`
- **Google Domains:** DNS > 自定义记录 > TXT,名称:`_dmarc`,数据:`v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com`
- **AWS Route53:** 创建记录 > 类型:TXT,名称:`_dmarc.yourdomain.com`,值:`"v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com"`
报告通常会在 24-48 小时内开始送达。
### 步骤 2:使用 Docker 运行 Parse DMARC
**运行容器:**
```
docker run -d \
--name parse-dmarc \
-p 8080:8080 \
-e IMAP_HOST=imap.gmail.com \
-e IMAP_PORT=993 \
-e IMAP_USERNAME=your-email@gmail.com \
-e IMAP_PASSWORD=your-app-password \
-v parse-dmarc:/data \
meysam81/parse-dmarc
```
**对于 Gmail 用户:** 您需要使用[应用专用密码](https://support.google.com/accounts/answer/185833),而不是您的常规 Gmail 密码。
**访问仪表板:** 在浏览器中打开 `http://localhost:8080`。
## 您将看到什么
一旦 DMARC 报告开始送达并被 Parse DMARC 处理,您的仪表板将显示:
- 跨所有报告分析的**总消息数**
- **DMARC 合规率** (SPF/DKIM 通过率)
- **主要发送源** (以您的域发送邮件的 IP 地址和组织)
- **身份验证结果** (哪些邮件通过/未通过 SPF 和 DKIM)
- **策略操作** (接收服务器如何处理您的电子邮件)
这有助于您:
- 验证您的合法电子邮件服务是否已正确配置
- 检测未经授权使用您的域的行为
- 逐步从监控 (`p=none`) 过渡到强制执行 (`p=quarantine` 或 `p=reject`)
## 配置选项
### 常见提供商的 IMAP 设置
**Gmail:**
```
{
"host": "imap.gmail.com",
"port": 993,
"username": "your-email@gmail.com",
"password": "your-app-password",
"use_tls": true
}
```
需要[应用专用密码](https://support.google.com/accounts/answer/185833)
**Outlook/Office 365:**
```
{
"host": "outlook.office365.com",
"port": 993,
"username": "your-email@outlook.com",
"password": "your-password",
"use_tls": true
}
```
**通用 IMAP:**
大多数提供商使用带有 TLS 的端口 `993`。请查阅您的提供商文档。
### 命令行选项
```
# 获取一次并退出(适用于 cron jobs)
docker exec parse-dmarc ./parse-dmarc -fetch-once
# 仅提供 dashboard(不获取)
docker exec parse-dmarc ./parse-dmarc -serve-only
# 自定义获取间隔(以秒为单位,默认 300)
docker exec parse-dmarc ./parse-dmarc -fetch-interval=600
```
## 常见问题解答
**问:我没有收到任何报告。出了什么问题?**
答:请按顺序检查以下事项:
1. 您是否将 `_dmarc` TXT 记录添加到了您的 DNS 中?(使用诸如 `dig _dmarc.yourdomain.com TXT` 的 DNS 检查工具)
2. 请等待 24-48 小时 - 报告不会立即生成
3. 您的域是否正在发送/接收电子邮件?没有电子邮件 = 没有报告
4. 检查您在 `config.json` 中的 IMAP 凭据是否正确
**问:我需要先设置 SPF 和 DKIM 吗?**
答:不需要!DMARC 报告会向您展示 SPF 和 DKIM 是通过还是失败,这有助于您正确配置它们。
**问:我的 DMARC 策略应该是什么?**
答:从 `p=none` (仅监控) 开始。在查看报告并修复所有问题后,逐步过渡到 `p=quarantine`,然后再过渡到 `p=reject`。
**问:我需要多少电子邮件流量?**
答:多少都可以。即使每天只有几封电子邮件的小型域也会收到有用的报告。
**问:我可以使用 Gmail 帐户接收报告吗?**
答:可以!创建一个专用的 Gmail,例如 `dmarc@yourdomain.com`,如果需要,将其转发到您的个人 Gmail,并使用 Gmail 的 IMAP 设置。
## 进阶
### 从源代码构建
```
git clone https://github.com/meysam81/parse-dmarc.git
cd parse-dmarc
just install-deps
just build
./bin/parse-dmarc -config=config.json
```
### Docker Compose
有关 Docker Compose 配置,请参阅 [`compose.yml`](./compose.yml)。
### API 端点
- `GET /api/statistics` - 仪表板统计信息
- `GET /api/reports` - 报告列表 (分页)
- `GET /api/reports/:id` - 详细报告视图
- `GET /api/top-sources` - 排名靠前的发送源 IP
- `GET /metrics` - Prometheus 指标端点
## Prometheus 指标与 Grafana 集成
Parse DMARC 包含可用于生产环境的 Prometheus 指标,用于监控和警报。指标默认启用并在 `/metrics` 处公开。
### 可用指标
#### 构建信息
| 指标 | 类型 | 描述 |
| ------------------------ | ----- | ----------------------------------------------- |
| `parse_dmarc_build_info` | Gauge | 构建信息 (版本、提交、build_date) |
#### 报告处理
| 指标 | 类型 | 描述 |
| -------------------------------------------------- | --------- | ------------------------------------------- |
| `parse_dmarc_reports_fetched_total` | Counter | 从 IMAP 获取的 DMARC 报告电子邮件总数 |
| `parse_dmarc_reports_parsed_total` | Counter | 成功解析的 DMARC 报告总数 |
| `parse_dmarc_reports_stored_total` | Counter | 存储在数据库中的 DMARC 报告总数 |
| `parse_dmarc_reports_parse_errors_total` | Counter | 总解析错误 |
| `parse_dmarc_reports_store_errors_total` | Counter | 总存储错误 |
| `parse_dmarc_reports_attachments_total` | Counter | 处理的总附件数 |
| `parse_dmarc_reports_fetch_duration_seconds` | Histogram | 获取操作的耗时 |
| `parse_dmarc_reports_last_fetch_timestamp_seconds` | Gauge | 上次成功获取的 Unix 时间戳 |
| `parse_dmarc_reports_fetch_cycles_total` | Counter | 执行的总获取周期数 |
| `parse_dmarc_reports_fetch_errors_total` | Counter | 总获取周期错误数 |
#### IMAP 连接
| 指标 | 类型 | 标签 | 描述 |
| ---------------------------------------------- | --------- | ------ | ---------------------------------------- |
| `parse_dmarc_imap_connections_total` | Counter | status | IMAP 连接尝试 (成功/错误) |
| `parse_dmarc_imap_connection_duration_seconds` | Histogram | | IMAP 连接建立持续时间 |
#### DMARC 统计
| 指标 | 类型 | 描述 |
| -------------------------------------------- | ----- | --------------------------------- |
| `parse_dmarc_dmarc_reports_total` | Gauge | 数据库中的报告总数 |
| `parse_dmarc_dc_messages_total` | Gauge | 所有报告中的消息总数 |
| `parse_dmarc_dmarc_compliant_messages_total` | Gauge | 符合 DMARC 标准的消息总数 |
| `parse_dmarc_dmarc_compliance_rate` | Gauge | 总体合规率 (0-100) |
| `parse_dmarc_dmarc_unique_source_ips` | Gauge | 唯一源 IP 数量 |
| `parse_dmarc_dmarc_unique_domains` | Gauge | 唯一域数量 |
#### 按域/组织划分的指标
| 指标 | 类型 | 标签 | 描述 |
| --------------------------------------------- | ----- | ----------- | ---------------------------- |
| `parse_dmarc_dmarc_messages_by_domain` | Gauge | domain | 每个域的消息数 |
| `parse_dmarc_dmarc_compliance_rate_by_domain` | Gauge | domain | 每个域的合规率 |
| `parse_dmarc_dmarc_reports_by_org` | Gauge | org_name | 每个组织的报告数 |
| `parse_dmarc_dmarc_messages_by_disposition` | Gauge | disposition | 按处置类型划分的消息数 |
#### 身份验证结果
| 指标 | 类型 | 标签 | 描述 |
| -------------------------------- | ----- | ------ | --------------------------------- |
| `parse_dmarc_dmarc_spf_results` | Gauge | result | SPF 身份验证结果计数 |
| `parse_dmarc_dmarc_dkim_results` | Gauge | result | DKIM 身份验证结果计数 |
#### HTTP 服务器
| 指标 | 类型 | 标签 | 描述 |
| ------------------------------------------- | --------- | -------------------- | -------------------------- |
| `parse_dmarc_http_requests_total` | Counter | method, path, status | 总 HTTP 请求数 |
| `parse_dmarc_http_request_duration_seconds` | Histogram | method, path | HTTP 请求耗时 |
| `parse_dmarc_http_requests_in_flight` | Gauge | | 当前正在处理的请求 |
#### Go 运行时 (内置)
标准的 Go 运行时指标也会被公开:
- `go_goroutines` - Goroutine 数量
- `go_memstats_*` - 内存统计信息
- `go_gc_*` - 垃圾回收指标
- `process_*` - 进程指标 (CPU、内存、文件描述符)
### 禁用指标
要禁用指标端点:
```
# 命令行
./parse-dmarc --metrics=false
# Environment variable
export PARSE_DMARC_METRICS=false
# Docker
docker run -e PARSE_DMARC_METRICS=false meysam81/parse-dmarc
```
### Prometheus 配置
将 Parse DMARC 添加到您的 `prometheus.yml` 中:
```
scrape_configs:
- job_name: "parse-dmarc"
static_configs:
- targets: ["parse-dmarc:8080"]
scrape_interval: 30s
metrics_path: /metrics
```
对于使用 ServiceMonitor (Prometheus Operator) 的 Kubernetes:
```
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: parse-dmarc
labels:
app: parse-dmarc
spec:
selector:
matchLabels:
app: parse-dmarc
endpoints:
- port: http
path: /metrics
interval: 30s
```
### Grafana 仪表板
`grafana/dashboard.json` 中包含了一个可用于生产环境的 Grafana 仪表板。
#### 手动导入
1. 在 Grafana 中,进入 **Dashboards** > **Import**
2. 上传 `grafana/dashboard.json` 或粘贴其内容
3. 选择您的 Prometheus 数据源
4. 点击 **Import**
#### 自动配置 (推荐用于生产环境)
```
# 将 dashboard 复制到 Grafana dashboards 目录
cp grafana/dashboard.json /var/lib/grafana/dashboards/parse-dmarc/
# 复制 provisioning config
cp grafana/provisioning.yaml /etc/grafana/provisioning/dashboards/parse-dmarc.yaml
# 重启 Grafana 或等待其识别更改
systemctl restart grafana-server
```
#### 仪表板变量
| 变量 | 用途 |
| ------------ | ------------------------------ |
| `datasource` | 要查询的 Prometheus 数据源 |
| `job` | 按 Prometheus 作业标签过滤 |
| `instance` | 按实例过滤 |
| `domain` | 按监控的域过滤 |
#### 仪表板部分
| 部分 | 显示内容 |
| ---------------------------------- | ------------------------------------------------------------------------- |
| **概览 - 黄金信号** | 合规率、总消息数、报告计数、距上次获取的时间 |
| **DMARC 身份验证结果** | SPF/DKIM 通过率、处置明细、按域划分的合规性 |
| **报告来源与组织** | 排名靠前的报告组织 (Google、Microsoft 等)、按域划分的消息数 |
| **IMAP 与获取操作** | 连接健康状况、获取周期监控、延迟热力图 |
| **错误追踪** | 解析错误、存储错误、获取失败 |
| **HTTP 服务器** | 请求率、延迟百分位数、错误率 |
| **Go 运行时** | Goroutine、内存使用量、GC 统计信息、CPU 使用率 |
#### Grafana 面板示例
**合规率仪表:**
```
parse_dmarc_dmarc_compliance_rate
```
**随时间变化的消息:**
```
rate(parse_dmarc_dmarc_messages_total[5m])
```
**按域划分的合规率:**
```
parse_dmarc_dmarc_compliance_rate_by_domain
```
**SPF/DKIM 通过率:**
```
# SPF 通过率
parse_dmarc_dmarc_spf_results{result="pass"} / ignoring(result) sum(parse_dmarc_dmarc_spf_results) * 100
# DKIM 通过率
parse_dmarc_dmarc_dkim_results{result="pass"} / ignoring(result) sum(parse_dmarc_dmarc_dkim_results) * 100
```
**获取成功率:**
```
1 - (rate(parse_dmarc_reports_fetch_errors_total[1h]) / rate(parse_dmarc_reports_fetch_cycles_total[1h]))
```
**IMAP 连接健康状况:**
```
rate(parse_dmarc_imap_connections_total{status="success"}[5m]) /
(rate(parse_dmarc_imap_connections_total{status="success"}[5m]) + rate(parse_dmarc_imap_connections_total{status="error"}[5m]))
```
**HTTP 请求延迟 (p95):**
```
histogram_quantile(0.95, rate(parse_dmarc_http_request_duration_seconds_bucket[5m]))
```
**按组织划分的报告:**
```
topk(10, parse_dmarc_dmarc_reports_by_org)
```
#### 警报规则
示例 Prometheus 警报规则:
```
groups:
- name: parse-dmarc
rules:
- alert: DMARCComplianceLow
expr: parse_dmarc_dmarc_compliance_rate < 90
for: 1h
labels:
severity: warning
annotations:
summary: "DMARC compliance rate is below 90%"
description: "Current compliance rate: {{ $value }}%"
- alert: DMARCFetchFailures
expr: rate(parse_dmarc_reports_fetch_errors_total[15m]) > 0
for: 30m
labels:
severity: critical
annotations:
summary: "Parse DMARC fetch failures detected"
description: "IMAP fetch operations are failing"
- alert: IMAPConnectionErrors
expr: rate(parse_dmarc_imap_connections_total{status="error"}[5m]) > 0
for: 10m
labels:
severity: warning
annotations:
summary: "IMAP connection errors detected"
description: "Check IMAP credentials and server connectivity"
- alert: NoRecentFetch
expr: time() - parse_dmarc_reports_last_fetch_timestamp_seconds > 600
for: 5m
labels:
severity: warning
annotations:
summary: "No recent DMARC report fetch"
description: "Last fetch was {{ humanizeDuration $value }} ago"
```
### 使用 Prometheus 和 Grafana 的 Docker Compose
完整的监控堆栈:
```
version: "3.8"
services:
parse-dmarc:
image: meysam81/parse-dmarc
ports:
- "8080:8080"
volumes:
- ./config.json:/app/config.json
- ./data:/data
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
command:
- "--config.file=/etc/prometheus/prometheus.yml"
grafana:
image: grafana/grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana-data:/var/lib/grafana
volumes:
grafana-data:
```
使用 `prometheus.yml`:
```
global:
scrape_interval: 15s
scrape_configs:
- job_name: "parse-dmarc"
static_configs:
- targets: ["parse-dmarc:8080"]
```
访问地址:
- Parse DMARC 仪表板:http://localhost:8080
- Prometheus:http://localhost:9090
- Grafana:http://localhost:3000 (admin/admin)
### 为什么选择 Parse DMARC 而不是 ParseDMARC?
该项目的灵感来源于 [ParseDMARC](https://github.com/domainaware/parsedmarc),但更注重简单性:
- **14MB 单一二进制文件**,对比 Python + Elasticsearch + Kibana 技术栈
- **内置仪表板**,对比外部可视化工具
- **SQLite**,对比 Elasticsearch (不需要 JVM)
- **零依赖**,对比复杂的设置过程
## 贡献
欢迎提交 Issues 和 Pull Requests!请查看 [issues 页面](https://github.com/meysam81/parse-dmarc/issues)。
## 许可证
Apache-2.0 - 详情请参阅 [LICENSE](LICENSE)。
**觉得这个项目有用吗?给仓库点个 Star 吧!** ⭐
标签:DMARC, Docker, EVTX分析, Go, IMAP, LangChain, PaaS, RFC 7489, Ruby工具, SQLite, Vue 3, Vue.js, 仪表盘, 单文件部署, 域名保护, 安全防御评估, 开源, 日志审计, 电子邮件安全, 系统运维, 网络安全, 自定义请求头, 自托管, 请求拦截, 轻量级, 邮件解析, 防伪造, 防钓鱼, 隐私保护