SPF/DKIM/DMARC
SPF, DKIM y DMARC forman la tríada esencial de autenticación de email, protegiendo contra spoofing y mejorando la entregabilidad del correo electrónico.
SPF (Sender Policy Framework)
¿Qué es SPF?
SPF es un protocolo que permite verificar si un servidor de email está autorizado para enviar correo en nombre de un dominio.
Cómo Funciona
- Publicación: El dominio publica IPs/servidores autorizados
- Verificación: El receptor consulta el registro SPF del dominio remitente
- Validación: Compara la IP del servidor con la lista autorizada
Sintaxis del Registro SPF
v=spf1 [mecanismos] [modificadores]
Mecanismos Principales
| Mecanismo | Descripción | Ejemplo |
|---|---|---|
+ip4: |
IP IPv4 autorizada | +ip4:192.168.1.1 |
+ip6: |
IP IPv6 autorizada | +ip6:2001:db8::1 |
+a |
Autoriza A/AAAA records | +a:mail.example.com |
+mx |
Autoriza registros MX | +mx |
+include: |
Incluye política de otro dominio | +include:_spf.google.com |
+all |
Permite todo (no recomendado) | +all |
-all |
Niega todo lo demás | -all |
~all |
Soft fail (recomendado) | ~all |
Ejemplos de Registros SPF
Básico para dominio propio:
v=spf1 +mx +a:mail.example.com -all
Con servicios externos:
v=spf1 include:_spf.google.com include:spf.protection.outlook.com -all
Para mailing lists:
v=spf1 include:_spf.google.com include:servers.mcsv.net ~all
Configuración SPF
En BIND/DNS
@ IN TXT "v=spf1 +mx +a:mail.example.com -all"
Verificación
# Verificar registro SPF
dig TXT example.com
# Probar SPF
spfquery -ip=192.168.1.1 -sender=[email protected]
DKIM (DomainKeys Identified Mail)
¿Qué es DKIM?
DKIM firma criptográficamente los emails salientes, permitiendo verificar que el contenido no ha sido alterado y confirmar la autenticidad del remitente.
Cómo Funciona DKIM
- Generación de claves: El dominio crea par de claves público/privado
- Firma: El MTA firma el email con la clave privada
- Publicación: La clave pública se publica en DNS
- Verificación: El receptor verifica la firma con la clave pública
Componentes DKIM
Selector
Identifica qué clave usar cuando hay múltiples:
selector._domainkey.example.com
Registro DKIM
selector._domainkey IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC..."
Cabecera DKIM-Signature
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=example.com; s=selector; h=from:to:subject;
bh=...; b=...
Configuración DKIM
Generar Claves
# Usando opendkim
opendkim-genkey -s selector -d example.com
# Usando Python
python3 -c "
import dkim
key = dkim.rsa_key_gen()
print('Private key:')
print(key[0].decode())
print('Public key:')
print(key[1].decode())
"
En Postfix
# main.cf
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
milter_default_action = accept
Verificación DKIM
# Verificar clave pública
dig TXT selector._domainkey.example.com
# Probar DKIM
dkimpy-milter --test
DMARC (Domain-based Message Authentication, Reporting and Conformance)
¿Qué es DMARC?
DMARC combina SPF y DKIM, proporcionando políticas para manejar emails que fallan la autenticación y reportes sobre la actividad del dominio.
Cómo Funciona DMARC
- Publicación: Política DMARC en
_dmarc.example.com - Evaluación: Verifica SPF y/o DKIM
- Acción: Aplica política según resultado
- Reportes: Envía reportes XML al dominio
Registro DMARC
v=DMARC1; p=quarantine; rua=mailto:[email protected]; ruf=mailto:[email protected]; fo=1
Parámetros Principales
| Parámetro | Descripción | Valores |
|---|---|---|
p |
Política | none, quarantine, reject |
sp |
Política subdominios | none, quarantine, reject |
rua |
Reportes agregados | mailto:[email protected] |
ruf |
Reportes forenses | mailto:[email protected] |
fo |
Opciones de reporte | 0, 1, d, s |
adkim |
Alineación DKIM | r (relaxed), s (strict) |
aspf |
Alineación SPF | r (relaxed), s (strict) |
Políticas DMARC
p=none
- Acción: No hacer nada
- Uso: Modo monitor, solo reportes
- Ejemplo:
p=none; rua=mailto:[email protected]
p=quarantine
- Acción: Enviar a spam
- Uso: Protección moderada
- Ejemplo:
p=quarantine; rua=mailto:[email protected]
p=reject
- Acción: Rechazar email
- Uso: Máxima protección
- Ejemplo:
p=reject; rua=mailto:[email protected]
Configuración DMARC
Registro DNS
_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:[email protected]; ruf=mailto:[email protected]; fo=1; adkim=r; aspf=r"
Verificación
# Verificar registro DMARC
dig TXT _dmarc.example.com
# Validar sintaxis
dmarc-validate example.com
Implementación Completa
Secuencia de Configuración
- Configurar SPF
- Implementar DKIM
- Publicar DMARC en modo monitor (p=none)
- Analizar reportes
- Ajustar políticas gradualmente
Ejemplo Completo
1. SPF Record
v=spf1 include:_spf.google.com include:spf.protection.outlook.com -all
2. DKIM Keys
# Generar para Google Workspace
# Las claves se generan automáticamente en admin.google.com
3. DMARC Record
v=DMARC1; p=quarantine; rua=mailto:[email protected]; ruf=mailto:[email protected]; fo=1; pct=100
Herramientas de Testing
Validadores Online
- MX Toolbox: SPF, DKIM, DMARC checker
- Mail Tester: Envía email de prueba
- DMARC Analyzer: Analiza reportes
Comandos
# Verificar todos los registros
dig TXT example.com _dmarc.example.com selector._domainkey.example.com
# Enviar email de prueba
swaks --to [email protected] --from [email protected] --server mail.example.com --tls
Reportes DMARC
Tipos de Reportes
Reportes Agregados (RUA)
- Formato: XML comprimido
- Frecuencia: Diaria
- Contenido: Estadísticas de autenticación
Reportes Forenses (RUF)
- Formato: Email con detalles
- Frecuencia: Por email fallido
- Contenido: Headers completos
Análisis de Reportes
<?xml version="1.0" encoding="UTF-8"?>
<feedback>
<report_metadata>
<org_name>google.com</org_name>
<email>[email protected]</email>
<report_id>123456789</report_id>
</report_metadata>
<policy_published>
<domain>example.com</domain>
<adkim>r</adkim>
<aspf>r</aspf>
<p>quarantine</p>
</policy_published>
<record>
<row>
<source_ip>192.168.1.1</source_ip>
<count>100</count>
<policy_evaluated>
<disposition>quarantine</disposition>
<dkim>pass</dkim>
<spf>fail</spf>
</policy_evaluated>
</row>
</record>
</feedback>
Herramientas de Análisis
- DMARC Report Analyzer: Parser online
- dmarcian: Servicio comercial
- Scripts personalizados: Procesar XML con Python
import xml.etree.ElementTree as ET
import gzip
def parse_dmarc_report(filename):
with gzip.open(filename, 'rb') as f:
tree = ET.parse(f)
root = tree.getroot()
for record in root.findall('.//record'):
row = record.find('row')
source_ip = row.find('source_ip').text
count = int(row.find('count').text)
disposition = row.find('.//disposition').text
print(f"IP: {source_ip}, Count: {count}, Disposition: {disposition}")
# Uso
parse_dmarc_report('dmarc_report.xml.gz')
Mejores Prácticas
Configuración Inicial
- Empezar con p=none para monitorizar
- Configurar reportes para análisis
- Gradualmente aumentar la política
Mantenimiento
- Monitorear reportes regularmente
- Actualizar registros cuando cambian IPs
- Usar subdominios específicos para email
Consideraciones de Seguridad
- Rotar claves DKIM periódicamente
- Proteger claves privadas de accesos no autorizados
- Usar DNSSEC para proteger registros
Referencias
- RFC 7208: Sender Policy Framework (SPF)
- RFC 6376: DomainKeys Identified Mail (DKIM)
- RFC 7489: Domain-based Message Authentication, Reporting, and Conformance (DMARC)
- RFC 8461: SMTP MTA Strict Transport Security (MTA-STS)
