🚀 Parse DMARC
Parse DMARC 可以幫助你監控代表你的域名發送電子郵件的對象,檢測仿冒行為並阻止網絡釣魚。它能自動從你的收件箱中提取 DMARC 報告,解析這些報告,並在美觀的儀表板中展示所有信息。
🚀 快速開始
步驟 1:設置 DNS 以接收 DMARC 報告
這是最重要的一步!如果不進行此設置,你將無法收到任何可分析的報告。
在你的域名 DNS 中添加一條 DMARC TXT 記錄:
名稱:_dmarc.yourdomain.com
類型:TXT
值: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 用戶注意:你需要使用 應用密碼,而不是常規的 Gmail 密碼。
訪問儀表板:在瀏覽器中打開 http://localhost:8080。
✨ 主要特性
- 📧 自動從任何 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
二進制文件下載
從 發佈頁面 下載預構建的二進制文件。
💻 使用示例
基礎用法
當 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
}
需要 應用密碼
Outlook/Office 365:
{
"host": "outlook.office365.com",
"port": 993,
"username": "your-email@outlook.com",
"password": "your-password",
"use_tls": true
}
通用 IMAP:大多數提供商使用端口 993 並啟用 TLS。請查看你提供商的文檔。
命令行選項
docker exec parse-dmarc ./parse-dmarc -fetch-once
docker exec parse-dmarc ./parse-dmarc -serve-only
docker exec parse-dmarc ./parse-dmarc -fetch-interval=600
常見問題解答
問:我沒有收到任何報告,怎麼回事?
答:請按以下順序檢查:
- 你是否在 DNS 中添加了
_dmarc TXT 記錄?(使用 dig _dmarc.yourdomain.com TXT 等 DNS 檢查工具)
- 等待 24 - 48 小時 - 報告不是即時的
- 你的域名是否正在發送/接收電子郵件?沒有郵件就沒有報告
- 檢查
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 配置。
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 |
構建信息(版本、提交、構建日期) |
報告處理
| 指標 |
類型 |
描述 |
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_dmarc_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 - 協程數量
go_memstats_* - 內存統計信息
go_gc_* - 垃圾回收指標
process_* - 進程指標(CPU、內存、文件描述符)
禁用指標
要禁用指標端點:
./parse-dmarc --metrics=false
export PARSE_DMARC_METRICS=false
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 儀表板。
手動導入
- 在 Grafana 中,轉到 儀表板 > 導入
- 上傳
grafana/dashboard.json 或粘貼其內容
- 選擇你的 Prometheus 數據源
- 點擊 導入
自動配置(推薦用於生產環境)
cp grafana/dashboard.json /var/lib/grafana/dashboards/parse-dmarc/
cp grafana/provisioning.yaml /etc/grafana/provisioning/dashboards/parse-dmarc.yaml
systemctl restart grafana-server
儀表板變量
| 變量 |
用途 |
datasource |
要查詢的 Prometheus 數據源 |
job |
按 Prometheus 作業標籤過濾 |
instance |
按實例過濾 |
domain |
按監控的域名過濾 |
儀表板部分
| 部分 |
顯示內容 |
| 概述 - 關鍵指標 |
合規率、總郵件數、報告數量、自上次獲取以來的時間 |
| DMARC 認證結果 |
SPF/DKIM 通過率、處理細分、按域名的合規情況 |
| 報告源與組織 |
主要報告組織(Google、Microsoft 等)、按域名的郵件數 |
| IMAP 與獲取操作 |
連接健康狀況、獲取週期監控、延遲熱力圖 |
| 錯誤跟蹤 |
解析錯誤、存儲錯誤、獲取失敗 |
| HTTP 服務器 |
請求率、延遲百分位數、錯誤率 |
| Go 運行時 |
協程、內存使用、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 合規率低於 90%"
description: "當前合規率: {{ $value }}%"
- alert: DMARCFetchFailures
expr: rate(parse_dmarc_reports_fetch_errors_total[15m]) > 0
for: 30m
labels:
severity: critical
annotations:
summary: "檢測到 Parse DMARC 獲取失敗"
description: "IMAP 獲取操作失敗"
- alert: IMAPConnectionErrors
expr: rate(parse_dmarc_imap_connections_total{status="error"}[5m]) > 0
for: 10m
labels:
severity: warning
annotations:
summary: "檢測到 IMAP 連接錯誤"
description: "檢查 IMAP 憑證和服務器連接性"
- alert: NoRecentFetch
expr: time() - parse_dmarc_reports_last_fetch_timestamp_seconds > 600
for: 5m
labels:
severity: warning
annotations:
summary: "最近未獲取 DMARC 報告"
description: "上次獲取是 {{ humanizeDuration $value }} 前"
Docker Compose 與 Prometheus 和 Grafana
完整的監控堆棧:
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 啟發,但構建得更加簡單:
- 單個 14MB 二進制文件 對比 Python + Elasticsearch + Kibana 堆棧
- 內置儀表板 對比外部可視化工具
- SQLite 對比 Elasticsearch(無需 JVM)
- 零依賴 對比複雜的設置
📄 許可證
本項目採用 Apache-2.0 許可證,詳情請參閱 LICENSE。
覺得這個項目有用?給倉庫點個星吧! ⭐