6. Spamassassin sin usar sa-exim
En esta parte se añadirá el control de SPAM y antivirus a la configuración de correo. La configuración propuesta utiliza la integración predeterminada de Exim4 estos programas.
Nota
Existe un método alternativo usando el paquete sa-exim, pero este software está abandonado y no tiene mantenimiento desde 2006
Se realizará lo siguiente:
Integrar SpamAssassin en la configuración propuesta con usuario virtual
Evitar escanear correos salientes autenticados
Integrar el antivirus ClamAV
6.1. SpamAssassin y Exim4
Al menos existen cuatro formas de integrar SpamAssassin en el sistema de correo que he probado en diferentes servidores.
Usar Amavis, no me gusta, es un servicio más ejecutándose, a más servicios en la cadena de correo mayor es la probabilidad de fallos, además es un sistema antiguo.
Usar el paquete sa-exim. En otros modos de configuración simplificado propongo su uso, aunque está también obsoleto.
Usar SpamPD, que es un proxy de SpamAssassin. Se supone que consume menos recursos que el propio demonio de SpamAssassin, pero no me ha terminado de funcionar bien con la configuración de usuarios virtuales propuesta.
Finalmente, usaré el propio servicio/demonio de SpamAssassin,
Para la configuración propuesta solo hay que instalar el paquete spamassassin no hace falta nada más:
apt install spamassassin
Tras la instalación el servicio no inicia, está desactivado hasta que se
configure. El primer paso es hacer que trabaje con el usuario virtual vmail
estableciendo las opciones de inicio del demonio en
/etc/default/spamd
.
Hay que cambiar la línea indicada de la siguiente forma:
OPTIONS="--max-children 3 --nouser-config --virtual-config-dir=/home/vmail/.spamassassin -u vmail"
Tras este cambio se puede iniciar y activar el servicio para ver que está escuchando en 127.0.0.1:783
systemctl enable spamd
systemctl start spamd
ss -ltnp
LISTEN 0 4096 127.0.0.1:783 0.0.0.0:* users:(("spamd child",pid=706,fd=5),("spamd child",pid=705,fd=5),("spamd",pid=704,fd=5))
Nota
Con Debian 12 se ha renombrado el fichero de /etc/default/spamassassin a /etc/default/spamd. Además, el servicio también ha sido renombrado a spamd.
Con la configuración propuesta ningún usuario tendrá configuración personalizada, así consigo configurar globalmente las opciones de SpamAssassin. Otro detalle es que ubico los ficheros de datos para los filtros bayesianos estarán en /home/vmail/.spamassassin, posteriormente trato este tema.
El siguiente paso es configurar Exim4 estableciendo una variable la variable
spamd_address
hacia la dirección IP/Puerto donde se ejecuta SpamAssassin.
En mi configuración sigo usando el fichero mismo fichero añadiendo
lo indicado a continuación:
spamd_address = 127.0.0.1 783
El control de spam y de virus se realizan en el ACL encargado de
comprobar el contenido de mensajes. Está en el fichero
/etc/exim4/acl/40_exim4-config_check_data
.
Vienen dos reglas como ejemplos, pero las que uso tienen son diferentes
ya que, no quiero denegar mensajes, aunque estén marcados como SPAM los
dejo entrar para colocarlos en SPAM.
# Remove internal headers
warn
remove_header = X-Spam_score: X-Spam_score_int : X-Spam_bar : \
X-Spam_report
warn
spam = Debian-exim:true
add_header = X-Spam_score: $spam_score\n\
X-Spam_score_int: $spam_score_int\n\
X-Spam_bar: $spam_bar\n\
X-Spam_report: $spam_report\n
warn
spam = spam/defer_ok
logwrite = :main: SPAM detected (score $spam_score)
add_header = X-Spam-Flag: YES
Con esta configuración los correos se mandan a SpamAssassin y cuando son analizados se marcan en caso de ser SPAM.
Atención
La configuración del fichero anterior no se puede añadir al final del fichero.
Las reglas ACL se ejecutan por orden y la parte indicada debe estar antes de
la directiva accept
final.
Dejo una copia completa de mi fichero:
40_exim4-config_check_data
6.2. Evitar escanear correos autenticados
Con la configuración anterior todos los correos son escaneados, incluso los salientes de usuarios autenticados y esto retrasa la salida de los mismos. De hecho es un poco molesto esperar a que se analice el correo saliente y se puede desactivar estableciendo una condición AC anterior a las mostradas anteriormente.
De nuevo en el fichero indicado hay que añadir las 3 líneas mostradas antes de las reglas que analizan el Spam:
# No escanear los autenticados
accept
authenticated = *
endpass
# Remove internal headers
warn
remove_header = X-Spam_score: X-Spam_score_int : X-Spam_bar : \
X-Spam_report
warn
spam = Debian-exim:true
add_header = X-Spam_score: $spam_score\n\
X-Spam_score_int: $spam_score_int\n\
X-Spam_bar: $spam_bar\n\
X-Spam_report: $spam_report\n
warn
spam = spam/defer_ok
logwrite = :main: SPAM detected (score $spam_score)
add_header = X-Spam-Flag: YES
6.3. Hash-Sharing: Pyzor y Razor
Estos 2 sistemas los suelo activar habitualmente ya que funcionan rápido al ser bases de datos en línea para consultar si el HASH del correo entrante ha sido reportado con anterioridad como SPAM. Estos sistemas están integrados en SpamAssassin y sólo hay que activarla mediante la configuración mostrada:
# Enable or disable network checks
use_razor2 1
use_pyzor 1
pyzor_options --homedir /home/vmail/.spamassassin
razor_config /home/vmail/.razor/razor-agent.conf
A continuación detallo por separado la configuración de cada uno, ya que hay mucha documentación obsoleta por la red.
6.3.1. Pyzor
Aunque está integrado en SpamAssassin, no se instala por defecto, así que hay que instalarlo con APT:
apt install pyzor
Tras la instalación, funciona automáticamente no es necesario usar el comando
pyzor discover
como pone por la red. Directamente se puede hacer el test
mediante el comando y revisar la salida en la línea resaltada:
echo "test" | spamassassin -D pyzor
Mar 8 19:46:47.042 [1974283] dbg: pyzor: network tests on, attempting Pyzor
Mar 8 19:46:47.582 [1974283] warn: Reference found where even-sized list expected at /usr/share/perl5/Mail/SpamAssassin/Logger/Syslog.pm line 71.
Mar 8 19:46:49.354 [1974283] dbg: pyzor: pyzor is available: /usr/bin/pyzor
Mar 8 19:46:49.354 [1974283] dbg: pyzor: opening pipe: /usr/bin/pyzor check < /tmp/.spamassassin19742832XPbdDtmp
Mar 8 19:46:49.356 [1974307] info: util: setuid: ruid=0 euid=0 rgid=0 0 egid=0 0
Mar 8 19:46:49.437 [1974283] dbg: pyzor: [1974307] finished: exit 1
Mar 8 19:46:49.437 [1974283] dbg: pyzor: got response: public.pyzor.org:24441 (200, 'OK') 26408759 258032
Mar 8 19:46:49.437 [1974283] dbg: pyzor: listed: COUNT=26408759/5 WHITELIST=258032
6.3.2. Razor
En el caso de Razor es un poco diferente, si hay que realizar una configuración adicional y una inicialización. En la configuración de SpamAssassin se estableció el directorio de configuración el resaltado a continuación
# Enable or disable network checks
use_razor2 1
use_pyzor 1
pyzor_options --homedir /home/vmail
razor_config /home/vmail/.razor/razor-agent.conf
Es necesario crear ese directorio y establecer correctamente el propietario a vmail. Después usando el usuario vmail hay que incializar Razor, en la siguiente secuencia de comandos se muestra como se realiza:
sudo -u vmail mkdir /home/vmail/.razor
sudo -u vmail razor-admin -home=/home/vmail/.razor -register
sudo -u vmail razor-admin -home=/home/vmail/.razor -create
sudo -u vmail razor-admin -home=/home/vmail/.razor -discover
Para revisar si funciona correcta se puede usar el siguiente comando, pero la salida es un poco extensa, incluyo parte de ella para poder compararla en caso de error:
echo "test" | spamassassin -D razor2 2>&1 | less
Mar 13 19:21:01.838 [3382299] dbg: razor2: razor2 is available, version 2.84
Mar 13 19:21:02.235 [3382299] warn: Reference found where even-sized list expected at /usr/share/perl5/Mail/SpamAssassin/Logger/Syslog.pm line 71.
Razor-Log: read_file: 15 items read from /home/vmail/.razor/razor-agent.conf
Razor-Log: Computed razorhome from env: /root/.razor
Mar 13 19:21:02.736453 check[3382299]: [ 2] [bootup] Logging initiated LogDebugLevel=9 to stdout
Mar 13 19:21:02.736528 check[3382299]: [ 5] computed razorhome=/home/vmail/.razor, conf=/home/vmail/.razor/razor-agent.conf, ident=/home/vmail/.razor/identity-ruLEcwS795
Mar 13 19:21:02.736561 check[3382299]: [ 8] Client supported_engines: 4 8
Mar 13 19:21:02.736636 check[3382299]: [ 8] prep_mail done: mail 1 headers=6, mime0=41
Mar 13 19:21:02.736696 check[3382299]: [ 5] read_file: 1 items read from /home/vmail/.razor/servers.discovery.lst
Mar 13 19:21:02.736735 check[3382299]: [ 5] read_file: 0 items read from /home/vmail/.razor/servers.nomination.lst
Mar 13 19:21:02.736771 check[3382299]: [ 5] read_file: 3 items read from /home/vmail/.razor/servers.catalogue.lst
Mar 13 19:21:02.736829 check[3382299]: [ 9] Assigning defaults to c301.cloudmark.com
Mar 13 19:21:02.736850 check[3382299]: [ 9] Assigning defaults to c302.cloudmark.com
Mar 13 19:21:02.736868 check[3382299]: [ 9] Assigning defaults to c303.cloudmark.com
Mar 13 19:21:02.737050 check[3382299]: [ 5] read_file: 32 items read from /home/vmail/.razor/server.c301.cloudmark.com.conf
Mar 13 19:21:02.737151 check[3382299]: [ 5] read_file: 32 items read from /home/vmail/.razor/server.c301.cloudmark.com.conf
Mar 13 19:21:02.737242 check[3382299]: [ 5] read_file: 27 items read from /home/vmail/.razor/server.n004.cloudmark.com.conf
Mar 13 19:21:02.737325 check[3382299]: [ 5] read_file: 27 items read from /home/vmail/.razor/server.n004.cloudmark.com.conf
Mar 13 19:21:02.737424 check[3382299]: [ 5] read_file: 32 items read from /home/vmail/.razor/server.c302.cloudmark.com.conf
Mar 13 19:21:02.737517 check[3382299]: [ 5] read_file: 32 items read from /home/vmail/.razor/server.c302.cloudmark.com.conf
Mar 13 19:21:02.737599 check[3382299]: [ 5] read_file: 25 items read from /home/vmail/.razor/server.n002.cloudmark.com.conf
Mar 13 19:21:02.737676 check[3382299]: [ 5] read_file: 25 items read from /home/vmail/.razor/server.n002.cloudmark.com.conf
Mar 13 19:21:02.737788 check[3382299]: [ 5] read_file: 25 items read from /home/vmail/.razor/server.n003.cloudmark.com.conf
Mar 13 19:21:02.737866 check[3382299]: [ 5] read_file: 25 items read from /home/vmail/.razor/server.n003.cloudmark.com.conf
Mar 13 19:21:02.737963 check[3382299]: [ 5] read_file: 32 items read from /home/vmail/.razor/server.c303.cloudmark.com.conf
Mar 13 19:21:02.738056 check[3382299]: [ 5] read_file: 32 items read from /home/vmail/.razor/server.c303.cloudmark.com.conf
Mar 13 19:21:02.738093 check[3382299]: [ 5] server discovery overdue by 142003167 seconds
Mar 13 19:21:02.738111 check[3382299]: [ 8] already have 1 discovery servers
Mar 13 19:21:02.738127 check[3382299]: [ 8] Checking with Razor Discovery Server discovery.razor.cloudmark.com
Mar 13 19:21:02.738151 check[3382299]: [ 6] No port specified, using 2703
Mar 13 19:21:02.738161 check[3382299]: [ 5] Connecting to discovery.razor.cloudmark.com ...
Mar 13 19:21:02.936147 check[3382299]: [ 8] Connection established
Mar 13 19:21:02.936183 check[3382299]: [ 4] discovery.razor.cloudmark.com >> 23 server greeting: sn=D&srl=677&a=l&a=cg
Mar 13 19:21:02.936227 check[3382299]: [ 4] discovery.razor.cloudmark.com << 12
Mar 13 19:21:02.936242 check[3382299]: [ 6] a=g&pm=csl
Mar 13 19:21:03.035063 check[3382299]: [ 4] discovery.razor.cloudmark.com >> 71
Mar 13 19:21:03.035188 check[3382299]: [ 6] response to sent.1
6.4. DNS Blocklists / RBL con Exim4
En el caso de las listas RBL actualmente las tengo integradas directamente en Exim4. Por ello en la configuración de SpamAssassin añado la línea resaltada:
# Enable or disable network checks
skip_rbl_checks 1
use_razor2 1
use_pyzor 1
pyzor_options --homedir /home/vmail
razor_config /home/vmail/.razor/razor-agent.conf
La configuración Debian para RBL es my sencilla, sólo hay que definir una variable con un listado de los sitios en línea que se quieran consultar. Ésta se puede definir en el fichero general que estoy usando para definiciones:
CHECK_RCPT_IP_DNSBLS = cbl.abuseat.org : bl.spamcop.net : dnsbl.sorbs.net : dnsbl.njabl.org
La configuración predeterminada de Exim4 para las RBL está en el fichero ACL
/etc/exim4/conf.d/acl/30_exim4-config_check_rcpt
. Esta configuración
sólo marca los correos que estén en la lista, para hacerla más agresiva es buena
opción denegar (deny) la entrada de correo a los servidores listados, para ello,
propongo los cambios resaltados a continuación:
# Check against classic DNS "black" lists (DNSBLs) which list
# sender IP addresses
.ifdef CHECK_RCPT_IP_DNSBLS
deny
dnslists = CHECK_RCPT_IP_DNSBLS
# add_header = X-Warning: $sender_host_address is listed at $dnslist_domain ($dnslist_value: $dnslist_text)
log_message = $sender_host_address is listed at $dnslist_domain ($dnslist_value: $dnslist_text)
.endif
6.5. DNS Blocklists / RBL con SpamAssassin
La solución anterior puede ser muy agresiva, así que se puede usar SpamAssassin también para comprobar las listas DNS que trae intregradas mediante esta configuración:
# Enable or disable network checks
skip_rbl_checks 0
use_razor2 1
use_pyzor 1
rbl_timeout 15
pyzor_options --homedir /home/vmail
razor_config /home/vmail/.razor/razor-agent.conf
Advertencia
Las consultas DNS Blocklists / RBL producen cantidad de peticiones DNS y es necesario tener el caché DNS bien configurado.
La solución a bloqueos DNS URIBL_BLOCKED, SURBL_BLOCKED y RCVD_IN_DNSWL_BLOCKED lo trato en el anexo Bloqueos DNS en Spamassassin (URIBL_BLOCKED / RCVD_IN_DNSWL_BLOCKED)
6.6. Filtros Bayesianos
Los filtros bayesianos actualmente los tengo de desuso, pero presento la configuración que tenía hace unos años cuando los test en línea no estaban tan avanzados y era necesario clasificar el correo.
Nota
La configuración mostrada en esta sección es global para el servidor, no es por cuenta de correo, por tanto cada usuario no puede clasificar sus correos.
Para configurar SpamAssassin con este tipo de filtros hay que activar las directivas indicadas y establecer la ruta donde estarán las bases de datos de estos filtros mediante:
bayes_ignore_header X-Bogosity
bayes_ignore_header X-Spam-Flag
bayes_ignore_header X-Spam-Status
bayes_path /home/vmail/.spamassassin/bayes
Para usar estos filtros hay que tener un par de carpetas IMAP para el aprendizaje no-automático desde las dos carpetas Spam-Si y Spam-No en alguna de las cuentas de correo, en mi caso la del administrador del sistema.
#!/bin/sh
# Aprende el spam que esta en los directorios indicados:
SPAM_SI=/home/vmail/paulino@art-website.com/.Spam-Si/cur/
SPAM_NO=/home/vmail/paulino@art-website.com/.Spam-No/cur/
sa-learn --spam $SPAM_SI $1
sa-learn --ham $SPAM_NO $1
Este script se debe ejecutar desde el cron con el usuario vmail y así crea los
ficheros en /home/vmail/.spamassassin
con los permisos adecuados.