实施 DMARC、DKIM 和 SPF 邮件安全
概述
SPF、DKIM 和 DMARC 是邮件认证的三大支柱。三者共同防止域名伪造、验证消息完整性并定义处理未认证邮件的策略。正确实施可显著减少冒充组织域名的钓鱼攻击。
前置条件
- 域名的 DNS 管理访问权限
- 邮件服务器/MTA 配置访问权限(Postfix、Exchange、Google Workspace、Microsoft 365)
- 对 DNS TXT 记录的基本了解
- Python 3.8+ 用于验证脚本
核心概念
SPF(发件人策略框架)
发布 DNS TXT 记录,列出被授权代表您的域名发送邮件的 IP 地址和邮件服务器。接收服务器根据此列表检查信封发件人的 IP。
DKIM(域名密钥识别邮件)
使用私钥向外发邮件添加加密签名。相应的公钥在 DNS 中发布。接收方验证签名以确保消息在传输过程中未被篡改。
DMARC(基于域名的消息认证、报告和一致性)
基于 SPF 和 DKIM 构建,为认证失败的消息指定策略(none/quarantine/reject),并提供监控伪造尝试的报告机制。
实施步骤
步骤一:审计当前状态
# 检查现有 SPF 记录
dig TXT example.com | grep spf
# 检查现有 DKIM 选择器
dig TXT selector1._domainkey.example.com
# 检查现有 DMARC 记录
dig TXT _dmarc.example.com
步骤二:实施 SPF
# example.com 的 DNS TXT 记录
v=spf1 ip4:203.0.113.0/24 include:_spf.google.com include:spf.protection.outlook.com -all
关键 SPF 机制:
ip4:/ip6:— 授权特定 IP 范围include:— 包含另一个域的 SPF 记录a— 授权域名的 A 记录 IPmx— 授权域名的 MX 记录 IP-all— 硬拒绝其他所有(推荐)~all— 软拒绝(监控阶段)
步骤三:实施 DKIM
# 生成 DKIM 密钥对(2048 位 RSA)
openssl genrsa -out dkim_private.pem 2048
openssl rsa -in dkim_private.pem -pubout -out dkim_public.pem
# 格式化公钥用于 DNS(删除头部,合并行)
grep -v "PUBLIC KEY" dkim_public.pem | tr -d '\n'
selector1._domainkey.example.com 的 DNS TXT 记录:
v=DKIM1; k=rsa; p=MIIBIjANBgkqhki...
步骤四:实施 DMARC
# _dmarc.example.com 的 DNS TXT 记录
# 阶段 1(监控):
v=DMARC1; p=none; rua=mailto:dmarc-aggregate@example.com; ruf=mailto:dmarc-forensic@example.com; pct=100
# 阶段 2(隔离):
v=DMARC1; p=quarantine; rua=mailto:dmarc-aggregate@example.com; pct=25
# 阶段 3(拒绝):
v=DMARC1; p=reject; rua=mailto:dmarc-aggregate@example.com; pct=100
步骤五:监控和分析 DMARC 报告
使用 scripts/process.py 解析 DMARC 聚合 XML 报告,识别认证失败、未授权发件人和伪造尝试。
工具与资源
- MXToolbox: https://mxtoolbox.com/SuperTool.aspx
- DMARC Analyzer(dmarcian): https://dmarcian.com/
- Google Postmaster Tools: https://postmaster.google.com/
- Valimail DMARC Monitor: https://www.valimail.com/
- DMARC Report Analyzer: https://dmarc.postmarkapp.com/
验证
- SPF 记录在 mxtoolbox.com 上通过验证
- DKIM 签名在测试邮件上得到验证
- DMARC 记录格式正确且已启用报告
- 测试邮件在收件人的 Authentication-Results 标头中通过所有三项检查