Publica tu how-to

Dinos como hacer lo que sabes hacer, mándanos un email a wdonet@gmail.com y lo publicamos (dos días máximo) o si te interesa unirte al equipo de redactores, también háznoslo saber por correo.

Servidor de correos personal con postfix - Spambayes

Éste es el último post de 'Servidor de correos personal con postfix'. Ya configurado el mismo (MTA, MDA, MUA) y recuperando automáticamente correos con Fetchmail, sólo queda velar por la seguridad del servidor...

Se llama spam o correo basura a los mensajes no solicitados, no deseados o de remitente desconocido, habitualmente de tipo publicitario, enviados en grandes cantidades (incluso masivas) que perjudican de alguna o varias maneras al receptor.

El spam se puede convertir en una incidencia de seguridad por varias razones:
  • ocupa espacio en las bandejas de entrada de los receptores. En los casos de cuentas con tamaño limitado esto es un problema.
  • en sistemas vulnerables, el spam suele llegar también acompañado de scripts perniciosos, a ejecutar en el sistema receptor, o un link engañoso para infectar la máquina cliente.
  • también puede incluir información engañosa con la cual realizar un robo de información confidencial, engañando al usuario incauto
Claro está, la mejor política de seguridad en estos casos es ser prudente y no dar click y descargar todo lo que llegue a la bandeja de entrada del correo.

Sin embargo, los servidores de correo también cuentan con protección extra ante esta problemática. En nuestro caso, vamos a configurar Spambayes como detector de spam. Existen muchos otros programas que realizan funciones similares, el más famoso es Spamassasin. Sin embargo en este tutorial nos enfocaremos en Spambayes.



Instalación
Spambayes se puede descargar desde su sitio oficial, o puede instalarse con la distribución. En Debian el paquete se llama spambayes.



Configuración

Spambayes es una serie de scripts en Python que utilizan algoritmos de probabilidad para clasificar el correo, si es spam (correo no deseado), ham (correo seguro) o inseguro (no se sabe si es o no spam). Debe entrenarse constantemente la red bayesiana en la que se basa el software para refinar cada vez más su comportamiento.

En la sección del MDA (Procmail) ya creamos los subdirectorios necesarios para que funcione Spambayes, así que continuaremos con la configuración. Como parte de la configuración, es necesario configurar Spambayes, pero también Procmail para que sepa dónde colocar los correos identificados, y además mutt para agregar unas cuantas utilidades que pueden servir para tratar con los distintos tipos de mensajes.

1) Spambayes
  • El subdirectorio ~/Mail contendrá nuestro correo seguro.
  • El subdirectorio ~/.CaughtSpam contendrá el correo que Procmail defina como Spam de acuerdo a lo que Spambayes le indique.
  • El subdirectorio ~/.Unsure contendrá correo que Spambayes no sepa clasificar.
  • Para propósitos de entrenamiento, en ~/Mail/.MissedHam y ~/Mail/.MissedSpam iremos colocando correos que lleguen a las bandejas equivocadas, de forma que a la siguiente ronda de entrenamiento de Spambayes, sepa en adelante como clasificar dichos correos.

El script de entrenamiento es el siguiente: ~/Mail/train_spambayes

#!/bin/sh
# Script to copy mail missed spam and ham into correct folders
# and run sb_mboxtrain.py to train spambayes
# Training will be done only on missed spam and ham

# Files we saved or bounced may be in the new directory
# We want them in cur for training
mv /home/usuario/Mail/.MissedSpam/new/* \
 /home/usuario/Mail/.MissedSpam/cur 2>/dev/null
mv /home/usuario/Mail/.MissedHam/new/* \
 /home/usuario/Mail/.MissedHam/cur 2>/dev/null
/usr/bin/sb_mboxtrain.py -d /home/usuario/.hammie.db \
 -g /home/usuario/Mail/.MissedHam \
 -s /home/usuario/Mail/.MissedSpam
Obviamente, hay que editarlo según la cuenta de usuario y directorios usados en el servidor. Este script debe ser ejecutable:
$ chmod +x ~/Mail/train_spambayes
Además hay que crear la base de datos en donde Spambayes se entrenará:
$ /usr/bin/sb_filter.py -d $HOME/.hammie.db -n
lo cual creará el archivo .hammie.db

Por último, será útil que el servidor se dedique automáticamente a entrenar la red bayesiana cada cierto tiempo sin intervención del usuario, para lo que creamos un cronjob con
$ crontab -e
y colocamos el cronjob:
21 3 * * * ~/Mail/train_spambayes
que entrenará a las 3:21am de todos los días.

2) Procmail
Ahora hay que decirle a Procmail que, dependiendo lo que diga la base de datos con la red bayesiana entrenada, clasifique los correos entrantes en los subdirectorios que creamos previamente. Editar .procmailrc para que quede así (editarlo para que coincida con los directorios y usuario en el servidor):

SHELL=/bin/sh
MAILDIR=$HOME/Mail
DEFAULT=$HOME/Mail/
CAUGHT_SPAM=$MAILDIR/.CaughtSpam/
UNSURE=$MAILDIR/.Unsure/
  
#Spambayes process
:0fw:hamlock
| /usr/bin/sb_filter.py -d /home/usuario/.hammie.db

:0
* ^X-Spambayes-Classification: spam
${CAUGHT_SPAM}

:0
* ^X-Spambayes-Classification: unsure
${UNSURE}

# Catches everything else.
# Anything left over goes into the DEFAULT folder
:0:
${DEFAULT}
Lo que hicimos fue decirle a Procmail que con el script sb_filter.py clasifique el correo, y lo mande a los directorios de CaughtSpam, Unsure o el Default (~/Mail).

3) mutt
Por último, si observamos la bandeja de entrada con mutt, es probable que encontremos correo que deseemos clasificar como Spam. La opción manual sería mover manualmente estos correos a los directorios creados, a través de los comandos de mutt.

Sin embargo, esto no es funcional, por lo que editaremos el archivo .muttrc para agregar un poco de automatización que facilite este proceso.Editarlo para que quede así:
set editor="emacs"
set folder = /home/usuario/Mail
set signature="~/.signature"
my_hdr From: Nombre Usuario
# Don't ask to move read message
set move=no

# Header control   h displays header when in pager
# I want to only see the unignored by default
ignore *                                        # weed out all headers
unignored date from: to cc subject organization  # now show me these...

# Setting these macros is going to save us all of that time I was
#  talking about.  Now instead of having to type all of those
#  characters to move the mail around we will can just tag the messages
#  and, for the instance of spam in your inbox, hit 'S'.
  
# Move mail to correct directories
macro   index   S       ";s~/Mail/.MissedSpam\r\r$\r"
macro   pager   S       ";s~/Mail/.MissedSpam\r\r$\r"
macro   index   H       ";C~/Mail/.MissedHam\r\r;s~/Mail\r\r$\r"
macro   pager   H       ";C~/Mail/.MissedHam\r\r;s~/Mail\r\r$\r"
macro   index   M       ";s~/Mail/\r"
macro   pager   M       ";s~/Mail/\r"

# This is how we are going to move around to the different
#  mailboxes.  Hitting 'alt-1' will take us to our inbox
#  'alt-2' and we are looking at the mail Spambayes classified
#  as spam.  etc.
#  The extra mailboxes I have in here are for mailing lists I am on.
#  I will show the procmail recipe that automatically puts
#  the mailing list mail into its correct mailbox further down.
  
# Move to mailboxes quickly
macro   index   1  "c~/Maildir\r"
macro   pager   1  "c~/Maildir\r"
macro   index   2  "c~/Maildir/.CaughtSpam\r"
macro   pager   2  "c~/Maildir/.CaughtSpam\r"
macro   index   3  "c~/Maildir/.Unsure\r"
macro   pager   3  "c~/Maildir/.Unsure\r"

# Training Maildirs for Spam and Ham
macro   index   8  "c~/Maildir/.MissedSpam\r"
macro   pager   8  "c~/Maildir/.MissedSpam\r"
macro   index   9  "c~/Maildir/.MissedHam\r"
macro   pager   9  "c~/Maildir/.MissedHam\r"

# Setting these colors makes it easy to tell which emails
#  Spambayes has missed.
# Turn spam red and unsure green
color index red default "~h '^X-Spambayes-Classification: spam'"
color index green default "~h '^X-Spambayes-Classification: unsure'"
# Turn gmail mail brightblue
#  (My regular expression is not correct here.  I think that it
#   is looking anywhere in the header for my gmail address
#   instead of what I wanted..  Just in the 'To:'.
#   It still works for the most part)
color index brightblue default "~h '(^)*my_name@gmail.com'

# Lets set more colors to make things look beautiful.  Judging by
#  my title for this section I must have had bad feelings towards
#  colors when I added this.
#Color crap
color index brightwhite default ~N       # color for new messages
color status black yellow
color attachment brightyellow default    # file attachments
color search brightred default           # search matches
color quoted brightyellow default        # quoted text in replies
color quoted1 magenta default            # quoted text in replies
color body cyan default "((ftp|http|https)://|news:)[^ >)\"\t]+"   # URLs
color body cyan default "[-a-z_0-9.+]+@[-a-z_0-9.]+"               # email
Con esto conseguimos que mutt nos proporcione lo siguiente:
  • Si estamos ante un mensaje que debió clasificarse como Spam y no lo fue (en la bandeja de entrada o en Unsure), tecleando 'S' se mueve a los directorios correctos (CaughtSpam y MissedSpam) en espera del siguiente entrenamiento.
  • Si estamos ante un mensaje que debió clasificarse como Ham y no lo fue (en la bandeja de Spam o en Unsure), tecleando 'H' se mueve a los directorios correcots (bandeja de entrada y MissedHam) en espera del siguiente entrenamiento.
  • Podemos seleccionar varios mensajes a la vez con el comando 't'.
  • Esc + 1 nos lleva directamente a la bandeja de entrada.
  • Esc + 2 al spam
  • Esc + 3 a Unsure
  • Esc + 8 a MissedSpam
  • Esc + 9 a MissedHam
  • Además, dependiendo el tipo de correo, mutt utilizará colores (si la consola los soporta) para mostrar los distintos tipos de mensajes.
Spambayes es una herramienta bastante poderosa, que también permite entrenar para clasificar correos con base en otros criterios, por ejemplo si estuviéramos suscritos a un mailing list, colocar los correos de dicha lista de correos en un directorio particular; o si recibiéramos correos de ofertas de trabajo para colocar todos ellos en otro subdirectorio, etc.






Notas Finales
Con esto damos por terminado el tutorial para levantar un servidor de correos personal utilizando Postfix.


Aún quedan detalles por afinar, que podrían investigarse. Si algún día tengo el tiempo, tal vez haga tutoriales para los mismos:
  • Levantar un servidor de correos que pueda usar en una organización, a través de una LAN o internet, es cuestión que debe configurarse en Postfix. La documentación del sitio oficial de este programa ofrece varios escenarios para lograr distintas configuraciones deseadas.
  • Levantar servidores POP e IMAP, con Courier por ejemplo, para poder leer los correos que lleguen a la cuenta en el servidor a través de internet, con Squirrelmail, con un dispositivo móvil, con un cliente convencional en otra máquina, o con Fetchmail en otra máquina cliente.
  • Ampliar el funcionamiento de Spambayes para que clasifique correos con base en criterios como el uso de mailing lists o aquellos que pertenezcan a mis búsquedas de empleo, por ejemplo.


Espero hayas disfrutado siguiendo este tutorial, como yo haciéndolo. Y sobre todo, levantando tu propio servidor de correos. A mi me llevó meses enterarme bien de cómo funciona todo esto, y lograr que funcionara correctamente. Ojalá esta pequeña guía sirva de ayuda para el que se aventure en un camino similar...

8 comentarios:

  1. Excelente tutorial incluso para un usuario inexperto como yo.
    Pero me he encontrado que no consigo que los mensajes se almacenen en el servidor (Carpeta Sent del cliente de correo Evolution). Se almacenan en Correo enviado (local).
    Mi objetivo es centralizar la copia de seguridad de 4 correos en el servidor, tanto los recibidos como los enviados.
    De antemano agradezco tus comentarios.

    ResponderEliminar
  2. mmmm me suena a que la situacion que enfrentas es particular del cliente Evolution en sí.

    Ten en cuenta que al usar un cliente de correo (MUA), este puede tener sus propias particularidades de configuracion. En este post yo solo me enfoque en mutt por ser sencillo de configurar, pero es modo texto. Hay que ver si es posible configurar Evolution para esto mismo. Ademas algunos clientes no permiten conectarse directamente al servidor como mutt, sino que debes tener IMAP o POP levantados en el servidor, lo cual ya hace diferente la cuestion de las carpetas que en si postfix utiliza para almacenar correos en el disco...

    ResponderEliminar
  3. Yo es que uso gmail por IMAP y he observado que al enviar (tanto con Thunderbird como con Evolution) deja una copia de los enviados en una carpeta Enviados en el servidor.

    Me gustaría que la solución no fuera usuario dependiente, es decir, que no dependiera de la configuración del lector de correo. Y así asegurar que disponemos de copia de todos los correos enviados.

    ResponderEliminar
  4. eso, definitivamente, cae fuera de los objetivos del post: estamos configurando un servidor de correo, es decir toda la infraestructura del sistema, desde cero. La situacion que planteas esta relacionada con tus configuraciones del MUA asi como de Gmail, que funge como el 'postfix' que nosotros configuramos aqui

    ResponderEliminar
  5. Bueno, de todas formas muchas gracias por tu excelente tutorial.

    Seguiré buscando a ver si consigo encontrar lo que pretendo (si es posible).

    ResponderEliminar
  6. una nota mas.
    El formato en que estamos configurando el correo electronico para que se almacene en archivos independientes dentro de subdirectorios independientes, en lugar de todo sobre un archivo (mail) se conoce como

    maildir (http://es.wikipedia.org/wiki/Maildir) , el cual es soportado por otros clientes demas de mutt. El articulo en wikipedia menciona algunos, y el articulo en ingles tiene mas aun...


    saludos

    ResponderEliminar
    Respuestas
    1. Gracias por el tutorial. Estaba pensando en utilizar mutt para descargar mis mensajes automaticamente. Si entendi bien por lo que he ido leyendo, para guardar un mensaje hay que pulsar la tecla "s". ¿Crees que seria posible que mutt guardase mis mensajes automaticamente, sin necesidad de que yo pulse nada, es decir, que compruebe nuevos mensajes y descargue directamente a formato maildir?

      Eliminar
    2. en realidad mutt no te permite descargar nada, mutt solo es un cliente , el mua. Quien descarga los correos en este caso es fetchmail, que es un cliente de los protocolos IMAP o POP (dependiendo tu servicio de correo). Lo que quieres de guardarlos automaticamente se hace ya desde que configuras el MTA (Postfix en este caso) usando algun MDA como procmail (que es el que uso en estos ejemplos).

      De nuevo, mutt solo va a leer lo que ya tengas en tu maildir, nada mas, no va a obtener ningun correo ni guardarlo en ningun lado.

      Claro, ya con mutt puedes hacer lo que sea y guardarlos tu mismo en otros lados.

      Lo que quieres se hace con el MTA en automatico, o con procmail para mas personalizacion...

      Eliminar

Que opinas sobre esta publicación?