Skip to main content

Whitelist dinámica de rspamd via email en Directadmin

Qué hace

Permite a cualquier usuario autenticado del servidor añadir o eliminar dominios de la whitelist de rspamd enviando un email. No requiere acceso al panel ni SSH.

Enviar un email a whitelist@<cualquier-dominio-del-servidor> con el dominio a whitelistear en el asunto:

Asunto del email Acción
add ejemplo.com Añade ejemplo.com a la whitelist
ejemplo.com Añade ejemplo.com (add implícito)
newsletter@ejemplo.com Extrae y añade ejemplo.com
del ejemplo.com Elimina ejemplo.com de la whitelist
remove ejemplo.com Elimina ejemplo.com de la whitelist

El email debe enviarse desde un cliente de correo autenticado (Thunderbird, Outlook, webmail). Correos no autenticados son ignorados silenciosamente.

Restricciones de seguridad

  • Solo SMTP AUTH: si el email no viene de un usuario autenticado del servidor, se descarta
  • Mass providers bloqueados: no se puede whitelistear gmail.com, outlook.com, yahoo.com, hotmail.com, etc.
  • Límite: máximo 500 dominios por servidor
  • Solo dominios: no soporta whitelistear una dirección concreta (user@domain), solo el dominio completo
  • Validación estricta: el dominio debe tener formato válido (letras, números, puntos, guiones)

Cómo funciona internamente

Email autenticado → whitelist@dominio.com
        ↓
Exim router (whitelist_pipe_router)
  · condición: $authenticated_id no vacío
  · domains = +local_domains (solo dominios hospedados)
        ↓
Exim transport → pipe a /usr/local/bin/rspamd_whitelist.sh
  · pasa AUTH_USER via variable de entorno
        ↓
Script: parsea Subject, valida, escribe en map file
        ↓
/etc/rspamd/local.d/maps/whitelist_dynamic.map
  · rspamd recarga automáticamente (~10 segundos)
        ↓
Multimap WHITELIST_FROM_DYNAMIC (score -100.0)
  · correos del dominio whitelisteado pasan sin penalización

Ficheros involucrados

Fichero Propósito Persistencia
/usr/local/bin/rspamd_whitelist.sh Script principal Manual (no gestionado por DA)
/etc/exim.routers.pre.conf Router Exim custom Sobrevive rewrite_confs (include en template DA)
/etc/exim.transports.pre.conf Transport Exim custom Sobrevive rewrite_confs (include en template DA)
/etc/rspamd/local.d/multimap.conf Definición del símbolo WHITELIST_FROM_DYNAMIC local.d/ = override oficial de rspamd
/etc/rspamd/local.d/maps/whitelist_dynamic.map Lista de dominios (uno por línea) Fichero de datos, no config
/var/log/rspamd_whitelist.log Log de operaciones Fichero de log

Persistencia ante rebuilds de DA

Los ficheros .pre.conf son puntos de extensión del template de Exim en DirectAdmin. El template fuente (custombuild/configure/exim/exim.conf) contiene:

.include_if_exists /etc/exim.routers.pre.conf     # línea 519
.include_if_exists /etc/exim.transports.pre.conf   # línea 773

Estas directivas .include_if_exists están en el template, no solo en el fichero generado. Esto significa que:

  • build rewrite_confs regenera /etc/exim.conf pero no toca los .pre.conf
  • build exim_conf idem
  • build exim (rebuild completo del binario) idem

Los ficheros .pre.conf son del usuario, no de DA. Son el único mecanismo ligero para añadir routers y transports custom sin mantener una copia completa de exim.conf.

Para rspamd, local.d/ es el mecanismo oficial de override. DA no gestiona estos ficheros.

Instalación en un servidor nuevo

Prerequisitos

  • DirectAdmin con Exim y rspamd
  • rspamd con multimap configurado (al menos local.d/multimap.conf existente)

Pasos

1. Script:

# Subir rspamd_whitelist.sh al servidor
scp rspamd_whitelist.sh root@servidor:/usr/local/bin/
chmod +x /usr/local/bin/rspamd_whitelist.sh

2. Map file y log:

touch /etc/rspamd/local.d/maps/whitelist_dynamic.map
chown root:mail /etc/rspamd/local.d/maps/whitelist_dynamic.map
chmod 664 /etc/rspamd/local.d/maps/whitelist_dynamic.map

touch /var/log/rspamd_whitelist.log
chown mail:mail /var/log/rspamd_whitelist.log
chmod 644 /var/log/rspamd_whitelist.log

3. Exim router (prepend a /etc/exim.routers.pre.conf — ANTES de cualquier otro router):

# Dynamic whitelist via email
whitelist_pipe_router:
  driver = accept
  local_parts = whitelist
  domains = +local_domains
  condition = ${if !eq{$authenticated_id}{}}
  transport = whitelist_pipe_transport

4. Exim transport (crear o añadir a /etc/exim.transports.pre.conf):

# Dynamic whitelist pipe transport
whitelist_pipe_transport:
  driver = pipe
  command = /usr/local/bin/rspamd_whitelist.sh
  user = mail
  environment = AUTH_USER=$authenticated_id

5. rspamd multimap (añadir a /etc/rspamd/local.d/multimap.conf):

WHITELIST_FROM_DYNAMIC {
    type = "from";
    filter = "email:domain";
    map = "/etc/rspamd/local.d/maps/whitelist_dynamic.map";
    symbol = "WHITELIST_FROM_DYNAMIC";
    score = -100.0;
    description = "Dynamic whitelist — added via email by authenticated users";
}

6. Verificar y reiniciar:

exim -bV                    # Syntax check Exim
rspamadm configtest         # Syntax check rspamd
systemctl restart exim
systemctl restart rspamd
systemctl is-active exim rspamd

Verificación

# Comprobar que el router es el primero
exim -bP router_list | head -5

# Comprobar que rspamd carga el símbolo
rspamadm configdump multimap | grep -A3 WHITELIST_FROM_DYNAMIC

# Test de routing (debe resolver al pipe transport)
exim -bt whitelist@undominiodel.servidor

Operaciones de mantenimiento

Ver whitelist actual:

cat /etc/rspamd/local.d/maps/whitelist_dynamic.map

Ver log de operaciones:

cat /var/log/rspamd_whitelist.log

Añadir/eliminar manualmente:

# Añadir
echo "dominio.com" >> /etc/rspamd/local.d/maps/whitelist_dynamic.map

# Eliminar
sed -i '/^dominio\.com$/d' /etc/rspamd/local.d/maps/whitelist_dynamic.map

rspamd recarga el map file automáticamente en ~10 segundos.

Vaciar whitelist:

> /etc/rspamd/local.d/maps/whitelist_dynamic.map

Mejoras futuras (v2)

  • Per-address whitelist: soportar user@example.com como target exacto (segundo multimap sin filter = "email:domain")
  • Comando list: responder al remitente con la whitelist actual
  • TTL/expiración: auto-eliminar entradas tras N días
  • Logrotate: crear regla para /var/log/rspamd_whitelist.log
  • Notificación: confirmar al usuario que el dominio fue añadido/eliminado
Aviso

Esta documentación y su contenido, no implica que funcione en tu caso o determinados casos. También implica que tienes conocimientos sobre lo que trata, y que en cualquier caso tienes copias de seguridad. El contenido el contenido se entrega, tal y como está, sin que ello implique ningún obligación ni responsabilidad por parte de Castris

Si necesitas soporte profesional puedes contratar con Castris soporte profesional.