oeee oe oeee Linux mola y es mazo fácil

Guías rápidas de sistemas - Pello Xabier Altadill Izura - Número 004
pello@pello.info
  ANTI-SPAM  

Ver:

www.procmail.org



O de como evitar que nos llegue spam y que nuestro servidor linux lo filtre correctamente con procmail.

A estas alturas de milenio esta claro que el spam es una de las nuevas plagas que nos asolan, y aproximadamente la mitad del correo que circula por internet es correo no solicitado, correo basura. Todos los días necesitamos dedicar tiempo en exclusiva para limpiar la bandeja de basura, y si caculamos lo que supone al año nos sale una cantidad de tiempo considerable; algo que en las empresas se traduce en pasta.

* ¿Cómo evitar que el spam entre en mi buzón?
Primero vamos a distinguir: no nos referimos a que hagan spam a traves de nuestro servidor (por un relay abierto) sino a evitar que nos llegue correo basura. Lo primero ya se trato en la quía relativa a sendmail. Lo segundo es mas complicado ya que nuestra dirección de correo circula por ahí sin remedio ya que es probable que aparezca mencionada en algún lado o que algún amigo nos haya incluído en una carta en cadena.

Existen infinidad de formulas para filtrar el correo en nuestro cliente de email, pero vamos a tratar que el filtro se haga en el servidor y que el spam no pueda ni oler nuestro buzon. Para ello presentamos: procmail

En cualquier distribución que tenga sendmail tendremos el procmail disponible y accesible desde sendmail. Procmail procesa el correo local y puede se invoca desde sendmail o incluso desde otros MTAs como qmail. Dentro de cada directorio HOME de los usuarios podemos meter un fichero oculto llamado .procmailrc con un script de procmail para que filtre el correo. Si queremos aplicar un mismo filtro a todos los usuarios, podríamos poner ese mismo fichero en /etc/procmailrc.

* ¿Cómo hago un script de procmail?

Bueno, los scripts de procmail son de lo mas ofuscado que te puedes echar a la cara y el lenguaje no es nada claro. Es una mezcla de reglas e invocaciones a programas de sistema (grep, egrep), redirecciones, etc... Es complejo pero por contra permite hacer practicamente cualquier manipulación que se nos ocurra con el correo: redirecciones, respuestas automaticas, filtrar por contenido, etc... cualquier cosa que se nos ocurra.

Al ser bastante complejo de utilizar vamos a limitarnos a mostrar algunos ejemplos de filtrado con procmail. Lo ideal es ir desarrollando uno dependiendo de las necesidades de cada uno. Los ejemplos son muy muy simples, pero se pueden combinar para conseguir formulas mas potentes.

conjuro #1: Chequeo de FROM
#Preliminaries
SHELL=/bin/bash # Especificamos el shell
MAILDIR=/var/spool/mail/miusuario #Especificamos el fichero de nuestro buzon

LOGFILE=/home/miusuario/procmail.log # Guardamos un log
LOG="--- Log de ${LOGFILE} para ${LOGNAME}, "

# Sean cuales sean las reglas el orden en que las pongamos es significativo
# Con esta regla mandamos al augero negro todo lo que venga desde scam@cyberspam.com
:0
* ^From: scam@cyberspam\.com
/dev/null

# El resto lo mandamos a nuestro buzon
:0:
${DEFAULT}


conjuro #2: Chequeo de BODY
:0 B:
* mypassword
password

# esto chequea el body buscando la palabra "mypassword"
# y si la encuentra mete el correo en un fichero llamado password

# para hacerlo case-sensitive:
:0 BD:
* mypassword
password


conjuro #3: Chequeo de una lista en un fichero aparte
SHELL=/bin/bash # Especificamos el shell
MAILDIR=/var/spool/mail/miusuario #Especificamos el fichero de nuestro buzon

LOGFILE=/home/miusuario/procmail.log # Guardamos un log
LOG="--- Log de ${LOGFILE} para ${LOGNAME}, "

# Otras reglas...


# Comprueba si quien envia esta en nuestra lista negra (fichero black.lst)
:0
* ? formail -x"From" -x"From:" -x"Sender:" \
-x"Reply-To:" -x"Return-Path:" -x"To:" \
| egrep -is -f black.lst
/dev/null



conjuro #4: Chequeo de body en un fichero aparte
SHELL=/bin/bash # Especificamos el shell
MAILDIR=/var/spool/mail/miusuario #Especificamos el fichero de nuestro buzon

LOGFILE=/home/miusuario/procmail.log # Guardamos un log
LOG="--- Log de ${LOGFILE} para ${LOGNAME}, "


# Esta compruba el contenido del body y busca alguna de las palabras
# prohibidas que se encuentran en una lista
:0 B:
* ? egrep -is -f /etc/mail/spamtext.blacklist
/dev/null


# El resto lo mandamos a nuestro buzon
:0:
${DEFAULT}

 



conjuro #5: Chequeo de subject.
SHELL=/bin/bash # Especificamos el shell
MAILDIR=/var/spool/mail/miusuario #Especificamos el fichero de nuestro buzon

LOGFILE=/home/miusuario/procmail.log # Guardamos un log
LOG="--- Log de ${LOGFILE} para ${LOGNAME}, "


# Esta compruba el contenido del body y busca alguna de las palabras
# prohibidas que se encuentran en una lista
:0:
#Los caracteres [] encierran la palabra ADV, una etiqueta que indica publicidad
# Los que coincidan se mandan al fichero buzonbasura.mail

* ^Subject:.*([ \{<]+)ADV([ :\}>]+|$) |\
^Subject:.*(\[+)ADV(:)?(\]+|$)
buzonbasura.mail


# El resto lo mandamos a nuestro buzon
:0:
${DEFAULT}

 


 

* Vale, es un rollo dame una solución completa y facilmente administrable.

Bien, aqui muestro un script de procmail más completo que hace lo siguiente: primero compruba si el email viene de dominios de confianza (lista blanca), y en ese caso lo deja pasar. Luego comprueba el subject y el contenido del body. En caso de encontrar spam no lo borra sino que guarda el correo en un buzon especial. Puede servir si el script la caga.

conjuro #6: Conjuro de la creación :)
#Preliminaries
SHELL=/bin/bash #Use the Bourne shell (check your path!)
MAILDIR=/var/spool/mail #First check what your mail directory is!
LOGFILE=/home/miusuario/procmail.log
LOG="--- Log de ${LOGFILE} para ${LOGNAME}, "

# Test para comprobar al dominio de origen
# y comparar con la lista blanca para ser aceptado.
:0
* ? formail -x"From" -x"From:" -x"Reply-To:" -x"Errors-To:"\
| egrep -is -f /etc/mail/whitelist
${DEFAULT}


# Test para comprobar el contenido del email
# este comprueba si en el subject existe alguna de las palabras prohibidas
:0
* ^Subject:.*(enlargement) |\
^Subject:.*(penis) |\
^Subject:.*(hot) |\
^Subject:.*(mortage) |\
^Subject:.*(viagra) |\
^Subject:.*(free) |\
^Subject:.*(hair growth) |\
^Subject:.*(money) |\
^Subject:.*(sexual) |\
^Subject:.*(enlarge)
/var/spool/mail/posible.spam


# Test para comprobar el contenido del email
# este comprueba si en el body existe alguna de las palabras prohibidas
:0 B
* ? egrep -is -f /etc/mail/spamtext.blacklist
/var/spool/mail/posible.spam

# Y el resto lo aceptamos...
:0:
${DEFAULT}

 


Con esa receta basta con mantener las listas de palabras y dominios de white list. Una posible lista de palabras.

Hay que tener mucho cuidado con las listas de palabras: se puede utilizar toda la potencia de las expresiones regulares, pero si utilizamos palabras muy genericas o con muchos caracteres comodín (*,+,.) puede que filtremos correo incorrectamente. Puede ocurrir por ejemplo que se filtren correos que no se debieran filtrar porque los atachments vienen codificados y en ese batiburrillo puede darse el caso de encontrar una palabra de la lista por pura coincidencia. Por ejemplo xxx.

 

Sobre procmail no existe mucha documentacion buena, hay un libro de Orielly que seguramente estará muy bien, aunque habría que destacar esta web: http://www.uwasa.fi/~ts/info/proctips.html en la que un tal Timo nos muestra como solucionar problemas concretos con "recetas" de procmail. Sería una especie de "Procmail cookbook" muy muy recomendable. El problema de procmail es que no tiene una guía de programación clara.

Cabe resaltar que muchas soluciones anti-spam bayessianas funcionan en conjunción con procmail. Esas soluciones son mucho mas potentes que utilizar el procmail a secas; aunque como se ha dicho, procmail puede servir para muchas cosas.


Hasta otra.

 
© 2003 - Pello Xabier Altadill Izura - www.pello.info