Filtrado Avanzado de Spam con Rspamd

Rspamd es un sistema de filtrado de spam de alto rendimiento que combina análisis bayesiano, redes neuronales, verificación DKIM/DMARC, greylisting y reglas personalizadas en un único demonio eficiente. Su arquitectura asíncrona y su integración nativa con Redis lo convierten en la elección preferida para servidores de correo que necesitan precisión en la detección de spam sin impacto en el rendimiento.

Requisitos Previos

  • Servidor Linux con Postfix o Exim como MTA
  • Ubuntu 20.04+, Debian 11+ o CentOS 8+
  • Redis 6+ para almacenamiento de estadísticas
  • Al menos 512 MB de RAM adicionales para Rspamd
  • Acceso root o sudo

Instalación de Rspamd y Redis

# Ubuntu/Debian - Añadir el repositorio oficial de Rspamd
curl https://rspamd.com/apt-stable/gpg.key \
  | sudo gpg --dearmor -o /usr/share/keyrings/rspamd-archive-keyring.gpg

echo "deb [signed-by=/usr/share/keyrings/rspamd-archive-keyring.gpg] \
  http://rspamd.com/apt-stable/ $(lsb_release -cs) main" \
  | sudo tee /etc/apt/sources.list.d/rspamd.list

sudo apt update
sudo apt install -y rspamd redis-server

# CentOS/Rocky Linux
sudo dnf install -y epel-release
sudo dnf install -y rspamd redis

# Habilitar y arrancar servicios
sudo systemctl enable --now redis
sudo systemctl enable --now rspamd

# Verificar que está funcionando
sudo systemctl status rspamd
rspamd --version

Configuración básica de Redis para Rspamd:

# Editar configuración de Redis
sudo tee /etc/redis/redis.conf.d/rspamd.conf << 'EOF'
# Vincular Redis solo a localhost (Rspamd está en el mismo servidor)
bind 127.0.0.1
port 6379

# Habilitar persistencia para no perder estadísticas Bayesianas
save 900 1
save 300 10
save 60 10000

# Limitar memoria usada por Redis (ajusta según tu servidor)
maxmemory 512mb
maxmemory-policy allkeys-lru
EOF

sudo systemctl restart redis

Integración con Postfix

# Configurar Postfix para usar Rspamd via milter
sudo tee -a /etc/postfix/main.cf << 'EOF'

# Integración con Rspamd via milter
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:127.0.0.1:11332
non_smtpd_milters = inet:127.0.0.1:11332
EOF

# Verificar la sintaxis de Postfix
sudo postfix check

# Reiniciar Postfix para aplicar cambios
sudo systemctl restart postfix

# Configurar el worker milter de Rspamd
sudo tee /etc/rspamd/local.d/worker-proxy.inc << 'EOF'
bind_socket = "127.0.0.1:11332";
milter = yes;
timeout = 120s;

# Upstream al worker normal de Rspamd
upstream "local" {
    default = yes;
    self_scan = yes;
}
EOF

sudo systemctl restart rspamd

Filtro Bayesiano y Aprendizaje Automático

# Configurar el clasificador Bayesiano con Redis
sudo tee /etc/rspamd/local.d/classifier-bayes.conf << 'EOF'
# Usar Redis como backend del clasificador Bayesiano
backend = "redis";

# Configuración del servidor Redis
servers = "127.0.0.1";

# Prefijo para las claves en Redis
new_schema = true;

# Aprendizaje automático: si el clasificador está seguro al 95%
autolearn = true;
autolearn_spam_threshold = 12.0;
autolearn_ham_threshold = -0.5;

# Número mínimo de mensajes necesarios antes de activar el filtro
min_learns = 200;
EOF

sudo systemctl restart rspamd

Entrenar el clasificador manualmente:

# Entrenar con mensajes de spam (desde fichero .eml o maildir)
rspamc learn_spam /ruta/al/spam.eml

# Entrenar con mensajes legítimos (ham)
rspamc learn_ham /ruta/al/correo-legitimo.eml

# Entrenar desde un directorio maildir completo
find /var/mail/spam/ -name "*.eml" -exec rspamc learn_spam {} \;
find /var/mail/ham/ -name "*.eml" -exec rspamc learn_ham {} \;

# Ver estadísticas del clasificador Bayesiano
rspamc stat | grep -A5 "Bayes"

# Ver estadísticas detalladas en Redis
redis-cli hgetall "RSPAMD_BAYES:SPAM"
redis-cli hgetall "RSPAMD_BAYES:HAM"

Clasificación con Redes Neuronales

El módulo Neural de Rspamd aprende de los resultados combinados de todos los filtros:

sudo tee /etc/rspamd/local.d/neural.conf << 'EOF'
# Activar el módulo neural
enabled = true;

# Configuración del servidor Redis para almacenar el modelo
servers = "127.0.0.1";

# Cuántos mensajes se necesitan para entrenar
train {
  max_trains = 1000;
  max_usages = 20;
  learning_rate = 0.01;
  max_iterations = 25;
}

# Regla para mensajes de spam (puntuación > 14 = spam claro)
rules {
  "SPAM" {
    train {
      spam_score = 14.0;
      ham_score = -1.0;
    }
    symbol = "NEURAL_SPAM";
    score = 3.0;
  }
}
EOF

sudo systemctl restart rspamd

# El modelo se entrena automáticamente en segundo plano
# Ver el estado del módulo neural
rspamc stat | grep -i neural

Verificación DKIM y DMARC

# Configurar verificación DKIM
sudo tee /etc/rspamd/local.d/dkim.conf << 'EOF'
# Verificar firmas DKIM en mensajes entrantes
check = true;
EOF

# Configurar verificación DMARC
sudo tee /etc/rspamd/local.d/dmarc.conf << 'EOF'
# Activar verificación DMARC
actions {
    quarantine = "add_header";
    reject = "reject";
}

# Enviar reportes DMARC (opcional)
reporting {
    enable = true;
    email = "[email protected]";
    domain = "tudominio.com";
    org_name = "Mi Empresa";
    from_email = "[email protected]";
}
EOF

# Configurar firma DKIM para correos salientes
# Primero, generar el par de claves
mkdir -p /etc/rspamd/dkim
rspamadm dkim_keygen \
  -s mail \
  -d tudominio.com \
  -b 2048 \
  -k /etc/rspamd/dkim/tudominio.private \
  > /etc/rspamd/dkim/tudominio.public

# Ver el registro DNS DKIM a configurar
cat /etc/rspamd/dkim/tudominio.public

# Configurar la firma DKIM en Rspamd
sudo tee /etc/rspamd/local.d/dkim_signing.conf << 'EOF'
path = "/etc/rspamd/dkim/$domain.$selector.key";
selector = "mail";
use_domain = "header";
allow_username_mismatch = true;
EOF

sudo chown -R _rspamd:_rspamd /etc/rspamd/dkim/
sudo systemctl restart rspamd

Greylisting

El greylisting rechaza temporalmente correos de remitentes desconocidos, reduciendo spam de botnets:

sudo tee /etc/rspamd/local.d/greylisting.conf << 'EOF'
# Habilitar greylisting
enabled = true;

# Tiempo de espera inicial antes de aceptar el correo
expire = 1d;     # Expirar registros antiguos
timeout = 5m;    # Esperar 5 minutos antes de aceptar

# Lista blanca de servidores conocidos (no aplicar greylisting)
whitelist_domains_url = "https://rspamd.com/freemail/list.json";

# Eximir a IPs con buena reputación
whitelisted_ip {
    "10.0.0.0/8" = true;
    "172.16.0.0/12" = true;
    "192.168.0.0/16" = true;
}
EOF

sudo systemctl restart rspamd

Reglas Personalizadas

Crea reglas Lua personalizadas para necesidades específicas:

# Crear fichero de reglas locales
sudo tee /etc/rspamd/local.d/local_rules.lua << 'EOF'
-- Regla: Bloquear correos con asuntos en mayúsculas (patrón de spam)
rspamd_config:register_symbol({
  name = 'SUBJECT_ALL_CAPS',
  score = 2.5,
  callback = function(task)
    local subject = task:get_header('Subject')
    if subject and subject == subject:upper() and #subject > 5 then
      return true, 'El asunto está completamente en mayúsculas'
    end
    return false
  end,
  description = 'Asunto en mayúsculas - patrón de spam',
  group = 'custom'
})

-- Regla: Puntuar correos que contienen ciertos dominios sospechosos
rspamd_config:register_symbol({
  name = 'SUSPICIOUS_DOMAIN',
  score = 4.0,
  callback = function(task)
    local from = task:get_from('smtp')
    if from and from[1] then
      local domain = from[1]['domain']
      local bad_domains = {'spammer.com', 'phishing.net'}
      for _, d in ipairs(bad_domains) do
        if domain == d then
          return true, string.format('Dominio sospechoso: %s', domain)
        end
      end
    end
    return false
  end,
  description = 'Remitente de dominio sospechoso',
  group = 'custom'
})
EOF

sudo systemctl restart rspamd

# Verificar que las reglas se cargan correctamente
rspamc stat | grep -i custom

Configurar umbrales de acción:

sudo tee /etc/rspamd/local.d/actions.conf << 'EOF'
# Acciones según la puntuación de spam
reject = 20;         # Rechazar correos con puntuación > 20
add_header = 7;      # Añadir cabecera de spam a partir de 7
greylist = 5;        # Greylist para puntuaciones de 5-7
no_action = -1;      # No hacer nada por debajo de -1 (muy probable que sea ham)
EOF

sudo systemctl restart rspamd

Solución de Problemas

Rspamd no procesa mensajes:

# Verificar que el milter está escuchando
sudo ss -tlnp | grep 11332

# Probar el análisis de un mensaje manualmente
rspamc check < /ruta/al/mensaje.eml

# Ver los logs de Rspamd en tiempo real
sudo journalctl -u rspamd -f

El clasificador Bayesiano no funciona:

# Verificar la conexión a Redis
redis-cli ping

# Comprobar que Rspamd puede leer/escribir en Redis
redis-cli keys "RSPAMD*"

# Ver las estadísticas de aprendizaje
rspamc stat | grep -E "(learned|spam|ham)"

Demasiados falsos positivos:

# Añadir a la lista blanca un dominio o IP
sudo tee -a /etc/rspamd/local.d/whitelist.conf << 'EOF'
whitelisted_domains {
    "dominio-confiable.com" = true;
}
EOF

# O añadir una IP concreta a la lista blanca
sudo tee -a /etc/rspamd/local.d/ip_whitelist.map << 'EOF'
203.0.113.50   # Servidor de un socio de confianza
EOF

sudo systemctl reload rspamd

Conclusión

Rspamd ofrece una solución de filtrado de spam de nivel empresarial que combina múltiples técnicas de detección en un sistema cohesionado y eficiente. La combinación del filtro Bayesiano entrenado con datos reales, las redes neuronales adaptativas y la verificación de autenticación de correo proporciona tasas de detección superiores al 99% en entornos bien configurados. La inversión inicial en el entrenamiento del sistema se recupera rápidamente con una drástica reducción del spam que llega a los buzones.