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.
|