***************************** Spamassassin sin usar sa-exim ***************************** .. include:: ../enlaces.inc.rst 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. .. note:: 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_ 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: .. code:: shell 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 :file:`/etc/default/spamd`. Hay que cambiar la línea indicada de la siguiente forma: .. code-block:: text :caption: Fichero /etc/default/spamd 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* .. code-block:: shell 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)) .. note:: 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: .. code-block:: text :caption: Fichero: /etc/exim4/conf.d/main/00_exim4-config_custom 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 :file:`/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. .. code-block:: text :caption: Fichero: /etc/exim4/acl/40_exim4-config_check_data # 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. .. attention:: 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: :download:`40_exim4-config_check_data` 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: .. code-block:: text :caption: Fichero /etc/exim4/acl/40_exim4-config_check_data :emphasize-lines: 2-4 # 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 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: .. code-block:: text :caption: Fichero: /etc/spamassassin/local.cf # 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. Pyzor ----- Aunque está integrado en SpamAssassin_, no se instala por defecto, así que hay que instalarlo con APT: .. code-block:: shell 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: .. code-block:: shell :emphasize-lines: 9 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 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 .. code-block:: text :caption: Fichero: /etc/spamassassin/local.cf :emphasize-lines: 7 # 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: .. code-block:: shell 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: .. code-block:: text :emphasize-lines: 5 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 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: .. code-block:: text :caption: Fichero: /etc/spamassassin/local.cf :emphasize-lines: 2 # 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: .. code-block:: text :caption: Fichero /etc/exim4/conf.d/main/00_exim4-config_custom 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 :file:`/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: .. code-block:: text :caption: Fichero /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt (línea 325 aprox.) :emphasize-lines: 4,6 # 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 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: .. code-block:: text :caption: Fichero: /etc/spamassassin/local.cf :emphasize-lines: 2,6 # 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 .. warning:: 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 :doc:`../anx1-bloqueos-dns` 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. .. note:: 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: .. code-block:: text :caption: Fichero: /etc/spamassassin/local.cf 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. .. code-block:: sh #!/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 :file:`/home/vmail/.spamassassin` con los permisos adecuados.