dmarcguardhq/dmarcguard

GitHub: dmarcguardhq/dmarcguard

轻量级自托管DMARC报告解析器,自动从IMAP收件箱获取并解析DMARC聚合报告,通过美观的仪表板直观展示域名邮件认证状况与潜在仿冒风险。

Stars: 121 | Forks: 11

# 解析 DMARC [![License](https://img.shields.io/github/license/meysam81/parse-dmarc?style=flat-square)](https://github.com/meysam81/parse-dmarc/blob/main/LICENSE) [![GitHub release](https://img.shields.io/github/v/release/meysam81/parse-dmarc?style=flat-square)](https://github.com/meysam81/parse-dmarc/releases) [![GitHub Stars](https://img.shields.io/github/stars/meysam81/parse-dmarc?style=flat-square&logo=github)](https://github.com/meysam81/parse-dmarc/stargazers) [![GitHub Issues](https://img.shields.io/github/issues/meysam81/parse-dmarc?style=flat-square&logo=github)](https://github.com/meysam81/parse-dmarc/issues) [![Go Report Card](https://goreportcard.com/badge/github.com/meysam81/parse-dmarc?style=flat-square)](https://goreportcard.com/report/github.com/meysam81/parse-dmarc) [![Made with Go](https://img.shields.io/badge/Made%20with-Go-1f425f.svg?style=flat-square&logo=go)](https://go.dev) [![Made with Vue.js](https://img.shields.io/badge/Made%20with-Vue.js-4FC08D.svg?style=flat-square&logo=vue.js)](https://vuejs.org) [![Docker Hub](https://img.shields.io/badge/Docker%20Hub-meysam81%2Fparse--dmarc-blue?style=flat-square&logo=docker)](https://hub.docker.com/r/meysam81/parse-dmarc) [![Docker Pulls](https://img.shields.io/docker/pulls/meysam81/parse-dmarc?style=flat-square&logo=docker)](https://hub.docker.com/r/meysam81/parse-dmarc) [![Docker Image Size (tag)](https://img.shields.io/docker/image-size/meysam81/parse-dmarc/v1)](https://hub.docker.com/r/meysam81/parse-dmarc) **监控谁在代表您的域发送电子邮件。识别伪造。阻止网络钓鱼。** [![Parse DMARC](https://raw.githubusercontent.com/dmarcguardhq/dmarcguard/main/assets/social-preview.png)](https://github.com/meysam81/parse-dmarc) ## 部署您自己的实例 一键将 Parse DMARC 部署到您最喜欢的云服务提供商: ### 平台即服务 | 提供商 | 部署 | 备注 | | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------- | | **Railway** | [![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/4kqQ_I?referralCode=meysam) | 推荐新手使用 | | **Render** | [![Deploy to Render](https://render.com/images/deploy-to-render-button.svg)](https://render.com/deploy?repo=https://github.com/meysam81/parse-dmarc) | 提供免费套餐 | | **Koyeb** | [![Deploy to Koyeb](https://www.koyeb.com/static/images/deploy/button.svg)][koyeb-1click] | 全球边缘部署。需手动挂载 `/data` 作为卷。 | | **Zeabur** | [![Deploy on Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/YB3TS7?referralCode=meysam) | 亚太地区优化 | | **Northflank** | [![Deploy to Northflank](https://assets.northflank.com/deploy_to_northflank_smm_36700fb050.svg)](https://app.northflank.com/s/account/templates/new?data=693e394eb41e1e64db65187e) | 专注于开发者 | ### 自托管 | 提供商 | 部署 | 备注 | | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------- | | **CapRover** | [![Deploy to CapRover](https://img.shields.io/badge/Deploy-CapRover-0072CE?style=for-the-badge&logo=docker)](./deploy/captain-definition) | 自托管 PaaS | | **Coolify** | [![Deploy to Coolify](https://img.shields.io/badge/Deploy-Coolify-6B46C1?style=for-the-badge&logo=docker)](./deploy/coolify.yaml) | 开源 Heroku 替代品 | | **Dokploy** | [![Deploy to Dokploy](https://img.shields.io/badge/Deploy-Dokploy-00B4D8?style=for-the-badge&logo=docker)](./deploy/dokploy/) | 自托管部署平台 | | **Docker** | [![Docker](https://img.shields.io/badge/Docker-Pull%20Image-2496ED?style=for-the-badge&logo=docker)](https://hub.docker.com/r/meysam81/parse-dmarc) | 可在任意位置运行 | ### 基础设施 | 提供商 | 部署 | 备注 | | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | | **DigitalOcean Droplet** | [![Deploy to DigitalOcean](https://img.shields.io/badge/Deploy-DigitalOcean-0080FF?style=for-the-badge&logo=digitalocean)](./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, 仪表盘, 单文件部署, 域名保护, 安全防御评估, 开源, 日志审计, 电子邮件安全, 系统运维, 网络安全, 自定义请求头, 自托管, 请求拦截, 轻量级, 邮件解析, 防伪造, 防钓鱼, 隐私保护