Configuración de RSPAMD

configurar rspamd para protección de correos electrónicos

En esta oportunidad te traigo una herramienta impresindible si te toca administrar servidores de correos electrónicos, ya que RSPAMD es un sistema rápido, gratuito y de código abierto para el filtrado de spam y procesamiento de correo electrónico que utiliza análisis de reglas, métodos estadísticos y listas negras para identificar y bloquear mensajes no deseados. Es una herramienta potente que puede manejar un alto volumen de correos electrónicos y es utilizada por plataformas de servidores de correo como NethServer, Mailcow y Mailu. Además de filtrar spam, Rspamd también puede gestionar antivirus y firmar correos electrónicos con DKIM para autenticar el remitente.

Funciones principales de Rspamd

Filtrado de Spam:
Identifica y bloquea correos electrónicos no deseados utilizando una combinación de análisis de texto, reglas personalizadas y listas de reputación.
Autoaprendizaje (Bayesiano):
Aprende de los correos electrónicos que se marcan como spam para mejorar sus tasas de detección con el tiempo.
Autenticación DKIM:
Permite verificar que un correo electrónico proviene de un dominio específico y fue autorizado por su propietario, lo que ayuda a prevenir la falsificación.
Gestión de Antivirus:
Integra herramientas antivirus para analizar los correos electrónicos en busca de malware.
Flexibilidad y Escalabilidad:
Puede procesar cientos de mensajes por segundo y ofrece una API para una configuración y personalización avanzadas.

Para su instalación vamos a usar docker con lo cual si no tenes instalado lo podes hacer siguiendo el siguiente tutorial:

Vamos a crear una carpeta por ejemplo rspamd y luego adentro creamos un archivo denominado docker-compose.yml con el siguiente contenido:

networks:
  mail-network:
    driver: bridge

services:
  rspamd:
    image: rspamd/rspamd:latest
    container_name: rspamd
    hostname: rspamd-central # Un nombre de host significativo
    ports:
      - "11334:11334"  # Web UI
      - "11332:11332"  # Control socket
      # ¡IMPORTANTE! Exponemos los puertos de filtrado en la IP del host (0.0.0.0)
      - "0.0.0.0:10025:10025"  # Escucha en todas las interfaces para recibir correo
      - "0.0.0.0:10026:10026"  # Escucha en todas las interfaces para devolver correo
    volumes:
      - ./data/conf:/etc/rspamd/local.d
      - ./data/logs:/var/log/rspamd
      - ./data/stats:/var/lib/rspamd
    environment:
      - TZ=America/Argentina/Buenos_Aires
    restart: unless-stopped
    networks:
      - mail-network
    depends_on:
      - redis

  redis:
    image: redis:7-alpine
    container_name: rspamd-redis
    volumes:
      - ./data/redis:/data
    restart: unless-stopped
    command: redis-server --appendonly yes
    networks:
      - mail-network

Una vez que lo tenemos armado vamos a ejecutar:

docker-compose up -d

Aca arrancarán los dos contenedores y en un navegador vamos a poner la ip del host:11334 y se nos abre la Web Ui de Rspamd solicitando una contraseña que NO TENEMOS!!! jajajajaja si asi de loco, y no lo tenemos porq ue hay que generarla.

En el servidor donde tenemos los contenedores funcionando corremos el comando:

docker exec -it rspamd rspamadm pw

Nos solicita un password y nos devuelve un SHA (la contraseña encriptada largaaaaa como experanza de pobre) que tenemos que copiarlo y tenerlo en algun lado ya que ahora lo vamos a utilizar

Ahora procederemos a bajar el contenedor:

docker-compose down

Vamos a crear el siguiente archivo (respetando siempre volumenes y/o carpetas que hayan creado):

sudo nano ./data/conf/worker-controller.inc

y dentro pondremos:

password = "elSHAquecreasteconloscorchetesestos";
enable_password = "elSHAquecreasteconloscorchetesestos";

ahora levantamos nuevamente:

docker-compose up -d

Y ya estamos una vez que nos pida contraseña vamos a poner la que utilizamos para generar el SHA mencionado anteriormente (si fuiste «descuidado» genera el sha de nuevo y siiiii anota el password y el sha baja todo y volve a empezar).

rspamd instalado sobre docker

Ahora nos queda hacer algunas configuraciones que la verdad me ubieran gustado ya vengan predeterminadas pero no es asi, igual es un fierrazo la herramienta…..

Si vamos a configuración vamos a ver algunos archivos asi:

archivos de configuracion de rspamd

Algunos dicen no listed o cached… por ahora no le vamos a dar de mas importancia pero vamos a ir creando nuestras configuraciones.

Dentro de /data/conf (volumen de docker) vamos a crear una serie de archivos:

worker-proxy.conf

bind_socket = "*:11332";
milter = yes;
timeout = 120s;
upstream "local" {
  default = yes;
  self_scan = yes;
}

milter_headers.conf:

use = ["x-spamd-bar", "x-spam-level", "x-rspamd-server", "x-spam-status"];
extended_spam_headers = true;
skip_local = false;

multimap.conf

WHITELIST_SENDER_DOMAIN {
  type = "from";
  map = "/etc/rspamd/local.d/whitelist_domains.map";
  score = -100.0;
  description = "Dominios en whitelist - siempre pasan";
  action = "accept";
}

WHITELIST_SENDER_EMAIL {
  type = "from";
  map = "/etc/rspamd/local.d/whitelist_emails.map";
  score = -100.0;
  description = "Emails en whitelist - siempre pasan";
  action = "accept";
}


BLACKLIST_SENDER_DOMAIN {
  type = "from";
  map = "/etc/rspamd/local.d/blacklist_domains.map";
  score = 100.0;
  description = "Dominios en blacklist - siempre bloquear";
  action = "reject";
}

BLACKLIST_SENDER_EMAIL {
  type = "from";
  map = "/etc/rspamd/local.d/blacklist_emails.map";
  score = 100.0;
  description = "Emails en blacklist - siempre bloquear";
  action = "reject";
}

BLACKLIST_IP {
  type = "ip";
  map = "/etc/rspamd/local.d/blacklist_ips.map";
  score = 100.0;
  description = "IPs en blacklist - siempre bloquear";
  action = "reject";
}

BLACKLIST_NETWORKS {
  type = "ip";
  map = "/etc/rspamd/local.d/blacklist_networks.map";
  score = 100.0;
  description = "Redes en blacklist - siempre bloquear";
  action = "reject";
}

Fijense que los archivos apuntan a la carpeta /etc/rspamd/local.d/ que si miramos el docker-compose.yml tiene un volumen para su protección pero recuerden que los archivos se crean FUERA DEL CONTENDOR (EN VOLUMENES) O DENTRO DEL CONTENEDOR RESPETANDO LAS DIRECCIONES EXACTAS. CUALQUIER DUDA AVISA!!!

El multimap es por demas importante por que como ven tiene archivitos que necesitamos crear para luego poner las config que queramos.

Ahora creamos los archivos que se nombran:

sudo touch whitelist_domains.map whitelist_emails.map blacklist_domains.map blacklist_emails.map blacklist_ips.map blacklist_networks.map

Ahora hay tendras que ver si llegaste hasta aca que tipo de configuracion y por que estas poniendo un rspamd y donde lo estas poniendo, en mi caso la idea es ponerlo antes del relay de correos, entonces voy a hacer algunas acciones para lo cual tengo que crear el archivo actions.conf y detallar lo siguiente:

reject = null;        # No rechazar, dejar que ASSP decida
add_header = 6;       # Agregar headers a partir de score 6
greylist = 4;         # Greylist con score 4

Vamos a pasar con la explicación:

Tenemos: RSPAMD—->RELAY——–>Assp Anti spam—>Outbonding y te puede parecer redundante perooo es una excelente configuración por que:

Rspamd recomienda específicamente «disable the reject action to prevent generating backscatter» cuando el setup es como el que te muestro, donde rspamd no es el MX final.

rspamd: Analiza y agrega headers (X-Spam-Score, X-Spam-Status, etc.)

relay: Solo reenvía con los headers intactos

assp: Lee los headers de rspamd y toma la decisión final

Outbonding: Firma los correos (spf dmarc dkim)

Ventajas de este setup

No backscatter: rspamd no rechaza, solo informa
Doble filtrado: rspamd + assp = más precisión (de todas maneras podemos ir cambiando para hacer mas fuerte rspamd e ir quitando assp)
Headers informativos: assp puede usar la información de rspamd
Flexibilidad: assp puede sobrescribir decisiones de rspamd si es necesario

Por otro lado si es una puesta en marcha de cero y queres una lista de ips maliciosas te paso la que tengo creada que te va a servir un monton.

wget https://raw.githubusercontent.com/LuisAZambrana/proxy/main/lista.txt >> /etc/rspamd/local.d/blacklist_ips.map

Podes generarte un script que esta tarea la haga cada dos dias ya que el proyecto se actualiza a las 00hs diariamente. Si queres descagar el proyecto:

git clone https://github.com/LuisAZambrana/proxy.git

lista.txt: Este archivo se actualiza automaticamente una vez por día obteniendo el listado oficial de spamhause combinado con emergingthreats, abuse.ch y cinsscore.com/

radiosysitios.txt: No es automatico! Es una seleccion de Radios y Sitios (como diarios etc) que alguna vez piden que se bloquen en proxys y bueno… no es de milico sino un pedido de cliente por exceso de joda tal vez?

Solo para el de radios, si necesitas el listado sin los simbolos usa el comando sed 's/^||//; s/\^$//' radiosysitios.txt > limpio.txt.

Ahora configurado te toca reiniciar el contenedor y empezar a jugar.

Te dejo algunos comandos que te van a ayudar:

Estado del Servicio Rspamd

# Estado general
sudo systemctl status rspamd

# Ver si está escuchando en los puertos correctos
sudo netstat -tlnp | grep rspamd
# Deberías ver:
# :11332 (milter/proxy)
# :11334 (web interface)

# Procesos rspamd activos
ps aux | grep rspamd

Logs en Tiempo Real

# Log principal (más importante)
sudo tail -f /var/log/rspamd/rspamd.log

# Solo errores
sudo tail -f /var/log/rspamd/rspamd.log | grep -i error

# Solo procesamiento de correos
sudo tail -f /var/log/rspamd/rspamd.log | grep "scan_file\|symbols"

# Log completo con timestamps
sudo journalctl -u rspamd -f

Verificar Conexion con Relay:

# Ver conexiones salientes de rspamd
sudo netstat -an | grep :11332

# Ver si rspamd puede conectar al relay
telnet localhost 25
# o el puerto de tu relay
telnet tu-relay-ip 25

# Logs de conexiones al relay
sudo tail -f /var/log/rspamd/rspamd.log | grep -i "connect\|relay\|milter"

Estadisticas:

# Estadísticas generales
sudo rspamdadm stat

# Estadísticas detalladas
sudo rspamdadm stat --extended

# Ver configuración cargada
sudo rspamdadm configdump

# Solo mapas cargados
sudo rspamdadm configdump | grep -A10 -B5 "map\|whitelist\|blacklist"

Probar procesamiento de Correos

# Prueba manual con un correo
echo -e "From: [email protected]\nTo: [email protected]\nSubject: Test\n\nEste es un correo de prueba" | sudo rspamdadm fuzzy_test

# Análisis de un archivo de correo
sudo rspamdadm symbols /path/to/email.txt

# Probar contra spamassassin (si tienes archivos de ejemplo)
sudo rspamdadm test /path/to/spam/folder/

Verificar los mapas configurados:

# Ver estado de todos los mapas
curl -s http://localhost:11334/maps | jq '.'
# o sin jq:
curl -s http://localhost:11334/maps

# Recargar configuración
sudo rspamdadm reload

# Verificar sintaxis de configuración
sudo rspamdadm configtest

# Ver qué archivos de configuración está usando
sudo rspamdadm configdump | grep -i "file\|path" | head -20

Verificar los headers que pasan al relay:

# Ver headers agregados por rspamd
sudo tail -f /var/log/rspamd/rspamd.log | grep -i "add.*header"

# Si tu relay es Postfix, ver sus logs también
sudo tail -f /var/log/mail.log | grep "rspamd"

Debug más avanzado:

# Modo verbose (cuidado, genera muchos logs)
sudo rspamdadm configdump | grep -i log_level

# Para cambiar nivel de debug temporalmente
sudo rspamdctl setloglevel debug

# Volver a normal
sudo rspamdctl setloglevel notice

# Ver qué símbolos se activaron en el último correo
sudo tail -1 /var/log/rspamd/rspamd.log | grep -o 'symbols:.*'

IMPORTANTE:

Si tu relay esta en otro servidor tenes que configurar el postfix editando: /etc/postfix/main.cf:

# IP del relay remoto
relayhost = [IP_DEL_RELAY:25]
# Ejemplo:
relayhost = [192.168.1.100:25]
# o si usa otro puerto:
relayhost = [192.168.1.100:587]

# Configuración del milter de rspamd (ya la tienes)
smtpd_milters = inet:localhost:11332
non_smtpd_milters = inet:localhost:11332

Si estas usando rspamd como proxy independiente tenes que editar: worker-proxy.conf

# Puerto donde escucha rspamd
bind_socket = "*:11332";
milter = yes;
timeout = 120s;

# Configuración del upstream (tu relay)
upstream "relay_server" {
  default = yes;
  # IP y puerto del relay
  server = "IP_DEL_RELAY:25";
  # Ejemplo:
  server = "192.168.1.100:25";
}

Todo el mundo de correos electrónicos es un baile importante por lo que hay que tomarse en serio el aprendizaje de muchas cosas como redes, funcion que cumple cada parte de la infraestructura, entre otros, asi que si llegaste aca es porque verdaderamente te toco o te gusto bailar, asi que Bienvenido!!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *