Gentoo Logo

Guía Gentoo para el filtrado de correo

Contenido:

1.  Introducción

Esta guía describe paso a paso cómo instalar una pasarela para el filtro de correo no deseado y virus. Es un alternativa simple de adoptar para soluciones de un servidor.

Un vistazo general

Este documento describe como configurar una pasarela para el filtro de correo no deseado con dominios múltiples. Este servidor está diseñado para funcionar delante del servidor que realmente contiene las cuentas de correo, como por ejemplo, Microsoft Exchange o Lotus Notes.

En esta configuración se han elegido aplicaciones con un buen registro de seguridad y archivos de configuración fáciles de entender. El MTA (siglas en inglés de Agente de Transferencia de Correo) es postfix que tiene un buen registro de seguridad y es muy fácil de configurar correctamente. Postfix normalmente oirá al puerto 25 por correo entrante. Al momento de recibirlo lo enviará a Amavisd-new en el puerto 10024. Esta aplicación filtrará el correo mediante distintas reglas antes de reenviarlo a Postfix en el puerto 10025, que a su vez enviará el correo al próximo servidor de correo.

Amavisd-new es una armazón para el filtrado de contenido utilizada para ayudar a las aplicaciones a filtrar virus y correo no deseado. En esta configuración utilizaremos dos aplicaciones auxiliares, ClamAV para el filtro de correo con virus y Spamassassin para el filtrado de correo no deseado. El mismo Spamassassin puede funcionar como otra capa de infraestructura para el filtrado de contenido y utilizar aplicaciones auxiliares como Vipul's Razor2 y DCC.

A diferencia de otras tecnologías contra el correo no deseado como RBLs, Spamassassin no rechaza ni acepta un correo simplemente en base a una sola prueba. Utiliza varias pruebas internas y aplicaciones auxiliares externas para calcular el puntaje spam de cada correo que revisa. Este puntaje se basa en los siguientes tests:

  • Filtrado Bayesiano
  • Reglas estáticas basadas en expresiones regulares
  • Redes distribuidas y colaborativas:
    • RBLs
    • Razor2
    • Pyzor
    • DCC

La primera parte (capítulos 1 al 4) de la guía describe la configuración básica de la pasarela de filtro de correo. Los siguientes capítulos pueden ser implementados individualmente sin dependencia entre ellos. Esos capítulos describen cómo:

  • configurar carpetas especiales IMAP (siglas en inglés de Protocolo de Acceso Interactivo de Correo) para el aprendizaje del filtro Bayesiano y para el envío de falsos positivos
  • configurar listas grises con Postfix 2.1
  • configurar amavisd-new para que utilice MySQL como motor para las preferencias de los usuario

Nota: Las carpetas IMAP utilizarán el formato maildir. Tener cada correo en una carpeta separada hace su manejo mucho más simple. Si estás utilizando mbox te propongo que le des una oportunidad a maildir. Si no estás utilizando maildir actualmente, emerge las herramientas necesarias conemerge courier-imap.

Una quinta parte planeada a futuro contendrá varios consejos sobre desempeño y otras cosas que quizás te gustaría saber (correr en un ambiente chroot, restricciónes del postfix,etc.).

Nota: Delegar responsabilidades a terceros tiene sus riesgos. Tienes que conocer y confiar en estas terceras partes. En esta configuración la decisión de poner en cuarentena correos con virus se basa sólo en una aplicación de terceros. Usando el sistema de calificación de Spamassassin, la decisión de detener correos no es realizada por una sola autoridad, excepto quizás por las reglas estáticas del Spamassassin.

Aviso: Al rechazar correo no deseado en el nivel del MTA debes tener mucho cuidado en elegir el RBL (siglas en inglés de Lista Negra en Tiempo Real) que utilizarás, por ejemplo SpamCop es un mal RBL para ser implementado en el nivel MTA, ya que causará que se den falsos positivos porque algunas veces sus reglas son muy agresivas. Mayor información en Las Listas Negras en Tiempo Real son malas (en inglés) y El problema Spam: Moviéndose más allá de los RBLs (en inglés).

Preparándonos

Antes de empezar, asegúrate que tienes una instalación de Postfix funcionando donde puedas enviar y recibir correos, también necesitas un servidor de correo. Si no tienes experiencia en configurar Postfix podría resultar rápidamente muy complicado si se ve todo de golpe. Si necesitas ayuda puedes encontrarla en la excelente Guía de Alojamiento de Correo Virtual con Postfix en la página de Documentación Gentoo.

2.  Instalando los programas necesarios

Empezaremos por instalar los programas más importantes: Amavisd-new, Spamassassin y ClamAV.

Listado de Código 2.1: Instalando Amavis, Spamassassin y Clamav

# emerge amavisd-new spamassassin clamav 

Nota: Como se mencionó previamente tu ya debes tener una instalación de postfix funcionando en la computadora. Básicamente eso no debe ser más que emerge postfix y tener conocimientos básicos del funcionamiento de Postfix.

Configurando el DNS

Nota: Si no estás configurando un servidor pasarela sino que tienes las carpetas de correo en el mismo servidor, entonces sólo necesitas crear los registros MX.

Mientras los programas están siendo instalados, inicia otra consola y crea los registros DNS necesarios.

Empieza creando un registro MX para la pasarela de correo y un registro A para el próximo destino.

Listado de Código 2.2: Configurando el DNS

(Crea un registr MX para el servidor pasarela)
                MX      10      mailgateway.mydomain.tld.
(Crea un registro A para el servidor pasarela)
mailgateway     A       mgw.ip.add.here
(Crea un registro A para el siguiente servidor de correo)
mail            A       ms.ip.add.here

Nota: Algunos proveedores ADSL bloquean el puerto 25 y te obligan a pasar el correo a través de alguno de sus servidores. Normalmente tienes que crear un registro MX secundario como MX 20 backup-mx.some-isp.tld

Abriendo el cortafuegos

Además de permitir el trafico normal de correo, tienes que permitir a un par de servicios atravezar el cortafuegos para que la red pueda comprobar la comunicación con los servidores.

Aplicación Protocolo Puerto
DCC UDP 6277
Razor(ping de salida) TCP 7
Razor TCP 2703

Razor utiliza pings para descubrir que servidores tiene más cerca.

Configurando Postfix

Primero debemos decirle a postfix que escuche al puerto 10025 y así salvamos la mayoría de las restricciónes que pueden haber sido aplicadas a la instancia de postfix que escucha al puerto 25. Además, nos aseguramos que sólo atienda conexiones locales en el puerto 10025. Para lograr esto añadimos a /etc/postfix/master.cf lo siguiente:

Listado de Código 2.3: Modificando el archivo master.cf

smtp-amavis     unix -        -       n     -       2  smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
#Equivalente usando lmtp:
#lmtp-amavis unix -     -       n       -       2       lmtp
#   -o lmtp_data_done_timeout=1200
#   -o lmtp_send_xforward_command=yes
     
127.0.0.1:10025 inet n        -       n     -       -  smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_client_restrictions=
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o mynetworks=127.0.0.0/8
  -o strict_rfc821_envelopes=yes
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
#Si en cambio deseas usar filtro proxy
#smtp            inet n         -       n      -       8 smtpd
# -o smtpd_proxy_filter=127.0.0.1:10024
# -o smtpd_client_connection_count_limit=4
#SI no quieres revisar el correo saliente utiliza esto
#10.0.0.2:smtp   inet n         -       n       -      - smtpd
#-o content_filter=

Nota: La linea smtp-amavis especifica que un máximo de dos procesos pueden correr en cualquier momento. Si necesitas una concurrencia mayor ajusta este número a tus necesidades. Recuerda que debe ser igual al número de $max_servers= en amavisd.conf Ten en cuenta que amavisd-new consume bastante memoria y por lo tanto aumentar demasiado el número de procesos puede consumir toda la memoria y provocar que se utilice memoria swap lo cual puede disminuir notoriamente el desempeño de tu sistema.

Nota: Si quieres rechazar el correo no deseado temprano en el proceso, puedes usar el método Before-Queue (proxy) en vez del método de filtro. Si descomentas las tres lineas tendrás que configurar content_filter en main.cf. Este no es un método recomendado en servidores con gran tráfico, ya que el número de conexiones concurrentes está limitado por el número de instancias de amavisd.

Aviso: El método Before-Queue(proxy) no está todavía apropiadamente probado.

Nota: Si, por alguna razón, quieres enviar correo desde esta computadora y no quieres que sea escaneado, añade otra instancia de postfix descomentando las dos últimas lineas y substituyendo con el IP apropiado.

El archivo master.cf le indica al programa maestro de postfix como correr cada uno de los procesos individuales postfix. Mayor información con man 8 master.

Luego de esto, necesitamos que la instancia principal de postfix escuche al puerto 25 para filtrar el correo a través de amavisd-new que escucha por el puerto 10024.

También necesitamos configurar el siguiente destino del correo. Hay que indicarle a Postfix que filtre el correo a través de un filtro de contenido externo y habilitar explícitamente el direccionamiento para que Postfix sepa a donde enviar el correo.

Listado de Código 2.4: Modificando /etc/postfix/main.cf

biff = no
empty_address_recipient = MAILER-DAEMON
queue_minfree = 120000000
content_filter = smtp-amavis:[127.0.0.1]:10024
#Equivale sí usas lmtp:
#content_filter = lmtp-amavis:[127.0.0.1]:10024
# TRANSPORT MAP
#
# Inserta el text de sample-transport.cf si necesitas direccionamiento explícito.
transport_maps = hash:/etc/postfix/transport
relay_domains = $transport_maps

Postfix tiene muchas opciones configuradas en main.cf. Para mayor información acerca del archivo consulta man 5 postconf o en linea Parámetros de configuración de Postfix.

El formato de transport es el de un archivo hash de Postfix normal. El correo al dominio en la izquierda es enviado al destinatario en el lado derecho.

Listado de Código 2.5: /etc/postfix/transport

mydomain.tld                          smtp:mail.mydomain.tld

Luego de haber editado este archivo, necesitamos ejecutar el comando postmap. Postfix no puede leer este archivo así que debemos convertirlo al formato adecuado con postmap /etc/postfix/transport. Esto crea el archivo /etc/postfix/transport.db. No hay necesidad de cargar de nuevo Postfix, ya que lee los cambios de manera automática.

Nota: Si el siguiente destino en el servidor de correo no escucha al puerto SMTP estandar: 25, puedes indicarle a postfix que use un cierto número de puert, como: smtp:mail.mydomain.tld:25000.

Si tus primeros intentos de enviar un correo resultan en estos rebotando, es probable que hayas cometido un error de configuración en algún lugar. Trata activando de manera temporal soft_bounce mientras que solucionas tus problemas de configuración. Esto previene que postfix rebote los correos por errores de entrega al tratarlos como errores temporales. Postfix mantiene los mensajes en la cola de correo hasta que soft_bounce sea desactivado o eliminado.

Listado de Código 2.6: Activando soft_bounce

  # postconf -e "soft_bounce = yes"
  # /etc/init.d/postfix reload

Una vez que tengas tu configuración funcionando de manera adecuado, asegúrate de desactivar o eliminarsoft_bounce y recargar postfix.

Configurando Amavisd-new

Amavisd-new es utilizada para manejar todos los filtrados y te permite utilizar distintas tecnologías juntas de manera sencilla. Al momento de recibir la notificación de un correo, va a extraerlo, filtrarlo a través de distintos filtros personalizables, manejar listas blancas y negras, filtrar el correo a través de escáneres de virus y finalmente entregarlo a Spamassassin.

EL mismo amavisd-new tiene varias características extras:

  • identifica archivos adjuntos peligrosos y tiene políticas para manejarlos
  • políticas por usuario, por dominio y globales para:
    • listas blancas
    • listas negras
    • umbrales para la calificación de spam
    • políticas para el correo no deseados y los virus

Fuera de postfix y freshclam ejecutaremos todas las demás aplicaciones como el usuario amavis.

Crea el nuevo directorio raíz y configura los permisos necesarios.

Listado de Código 2.7: Creando el nuevo directorio home y configurando los permisos

# mkdir /var/amavis
# chown amavis:amavis /var/amavis
# chmod 750 /var/amavis

Edita las lineas siguientes en /etc/amavisd.conf

Listado de Código 2.8: Editando /etc/amavisd.conf

(Inserta los dominios a ser escaneados)
$mydomain = 'example.com';     
(Bind sólo la interfaz local)
$inet_socket_bind = '127.0.0.1';
(Enviarlo a Postfix en el puerto 10025)
$forward_method = 'smtp:127.0.0.1:10025';
$notify_method = $forward_method;       
(Define la cuenta a la cual enviar correos de alerta de virus)
$virus_admin = "virusalert\@$mydomain";
(Siempre añadir las cabeceras spam)
$sa_tag_level_deflt  = -100; 
(Añadir la cabecera de spam detectado o X-Spam-Status: Yes)
$sa_tag2_level_deflt = 5; 
(Activar acciones evasivas a este nivel de spam)
$sa_kill_level_deflt = $sa_tag2_level_deflt;
(No enviar notificaciones de estado de envío al remitente. 
No afecta el envío de spam al destinatario. Para hacer eso, utiliza 
el kill_level)
$sa_dsn_cutoff_level = 10;
Que no rebote el mensaje de derecha a izquierda, que lo ponga en cuarentena en cambio.
instead
$final_virus_destiny      = D_DISCARD;  # (defaults to D_DISCARD)
$final_banned_destiny     = D_DISCARD;  # (defaults to D_BOUNCE)
$final_spam_destiny       = D_DISCARD;  # (defaults to D_BOUNCE)

Nota: Con esta linea configuras la calificación de correo no deseado de Spamassasin a 5 $sa_tag2_level_deflt = 5;. Esto podría ser algo bajo. Como te habrás dado cuenta, el valor por defecto de Amavisd-new es 6.3.Si no quieres ver ningún correo no deseado en tus carpetas de correo elige 5, pero si no quieres lidiar con falsos positivos elige 6.3.

Crea un directorio para poner los correos con virus en cuarentena, ya que no queremos que estos lleguen a los usuarios.

Listado de Código 2.9: Creando un directorio para cuarentena

# mkdir /var/amavis/virusmails
# chown amavis:amavis /var/amavis/virusmails
# chmod 750 /var/amavis/virusmails

Nota: Amavisd-new ofrece políticas de refinamiento más avanzadas utilizando un banco de políticas.

Configurando ClamAV

Como escaner de virus utilizamos ClamAV, ya que tiene un ratio de detección bastante bueno comparable con las opciones comerciales, es además rápido y Open Source. Nosotros adoramos las bitacoras, así que haz que clamd haga bitácoras utilizando syslog y activando el modo detallado. También, no te olvides de no ejecutar clamd como root. Ahora edita /etc/clamd.conf

Listado de Código 2.10: Editando /etc/clamd.conf

(Registro detallado con syslog)
LogSyslog
LogVerbose
LogFacility LOG_MAIL
(Cambia la ubiación del archivo pid) 
PidFile /var/run/amavis/clamd.pid
(Define el socket para clamav) 
LocalSocket /var/amavis/clamd
(Cierra la conexión cuando este limite se sobrepasa)
StreamMaxLength 10M
(No ejecutes clamd como super usuario)
User amavis
(Versiones actuales requieren estas lineas)
ScanMail
ScanArchive

Nota: No te olvides de quitar la directiva de ejemplo para que ClamAV funcione.

ClamAV viene con el demonio freshclam dedicado a revisar periódicamente las actualizaciones en las firmas de virus. En ves de actualizar las firmas de virus dos veces al día, haremos que fresclam las actualice cada dos horas.

Listado de Código 2.11: Editando /etc/freshclam.conf

(Bitácoras con Syslog)
LogSyslog
(Bitácoras detalladas)
LogVerbose
(Evitar explícitamente los privilegios de super usuario)
DatabaseOwner clamav
(Revisar por actualizaciones cada dos horas. Esta es la recomendación oficial)
Checks 12
(Utiliza el espejos más cercano. Reemplaza XY por el código de tu país)
DatabaseMirror db.XY.clamav.net

Arranca clamd con freshclam utilizando el guión de inicio modificando /etc/conf.d/clamd

Listado de Código 2.12: Modificando /etc/conf.d/clamd

START_CLAMD=yes
FRESHCLAM_OPTS="-d"

Al menos modifica amavisd.conf con la nueva ubicación del socket.

Listado de Código 2.13: Modificando /etc/amavisd.conf

(Descomenta el escaner clamv y modifica la ubicación del socket)
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/amavis/clamd"],
  qr/\bOK$/, qr/\bFOUND$/,
  qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],

Aviso: NO modifiques el $unix_socketname al menos que sepas lo que estás haciendo.

Configurando Vipul's Razor

Razor2 es una red colaborativa y distribuida para la suma de verificación del correo no deseado. Instálalo con emerge razor y crea los archivos de configuración necesarios. Haz esto al ejecutar como el usuario amavis: su -amavis y razor-admin -create

Listado de Código 2.14: Creando los archivos de configuración necesarios

# emerge razor
(Define temporalmente a bash como el shell de amavis)
# usermod -s /bin/bash amavis
# su - amavis
$ razor-admin -create
$ exit
(Redefine el shell a /bin/false)
# usermod -s /bin/false amavis

Configurando la distribución de sumas de control (dcc)

Al igual que Razor2, dcc es una red distribuida y colaborativa para la suma de verificación del correo no deseado. Su filosofía se basa en contar el número de destinatarios de un mail identificando cada correo con una suma de verificación.

Listado de Código 2.15: Instalando DCC

# emerge dcc

Configurando Spamassassin

Amavis utiliza directamente las librerías Perl de Spamassassin así que no hay necesidad de iniciar el servicio. Pero esto también trae confusión y a que algunas preferencias modificadas en /etc/mail/spamassassin/local.cf son sobreescritas por opciones en /etc/amavisd.conf.

Listado de Código 2.16: Creando /etc/mail/spamassassin/local.cf

# Activa el sistema Bayes
use_bayes               1
# Activa la verificación en todas las redes
skip_rbl_checks         0

# Correo escrito en los lenguajes utilizados en estos países
#no estarán marcados como posible correo no deseado en un lenguaje
#foráneo. - danés inglés noruego sueco 
ok_languages da en no sv
# Correo que utilice locales de estos códigos de países no
#será marcado como posible correo no deseado en un lenguaje
#foráneo. 
ok_locales en
# Utiliza una ruta bayes sensible
bayes_path              /var/amavis/.spamassassin/bayes

Nota: Con Spamassassin version 3.1 tienes que activar DCC, Razor2 removiendo los comentarios de las líneas correspondientes en v310.pre

Nota: Puedes encontrar inspiración para tu archivo local.cf probando el Generador de configuración de SpamAssassin.

Nota: Quizás también quieres activar las opciones ok_languages y ok_locales.

3.  Toda buena regla también tiene buenas excepciones

Una vez que el correo realmente empiece a pasar a través de esta pasarela de correo quizás te des cuenta que la configuración actual no es perfecta. Tal vez a algunos de tus clientes les gusta recibir correos que otros no. Puedes crear listas blancas/listas negras para los remitentes de los correos de una manera muy sencilla. Descomenta la siguiente línea en amavisd.conf.

Listado de Código 3.1: Modificando amavisd.conf para que realice una calificación global

read_hash("/var/amavis/sender_scores_sitewide"),

En el archivo sender_scores_sitewide colocas la dirección de correo completa o sólo las partes del dominio junto con una calificación positiva/negativa ha añadir a la calificación de correo no deseado.

Listado de Código 3.2: ejemplo de una lista blanca

(Poner en la lista blanca a todos los correos del destinatario especificado)
postmaster@example.net                -3.0
(Poner en la lista blanca todos los correos de example.net excluyendo subdominios) 
.example.net                           1.0

Nota: Revisa el archivo /etc/amavisd.conf para más ejemplos.

Nota: Colocar estas direcciones fuera de amavisd.conf es una solución más limpia y segura.

Nota: Alternativamente, puedes hacer estas especificaciones en el archivo de configuración /etc/mail/spamassassin/local.cf pero pienso que es más claro si lo haces en /etc/amavisd.conf.

Nota: En un capítulo más adelante mostraré como implementar políticas por usuario utilizando MySQL.

Hasta implementar un mejor método, puedes añadir lo siguiente a amavisd.conf para evitar la revisión de correo no deseado para los buzones de postmaster y abuse

Listado de Código 3.3: Saltar los filtros de spam para todos los correos de postmaster y abuse

map { $bypass_spam_checks{lc($_)}=1 } (qw(
        postmaster@
        abuse@
));

Importante: Mientras estamos en esto nunca debemos descartar automáticamente correos de las cuentas postmaster o abuse. Mira en RFC 2142 NOMBRES DE BUZONES PARA SERVICIOS COMUNES, ROLES Y FUNCIONES. De otra manera tus dominios pueden quedar enlistados en algunas de las malévolas listas de rfc-ignorant.org.

4.  Añadiendo más reglas

Si quieres utilizar más reglas proveidas por los Ninjas SARE en el Emporio de Reglas de SpamAssassin, puedes añadirlas y actualizarlas fácilmente utilizando el mecanismo sa-update incluido en Spamassassin.

Listado de Código 4.1: Instalando rulesdujour

# emerge "mail-filter/spamassassin-ruledujour"

Ahora edita el archivo /etc/rulesdujour/config y reinicia Amavisd-new:

5.  Probando y últimos retoques

Probando la configuración

Antes de iniciar freshclam puedes verificar si funciona manualmente.

Listado de Código 5.1: Probando freshclam

# freshclam
ClamAV update process started at Sun May  2 09:13:41 2004
Reading CVD header (main.cvd): OK
Downloading main.cvd [*]
main.cvd updated (version: 22, sigs: 20229, f-level: 1, builder: tkojm)
Reading CVD header (daily.cvd): OK
Downloading daily.cvd [*]
daily.cvd updated (version: 298, sigs: 1141, f-level: 2, builder: diego)
Database updated (21370 signatures) from database.clamav.net (193.1.219.100).

Ahora que has actualizado las definiciones de los virus, puedes estar seguro que freshclam.conf funciona correctamente.

Prueba freshclam y amavisd desde los correos de prueba de cli y amavisd. Inicia clamd y amavis con los siguientes comandos:

Listado de Código 5.2: Iniciar amavisd y clamd y recargar la configuración de postfix

# /etc/init.d/clamd start
# /etc/init.d/amavisd start
# /etc/init.d/postfix reload

Si todo a salido como debe postfix ahora estará escuchando por correos en el puerto 24 y por correos reinyectados en el puerto 10024. Para verificar que es así, revisa la bitácora.

Listado de Código 5.3: Resvisando las bitácoras

# tail -f /var/log/mail.log

Nota: Dependiendo de la configuración de tus bitácoras, la ruta correcta sería /var/log/messages.

Si ningún mensaje extraño aparece en la bitácora, es hora para una nueva prueba.

Utiliza netcat para conectarte manualmente a amavisd en el puerto 10024 y postfix en el puerto 10025.

Nota: Netcat puede ser utilizado como un reemplazo avanzado de telnet. Instalalo con emerge netcat.

Nota: Por alguna razón desconocida no se puede completar la inyección manual de correo a amavisd con netcat. Utiliza telnet en cambio.

Listado de Código 5.4: Comprobación manual de que amavisd y postfix están escuchando a los nuevos puertos

 
# nc localhost 10024
(Amavis funcionando)
220 [127.0.0.1] ESMTP amavisd-new service ready
nc localhost 10025
(Reinyección a Postfix funcionando)
220 example.com ESMTP Postfix

Nota: Si quieres ver la salida completa de amavisd-new, ejecuta amavisd debug-sa como el usuario amavis y envía un correo. Para que este método funcione tendrás que cambiar el shell por defecto en /etc/passwd

Añade amavisd y clamd al nivel de ejecución default.

Listado de Código 5.5: Añadiendo amavisd y clamd al nivel de ejecución default

# rc-update add clamd default
# rc-update add amavisd default

Nota: No añadimos spamd al nivel de ejecución por defecto y que amavisd utiliza las librerías Perl de Spamassassin directamente.

Nota: Quizás hallas notado las siguientes lineas en tu bitácora: Net::Server: Couldn't POSIX::setuid to ... []. De acuerdo al LEEME de amavis chroot, si el proceso UID permanece en 0 (root), el programa terminará, de otra forma considera el mensaje simplemente informativo. Esto es porque POSIX::setuid() regresa la cadena 0 but true.

Importante: Si activaste la posibilidad de iniciar sesión para amavis, no te olvides de redefinir el intérprete de comandos en /etc/passwd a /bin/false.

6.  Autoaprendizaje y diferimiento de emails

Creando el usuario spamtrap

Crea la cuenta spamtrap y los directorios.

Listado de Código 6.1: Creando la cuenta spamtrap

# useradd -m spamtrap
# maildirmake /home/spamtrap/.maildir
# chown -R spamtrap:mailusers
/home/spamtrap/.maildir
(Dale al usuario spamtrap una contraseña sensible)
# passwd spamtrap

Si quieres revisar manualmente algunos de los correos para asegurarte que no tengas falsos positivos puedes la siguiente receta de procmail para desviar el correo no deseado encontrado hacia distintas carpetas de correo.

Creando .procmailrc

Listado de Código 6.2: Creando /home/spamtrap/.procmailrc

#Define algunas variables por defecto
MAILDIR=$HOME/.maildir
SPAM_FOLDER=$MAILDIR/.spam-found/
LIKELY_SPAM_FOLDER=$MAILDIR/.likely-spam-found/
#Envía correos con una calificación spam de 7+ al spamfolder
:0:
* ^X-Spam-Status: Yes
* ^X-Spam-Level: \*\*\*\*\*\*\*
$SPAM_FOLDER
#Envía el correo con una calificación spam entre 5-7 al folder "likely spam"
:0:
* ^X-Spam-Status: Yes
$LIKELY_SPAM_FOLDER
#Envía los demás correos al buzón de entrada
:0
*
./

Aviso: Si tu servidor de correo va a recibir una gran cantidad de correo NO se recomienda el uso de la receta likely-spam. En cambio configura $sa_tag2_level_deflt lo suficientemente alto como para evitar falsos positivos y que los filtre directamente a $SPAM_FOLDER.

Nota: Si todavía no has instalado procmail, hazlo con emerge procmail.

Ahora, hay que asegurar que Postfix utilice procmail para entregar el correo.

Listado de Código 6.3: Modificando /etc/postfix/main.cf

mailbox_command = /usr/bin/procmail -a "DOMAIN"

Creando los buzones

Ahora crearemos los directorios compartidos por ham y spam.

Listado de Código 6.4: Creando los buzones necesarios

# maildirmake /var/amavis/.maildir
# maildirmake -S /var/amavis/.maildir/Bayes
# maildirmake -s write -f spam /var/amavis/.maildir/Bayes
# maildirmake -s write -f ham /var/amavis/.maildir/Bayes
# maildirmake -s write -f redeliver /var/amavis/.maildir/Bayes

Amavisd-new necesita ser capaz de leer estos archivos de la misma manera que todos los usuarios. Por lo tanto, necesitamos añadir todos los usuarios relevantes al grupo mailuser junto con amavis.

Listado de Código 6.5: Configurando los permisos necesarios

# groupadd mailusers
# usermod -G mailusers spamtrap
# chown -R amavis:mailusers /var/amavis/.maildir/
# chown amavis:mailusers /var/amavis/
# chmod -R 1733 /var/amavis/.maildir/Bayes/
# chmod g+rx /var/amavis/.maildir/
# chmod g+rx /var/amavis/.maildir/Bayes/

Aviso: Esto garantiza que los miembros del grupo mailusers tengan acceso al correo de amavis

Eso permite que los directorios spam y ham pueden ser leidos pero no modificados. De esta manera los usuarios pueden enviar sus ham sin que nadie más pueda leerlos.

Luego ejecuta el siguiente comando como el usuario spamtrap:

Listado de Código 6.6: Añadiendo los directorios compartidos a los buzones de los usuarios

$ maildirmake --add Bayes=/var/amavis/.maildir/Bayes $HOME/.maildir

Nota: Tenemos que darle al grupo los permisos de lectura en el directorio Bayes de manera que el cliente de correo pueda ver los subdirectorios utilizados por IMAP.

Añadiendo los trabajos calendarizados

Ahora ejecuta crontab -u amavis -e para editar el crontab de manera que se active el aprendizaje automático del filtro Bayesiando cada hora.

Listado de Código 6.7: amavis crontab

#Auto aprendizaje
0 * * * *          /usr/bin/sa-learn --spam /var/amavis/.maildir/Bayes/.spam/{cur,new} \
                    > /dev/null 2>&1 
0 * * * *          /usr/bin/sa-learn --ham /var/amavis/.maildir/Bayes/.ham/{cur,new} > \
                   /dev/null 2>&1 

Nota: amavis necesita ser miembro del grupo cron para ejecutar los trabajos.

Nota: Parece que los buzones compartidos harán que sa-lern examine todos los mensajes dos veces. Esto no debería ser un problema. La salida también mostrará que el máximo de mensajes de los cuales se aprende es la mitad o menos de los examinados.

Modificando amavisd.conf

Ahora, modifica amavis para que redireccione el correo no deseado a la cuenta spamtrap y se quede con los encabezados.

Listado de Código 6.8: Modificando /etc/amavisd.conf

(Define la cuenta a la cual enviar el spam)
$spam_quarantine_to = "spamtrap\@$myhostname";

Redistribuyendo falsos positivos

Si configuras la calificación de spam muy baja, como lo hacemos aca, es probable que te encuentres con algunos falsos positivos. Esto serán filtrados en el directorio likely-spam. Estos son revisados manualmente y cualquier falso positivo es movido al buzón redeliver. Desde ahí es primero redirigido a través de sa-learn --ham y redistribuido con todas las cabeceras intactas usando una versión parchada de smtpclient de Ralf S. Engelschall.

La versión 1.0.0 original de smtpclient está en portage, sin embargo para mantener las cabeceras intactas utilizamos una versión modificada. Aquí está como instalar la versión revisada:

Listado de Código 6.9: Installing revised smtpclient

(Cambiado el portage OVERLAY)
# wget http://home.coming.dk/files/smtpclient.tar.gz
# tar xzf smtpclient.tar.gz
# echo "mail-client/smtpclient    ~x86" >> /etc/portage/package.keywords
# echo "mail-client/smtpclient    fullheaders" >> /etc/portage/package.use
# emerge smtpclient

Revisa cada minuto la carpeta redeliver para comprobar nuevos correos, utilizando cron.

Listado de Código 6.10: amavis crontab

#Redistribuir falsos positivos
* * * * *          find /var/amavis/.maildir/Bayes/.redeliver/cur/ -type f -name \
                   "[0-9]*" -exec cp {} /var/amavis/.maildir/Bayes/.ham/cur/ \; \
                   && find /var/amavis/.maildir/Bayes/.redeliver/cur/ -type f \
                   -name "[0-9]*" -exec /usr/local/bin/redeliver.pl {} \;

Ahora, sólo necesitamos compiar el archivo redeliver.pl a /usr/local/bon.Descárgalo o utiliza la siguiente versión.

Listado de Código 6.11: redeliver.pl

#!/usr/bin/perl -w
# Redelivers mail using a modified version of smtpclient
# By: Jens Hilligsoe <gentoo@hilli.dk>
use strict;
if(!($#ARGV == 0)) {
        die "Usage:\n$0 maildir_mail\n";
}
my $mail = $ARGV[0];
my $to = "";
my $from = "";
sub prunefile ( $ );
# Retrieve To and From envelope adresses
open (MAIL, $mail) or die "Could not open $mail: $?\n";
while(<MAIL>) {
    if(($to eq "") || ($from eq "")) {
        chop;
        (my $key, my $value) = split (/:/);
        if($key eq "X-Envelope-To") {
            $to = $value;
            $to =~ s/[\<\>,]//g; # Remove "<", ">" and ","
            $to =~ s/^\s+|\s+$//g; #Remove whitespace before and after
        }
        if($key eq "X-Envelope-From") {
            $from = $value;
            $from =~ s/[\<\>,]//g;
            $from =~ s/^\s+|\s+$//g;
            if($from eq "") {
                $from = "postmaster";
            }
        }
    }
}
if($to eq "") {
    prunefile($ARGV[0]); # Just nuke it if to is empty
} else {
    my $redelivercmd = "cat $ARGV[0] | smtpclient -F -S 127.0.0.1 -P 10025 -f $from $to";
    unless (system($redelivercmd) == 0 ) {
        die "Unable to redeliver: $?";
    }
    prunefile($ARGV[0]); # Clean up
}
sub prunefile ( $ ) {
    my ($file) = @_;
    unless (unlink $file) {
        die "Unable to remove mail: $?";
    }
}

Limpiando

No queremos guardar el correo para siempre, así que utilizaremos tmpwatch para limpiarlo regularmente. Instálalo con emerge tmpwatch. Únicamente el root puede ejecutar tmpwatch así que necesitamos editar el crontab de él.

Listado de Código 6.12: Modificando el crontab del root

# Limpia
# Guarda los virusmails por una semana (24*7 horas)
15 0 * * *      /usr/sbin/tmpwatch -c -f -d --quiet 168 /var/amavis/virusmails/
# Borra el spam y ham utilizado para aprender luego de una semana
15 0 * * *      /usr/sbin/tmpwatch -c -f -d --quiet 168 /var/amavis/.maildir/Bayes/

7.  Listas Grises

Introducción

Las listas grises son una de las nuevas armas en el arsenal de lucha contra el correo no deseado. Como el nombre lo implica, son muy parecidas a las listas blancas y a las listas negras. Cada vez que un servidor de correo desconocido intenta enviar un correo, este es rechazado con el mensaje try again later (intente de nuevo más tarde). Esto implica que el correo es demorado, pero también que los estúpidos spam bots que no implementan el protocolo RFC descartarán el correo y no volverán a intentarlo jamás. Con el tiempo los spam bots probablemente se adaptarán, sin embargo esto dará tiempo a otras tecnologías para que identifiquen el correo no deseado.

Nota: Si tu proveedor ISP bloquea todo el tráfico entrante por el puerto 25 y te envía todo el correo a través de su propio servidor de correo, las listas grises no funcionarán.

Postfix 2.1 viene con un simple servidor de políticas de listas grises en Perl que implementa el esquema. Sin embargo, cuando la partición que alberga la base de datos de la lista gris se queda sin espacio, los resultados son impredecibles. Hay una versión mejorada que no sufre de este error. Primero te mostraré como instalar el soporte para listas grises que viene incluido en Postfix y luego, pasaremos implementar el reemplazo más robusto.

Nota: Hay otros servidores de políticas de listas grises para Postfix (como Gld, que está en Portage, y SQLgrey). Algunos de ellos soportan motores de base de datos, listas blancas automáticas y otras interesantes características.

Listas grises simples

Nota: Si deseas en cambio utilizar el servidor mejorado de políticas de listas grises con postgrey, puedes tranquilamente saltarte esta sección.

Necesitamos el archivo greylist.pl pero desafortunadamente el ebuild no lo instala por defecto.

Listado de Código 7.1: Consiguiendo el greylist.pl

# cp /usr/portage/distfiles/postfix-your-version-here.tar.gz /root/
# tar xzf postfix-your-version-here.tar.gz
# cp postfix-2.1.0/examples/smtpd-policy/greylist.pl /usr/bin/

Ahora que tenemos el archivo en su lugar, necesitamos crear el directorio que albergará la base de datos de la lista gris.

Listado de Código 7.2: Creando el directorio para la base de datos

# mkdir /var/mta
# chown nobody /var/mta

Aviso: No crees el directorio para la base de datos en una partición que podría quedarse sin espacio. Mientras que postfix puede recuperarse de situación donde no hay más espacio para la cola de correos y los buzones, este no es el caso con la base de datos de la lista gris. Si el archivo se corrompe, no serás capaz de recibir correo en lo absoluto hasta que borres el archivo manualmente.

Configurando la lista gris

Ahora que tenemos eso listo, lo que nos falta hacer es modificar la configuración de postfix. Primero, añadiremos la necesaria información a master.cf

Listado de Código 7.3: Modificando master.cf para utilizar listas grises

policy-greylist  unix  -       n       n       -       -       spawn
   user=nobody argv=/usr/bin/perl /usr/bin/greylist.pl

El demonio spawn de postfix normalmente termina los procesos luego de 1000 segundos, pero este tiempo es muy corto para permitir el proceso de las listas grises, así que debemos incrementar el límite de tiempo en main.cf:

Listado de Código 7.4: Modificando el main.cf para utilizar listas gises

policy-greylist_time_limit = 3600
(En la sección smtpd_recipient_restrictions añade:)
check_sender_access hash:/etc/postfix/sender_access
(Luego añade:)
restriction_classes = greylist
greylist = check_policy_service unix:private/policy-greylist

Aviso: Asegúrate de especificar check_sender_access LUEGO de reject_unauth_destination o tu sistema tendrá se convertirá en un conmutador de correo abierto.

Nota: La base de datos de la lista gris es rápidamente contaminada con direcciones erradas. Ayuda que protejas la lista gris con otras restricciones además de rechazar destinatarios y/o remitentes desconocidos.

No vamos a utilizar las listas grises para todos los dominios, sólo para aquellos abusados frecuentemente por los correos no deseados. Después de todo, va a demorar la entrega del correo.Una lista de dominios CORREO DE frecuentemente olvidados la puedes encontrar en línea. Añade los dominios desde los cuales recibes bastante correo no deseado en /etc/postfix/sender_acces:

Listado de Código 7.5: Formato del sender_access

aol.com     greylist
hotmail.com greylist
bigfoot.com greylist

Si deseas una lista más extensa:

Listado de Código 7.6: Adding all domains to sender_access

# wget http://www.monkeys.com/anti-spam/filtering/sender-domain-validate.in
# cat sender-domain-validate.in | sort | awk {'print $1 "\t\t greylist"'} > /etc/postfix/sender_access

Ahora sólo necesitamos inicializar la base de datos sender_access database:

Listado de Código 7.7: Inicializando sender_access

# postmap /etc/postfix/sender_access

La configuración de la lista gris simple está completa.

Aviso: He probado esto en una máquina que manejaba miles de correos diariamente y los resultados fueron casi un completo desastre. Luego de cuatro días la máquina estaba saturada con viejos procesos greylist.pl.

Configurando listas grises mejoradas con postgrey

Puedes instalar un servidor políticas de listas grises mejoradas con un simple:

Listado de Código 7.8: Instalando postgrey

# emerge postgrey

Luego de instalar postgrey tenemos que editar el archivo main.cf. Los cambios son casi exactamente los mismos que para la lista gris incluida.

Listado de Código 7.9: Modificando el main.cf para usar listas grises

(En la sección smtpd_recipient_restrictions añadir:)
check_sender_access hash:/etc/postfix/sender_access
(Luego añadir:)
smtpd_restriction_classes = greylist
greylist = check_policy_service inet:127.0.0.1:10023

Nota: El SMTPD_POLICY_README de Postfix utiliza sólo restriction_clases pero parece no funcionar.

Nota: Si deseas poner todo bajo la lista gris, añade en cambio check_policy_service inet:127.0.0.1:10030.

Finalmente, inicia el servidor y añádelo al nivel de ejecución apropiado.

Listado de Código 7.10: Iniciando postgrey

  # /etc/init.d/postgrey start
  # rc-update add postgrey default

Nota: Algunas personas prefieren recibir su correo rápido, así que utilizar listas grises es inapropiado. Sin embargo, si utilizas un servidor de correo de respaldo, puedes configurar las listas grises ahí. Mi limitada experiencia me ha enseñado que puede detener hasta un tercio de todo el correo no deseado recibido.

8.  SPF (Infraestructura de Políticas de envío, Sender Policy Framework)

Introducción

SPF permite a los dueños de los dominios especificar en sus registros DNS qué direcciones IP podrán enviar correos desde su dominio. Esto evitará que los spammers que se aprovechen del Return-Path.

Nota: Si tu proveedor ISP bloquea todo el trafico por el puerto 25 y envía todo el correo a través de su propio servidor, SPF no funcionará.

Primero los dueños de los dominios tienen que crear un registro DNS TXT especial. Así, un MTA con soporte SPF puede leerlo y si el correo entrante no proviene de un servidor especificado en el registro SPF será rechazado. Una entrada de ejemplo es la siguiente:

Listado de Código 8.1: Registro SPF de ejemplo

example.com.  IN TXT  "v=spf1 a mx ptr -all"

El -all indica que se rechace todo el correo por defecto pero que se permita el ingreso de este si proviene de los registros A(a), MX(mx) y PTR(ptr). Para mayor información, consulta los recursos listados abajo.

Nota: Si envías tu correo saliente a través de tu ISP, entonces añade: include:yourisp.com.

Spamassassin 3.0 tiene soporte para SPF, sin embargo este no viene activado por defecto y el nuevo demonio de políticas de Postfix soporta SPF, así que instalemos el soporte SPF de Postfix.

Nota: Si en cambio deseas utilizar el SPF de Spamassassin simplemente ejecuta emerge dev-perl/Mail-SPF-Query y reinicia Amavisd-new

Preparando el sistema

Primero debes instalar Postfix 2.1 como se describe a continuación. Luego de haber descargado las fuentes, agarra el spf.pl con:

Listado de Código 8.2: Instalando spf.pl

# cp postfix-<version>/examples/smtpd-policy/spf.pl /usr/local/bin/

Nota: El spf.pl que viene incluido con Postfix tiene algunos errores, así que busca y descomenta la siguiente linea: push @HANDLERS, "sender_permitted_from"; use Mail::SPF::Query. Más adelante, en la línea 199 sustituye comemnt con comment. Alternativamente puedes descargarte una versión en desarrollo.

Este guión en Perl también necesita algunas librerías que no están en Portage pero que son sencillas de instalar:

Listado de Código 8.3: Instalando las librerias faltantes

# emerge Mail-SPF-Query Net-CIDR-Lite Sys-Hostname-Long

Ahora que tenemos todo en su lugar, sólo necesitamos configurar Postfix para que utilice esta nueva política.

Listado de Código 8.4: Modificando master.cf para que utilice SPF

policy-spf  unix  -       n       n       -       -       spawn
   user=nobody argv=/usr/bin/perl /usr/local/bin/spf.pl

Ahora añade la verificación SPF en main.cf. Un SPF correctamente configurado no debería hacer ningún daño de manera que podamos revisar SPF para todos los dominios

Listado de Código 8.5: Modificando main.cf para que utilice SPF

(En la sección smtpd_recipient_restrictions añade:)
check_policy_service unix:private/policy-spf

Nota: Si tienes problemas utilizando SPF, por ejemplo al utilizar fetchmail, quizás prefieras habilitar el SPF sólo para algunos dominios.

9.  Configurando amavisd-new para que utilice MySQL

Configurando MySQL

Nota: Esto no ha sido probado todavía en versiones mayores que la 2.2. Cualquier comentario o sugerencia es bienvenido :).

Para dominios grandes, los valores por defecto que has definido en amavisd.conf quizás no se adecuen a todos los usuarios. Si configuras amavisd-new con soporte para MySQL puedes tener configuraciones individuales por usuarios o por grupos.

Listado de Código 9.1: Creando la base de datos y usuarios MySQL

# mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 78 to server version: 4.0.18-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database maildb;
mysql> GRANT INSERT,UPDATE,DELETE,SELECT ON maildb.* TO 'mail'@'localhost' IDENTIFIED BY 'very_secret_password';
mysql> use maildb;

Ahora que la base de datos está creada, necesitamos crear las tablas. Puedes copiar y pegar lo siguiente al prompt de mysql:

Listado de Código 9.2: Diseño de tablas MySQL

CREATE TABLE users (
    id         int unsigned NOT NULL auto_increment,
    priority   int          NOT NULL DEFAULT '7',  -- 0 is low priority
    policy_id  int unsigned NOT NULL DEFAULT '1',
    email      varchar(255) NOT NULL,
    fullname   varchar(255) DEFAULT NULL,    -- not used by amavisd-new
    local      char(1),     -- Y/N  (optional field, see note further down)
    PRIMARY KEY (id),
    KEY email (email)
    );
CREATE UNIQUE INDEX users_idx_email ON users(email);
(cualquier dirección de e-mail, externa o local, utilizada como remitente en wblist)
CREATE TABLE mailaddr (
   id         int unsigned NOT NULL auto_increment,
   priority   int          NOT NULL DEFAULT '7',  -- 0 is low priority
   email      varchar(255) NOT NULL,
   PRIMARY KEY (id),
   KEY email (email)
   );
CREATE UNIQUE INDEX mailaddr_idx_email ON mailaddr(email);
(-- lista blanca y gris por destinatario,
-- coloca en relación wb a destinatario y remitente)
(white or blacklisted sender)
CREATE TABLE wblist (
   rid        int unsigned NOT NULL,     -- recipient: users.id
   sid        int unsigned NOT NULL,     -- sender:    mailaddr.id
   wb         char(1) NOT NULL, -- W or Y / B or N / space=neutral
   PRIMARY KEY (rid,sid)
   );
  
CREATE TABLE policy (
   id               int unsigned NOT NULL auto_increment,
   policy_name      varchar(32),     -- not used by amavisd-new
   virus_lover          char(1),     -- Y/N
   spam_lover           char(1),     -- Y/N  (optional field)
   banned_files_lover   char(1),     -- Y/N  (optional field)
   bad_header_lover     char(1),     -- Y/N  (optional field)
   bypass_virus_checks  char(1),     -- Y/N
   bypass_spam_checks   char(1),     -- Y/N
   bypass_banned_checks char(1),     -- Y/N  (optional field)
   bypass_header_checks char(1),     -- Y/N (optional field)
   spam_modifies_subj   char(1),     -- Y/N (optional field)
   spam_quarantine_to   varchar(64) DEFAULT NULL, -- (optional field)
   spam_tag_level  float,  -- higher score inserts spam info headers
   spam_tag2_level float DEFAULT NULL,  -- higher score inserts
               -- 'declared spam' info header fields 
   spam_kill_level float,  -- higher score activates evasive actions, e.g.
               -- reject/drop, quarantine, ...
               -- (subject to final_spam_destiny setting)
   PRIMARY KEY (id)
  );

Nota: Si tienes inconvenientes utilizando copiar/pegar, quizás tengas que copiar esto en otro lugar y quitarle los caracteres innecesarios.

Nota: Las búsquedas de correo se hacen con las direcciones puras (rfc2821-sin comillas y sin llaves) como claves, por ejemplo: John "Funny" Smith@ejemplo.com.

Nota: Las búsquedas son realizadas en el siguiente orden: SQL, LDAP, hash, ACL, regexp, constant. El primero que devuelva una respuesta definitiva (not undef/NULL) detiene la búsqueda.

Si deseas usar listas blancas y listas negras, entonces debes añadir el remitente y el destinatario a mailadr luego de lo cual defines la relación entre ambas direcciones de correo en wblist e indicas si es lista blanca o lista negra.

Ahora que hemos creado las tablas, insertemos un usuario de prueba y una política de ejemplo:

Listado de Código 9.3: Creando un usuario y política de prueba

INSERT INTO users
   SET
      id         =1,
      priority   =9,
      policy_id  =1,
      email      ="johndoe@example.com",
      fullname   ="John Doe",
      local      ="Y";
INSERT INTO policy
   SET
      id                     =1,
      policy_name            ="Test policy 1",
      virus_lover            ="N",
      spam_lover             ="N",
      banned_files_lover     ="N",
      bad_header_lover       ="N",
      bypass_virus_checks    ="N",
      bypass_spam_checks     ="N",
      bypass_banned_checks   ="N",
      bypass_header_checks   ="N",
      spam_modifies_subj     ="N",
      spam_quarantine_to     =NULL,
      spam_tag_level         =-50.0,
      spam_tag2_level        =7.0,
      spam_kill_level        =10.0;

Nota: Copia esto en algún lugar y ajústalo a tus necesidades.

Nota: local debe estar definido en Y, de otra manera el correo no será revisado en busca de spam.

Esto inserta un usuario y políticas de prueba. Ajusta estos ejemplos para que se ajusten a tus necesidades. Mayor información sobre los items de configuración puede ser encontrada en amavisd.conf.

Configurando amavisd para funcione con MySQL

Ahora que MySQL está listo necesitamos indicarle a amavis que lo utilice:

Listado de Código 9.4: Modificando amavisd.conf

@lookup_sql_dsn =
   ( ['DBI:mysql:maildb:host1', 'mail', 'very_secret_password']  );
(Por claridad descomenta el por defecto)
$sql_select_policy = 'SELECT *,users.id FROM users,policy'.
   ' WHERE (users.policy_id=policy.id) AND (users.email IN (%k))'.
   ' ORDER BY users.priority DESC';
(Si deseas usar listas blancas/negras)
   $sql_select_white_black_list = 'SELECT wb FROM wblist,mailaddr'.
     ' WHERE (wblist.rid=?) AND (wblist.sid=mailaddr.id)'.
     '   AND (mailaddr.email IN (%k))'.
     ' ORDER BY mailaddr.priority DESC';

10.  Configurando Spamassassin para que utilice MySQL

En Spamassassin 3.0 es posible almacenar la información de Bayes y AWL en una base de datos MySQL. Utilizaremos MySQL ya que generalmente puede desempeñarse mejor que otros sistemas de gestión de base de datos. Además, utilizar MySQL para ambos conjuntos de datos facilita bastante la administración. Aquí mostraremos como hacerlo.

Primero empieza creando el nuevo usuario y las tablas necesarias de MySQL.

Listado de Código 10.1: Creando la nueva base de datos y usuario MySQL

# mysql -u root -p mysql
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 78 to server version: 4.0.18-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> create database dbname;
mysql> GRANT INSERT,UPDATE,DELETE,SELECT ON dbname.* TO 'dbuser'@'localhost' IDENTIFIED BY 'another_very_secret_password';
mysql> use dbname;

Ahora que la base de datos ha sido creada, seguiremos con las tablas necesarias. Puedes copiar y pegar lo siguiente al monitor de mysql.

Listado de Código 10.2: Distribución de tablas MySQL

      CREATE TABLE bayes_expire (
          id                    int(11)         NOT NULL default '0',
          runtime               int(11)         NOT NULL default '0',
          KEY bayes_expire_idx1 (id)
          ) TYPE=MyISAM;
      CREATE TABLE bayes_global_vars (
          variable              varchar(30)     NOT NULL default '',
          value                 varchar(200)    NOT NULL default '',
          PRIMARY KEY           (variable)
          ) TYPE=MyISAM;
      INSERT INTO bayes_global_vars VALUES ('VERSION','3');
      CREATE TABLE bayes_seen (
          id                    int(11)         NOT NULL default '0',
          msgid                 varchar(200) binary NOT NULL default '',
          flag                  char(1)         NOT NULL default '',
          PRIMARY KEY           (id,msgid)
          ) TYPE=MyISAM;
      CREATE TABLE bayes_token (
          id                    int(11)         NOT NULL default '0',
          token                 char(5)         NOT NULL default '',
          spam_count            int(11)         NOT NULL default '0',
          ham_count             int(11)         NOT NULL default '0',
          atime                 int(11)         NOT NULL default '0',
          PRIMARY KEY           (id, token)
          INDEX                 (id,atime)
          ) TYPE=MyISAM;
      CREATE TABLE bayes_vars (
          id                    int(11)         NOT NULL AUTO_INCREMENT,
          username              varchar(200)    NOT NULL default '',
          spam_count            int(11)         NOT NULL default '0',
          ham_count             int(11)         NOT NULL default '0',
          token_count           int(11)         NOT NULL default '0',
          last_expire           int(11)         NOT NULL default '0',
          last_atime_delta      int(11)         NOT NULL default '0',
          last_expire_reduce    int(11)         NOT NULL default '0',
          oldest_token_age      int(11)         NOT NULL default '2147483647',
          newest_token_age      int(11)         NOT NULL default '0',
          PRIMARY KEY           (id),
          UNIQUE bayes_vars_idx1 (username)
          ) TYPE=MyISAM;
                        
      CREATE TABLE awl (
          username              varchar(100)    NOT NULL default '',
          email                 varchar(200)    NOT NULL default '',
          ip                    varchar(10)     NOT NULL default '',
          count                 int(11)         default '0',
          totscore              float           default '0',
          PRIMARY KEY           (username,email,ip)
          ) TYPE=MyISAM;

Importante: La línea INSERT es necesaria para que Spamassassin funcione.

Nota: Esto también está disponible en el tarball de código fuente en los archivos awl_mysql.sql y bayes_mysql.sql.

Configurando Spamassassin para que utilice el motor MySQL

Si tienes una vieja base de datos de Bayes en el formato DBM y quieres conservarla sigue las siguientes instrucciones:

Listado de Código 10.3: Transformando información de Bayes desde una base de datos DBM

su - amavis 
sa-learn --sync 
sa-learn --backup > backup.txt 
sa-learn --restore backup.txt 

Nota: Nótese que el último paso debe ser ejecutado sólo luego de que la base de datos MySQL y secrets.cf hayan sido actualizados.

Ahora hay que darle a Spamassassin la información necesaria:

Listado de Código 10.4: Modificando /etc/mail/spamassassin/secrets.cf

(Indica a Spamassissin que use MySQL para los datos bayesianos
bayes_store_module              Mail::SpamAssassin::BayesStore::SQL
bayes_sql_dsn                   DBI:mysql:sa_bayes:localhost:3306
bayes_sql_username              db_name
bayes_sql_password              another_very_secret_password
(Indica a Spamassassin que utilice MySQL para los datos AWL data
auto_whitelist_factory          Mail::SpamAssassin::SQLBasedAddrList
user_awl_dsn                    DBI:mysql:sa_bayes:localhost:3306
user_awl_sql_username           db_name
user_awl_sql_password           another_very_secret_password

Seguidamente, cambia los permisos para tener una adecuada seguridad:

Listado de Código 10.5: Cambiando permisos

  # chmod 400 /etc/mail/spamassassin/secrets.cf

Nota: Para crear un password realmente secreto utiliza emerge app-admin/makepasswd y makepasswd -chars=8.

Ahora, todo lo que tienes que hace es /etc/init.d/amavisd restart.

11.  Solucionando problemas

Amavisd-new

Para solucionar cualquier problema con Amavisd-new empieza deteniendolo con /etc/init.d/amavisd stop e iniciándolo manualmente como proceso activo con amavisd debug y observa cualquier anomalía en la salida.

Spamassassin

Para solucionar problemas en Spamassassin puedes filtran un correo utilizando spamassassin -D < mail. Para asegurarte que las cabeceras están intactas puedes moverlas desde otra máquina con IMAP.

Nota: Si necesitas solucionar algún problema tienes que activar el login del usuario amavis cambiando el shell en /etc/passwd a /bin/bash.

Si deseas, puedes obtener la misma y más información con Amavisd-new utilizando amavisd debug-sa.

Consiguiendo ayude

Si necesitas ayuda, un buen lugar al cual acudir es la lista de correo de amavis-user. Antes de colocar alguna pregunta revisa el archivo de la lista de correo de usuarios Amavis. Si no encuentras ninguna ayuda ahí puedes suscribirte a la Lista de correo de usuarios Amavis.

Si tu pregunta es específica de SpamAssassin, DCC, Razo o Postfix, dirígete a sus respectivas páginas listadas a continuación.

12.  Fuentes

Para mayor información

Fuentes en general

Otros como



Imprimir

Actualizado 2 de agosto, 2007

Sumario: Esta es una guía paso a paso para la instalación de tecnologías anti-spam con Postfix. Entre ellas Amavisd-new con Spamassassin y ClamAV, listas grises y SPF.

Sune Kloppenborg Jeppesen
Autor

Jens Hilligsø
Contributor

Joshua Saddler
Editor

José Alberto Suárez López
Editor Es

John Christian Stoddart
Editor Es

José Luis Rivero
Editor Es

Rodrigo Lazo Paz
Traductor

Donate to support our development efforts.

Support OSL
Gentoo Centric Hosting: vr.org
Tek Alchemy
SevenL.net
Global Netoptex Inc.
Bytemark
Online Kredit Index
Copyright 2001-2009 Gentoo Foundation, Inc. Questions, Comments? Contact us.