postfix+spamassassin+razor

TÍTULO:		postfix+spamassassin+razor
VERSIÓN LFS:	Todas
AUTOR:		Gerard Beekmans <gerard@linuxfromscratch.org>
TRADUCTOR:	Proyecto LFS-ES

SINOPSIS:
	Spamassassing y Razor son unas maravillosas herramientas contra 
el correo no solicitado (spam). Para hacer bien las cosas, lo mejor es 
integrar estas herramientas en tu servidor SMTP para bloquear el correo 
no deseado a este nivel, en vez de hacerlo al nivel del usuario con 
procmail.

RECETA:

Versión 1.1 - 5 de abril de 2002

Historial de modificaciones:
1.1		- añadido el parche para el error del fichero
		/usr/lib/perl5/site_perl/5.6.1/Mail/SpamAssassin/PerMsgStatus.pm

La razón principal para establecer un filtrado al nivel del SMTP en 
linuxfromscratch.org es evitar que el correo no solicitado (spam) llegue 
a las listas de correo. El correo no solicitado es enviado a Listar (no 
lo envío directamente a /dev/null), pero marcándolo con unas cabeceras 
especiales. Listar comprueba esas cabeceras y me envía esos mensajes 
para que pueda revisarlos. Esta revisión la hago por si los mensajes 
se han marcado como correo no solicitado erróneamente.

Esta receta no se encarga de explicar cómo se instalan los programas
Spamassassin o Razor. Tan sólo te indico donde encontrarlos:

Spamassassin:	http://www.spamassassin.org
Razor:		http://razor.sourceforge.net

En el momento de escribir esta receta la versión actual de Razor era la 
1.20. Sin embargo existe un problema entre Spamassassin y Razor 1.20. 
Así que recomiendo que obtengas la versión Razor-1.19, o quizás quieras 
intentarlo con la versión CVS del Spamassassin (existe un error en 
Razor-1.19 que se produce en el entorno de trabajo añadido a 
Spamassassin. Este error se corrigió en Razor-1.20 lo cual rompe el
entorno de trabajo de spamassassin. La versión del CVS de spamassassin
se ha actualizado, pero aún no se ha liberado ninguna versión oficial).

Léete la documentación e instálalo. Es bastante sencillo. Sólo he tenido 
que pelearme con la configuración para que trabaje con Postfix.

Si instalas Spamassassin-2.11 necesitas arreglar el error del fichero 
/usr/lib/perl5/site_perl/5.6.1/Mail/SpamAssassin/PerMsgStatus.pm.
En él existe un pequeño error que hace que Razor realice mal la 
comprobación en la mayoría de los casos (se olvida de añadir una nueva 
línea entre la cabecera y el cuerpo del mensaje lo que hace que Razor no
siempre compruebe la SHA verdadera).

Edita el fichero, ve a la línea 443 que será como esto:

	return join ("", $self->{msg}->get_all_headers(),

Añade "\n", de manera que quede así la línea:

	return join ("", $self->{msg}->get_all_headers(), "\n",

Vamos a continuar con la configuración de postfix. La distribución de 
postfix viene con el fichero README_FILES/FILTER_README que querrás 
leer. Este fichero contiene información de cómo trabaja el filtrado
en Postfix que vamos a usar.

En FILTER_README se sugiere la creación de un usuario dedicado al 
filtrado sin directorio principal (home) o interprete de comandos 
(shell). Esto no nos sirve porque spamassassin y razor necesitan un directorio
principal (home) para trabajar. Quizás esto se pueda cambiar, pero no lo 
he comprobado todavía. Seguramente existen opciones para la línea de 
comando que te permitan utilizar ficheros de configuración alternativos 
(se que Spamassasin lo permite, pero no tengo claro que de esta manera
se invoque a Razor con un fichero de configuración alternativo).

He creado el usuario 'postfixfilter' ejecutando:

	groupadd -g 612 postfixfilter &&
	useradd -u 612 -g 612 -m postfixfilter

Hay que crear el guión de filtrado que postfix ejecutará por cada 
mensaje que llegue:

cat /home/postfixfilter/postfixfilter << "EOF"
#!/bin/bash

/usr/bin/spamassassin -P | /usr/sbin/sendmail -i "$@"

exit $?
EOF

Utiliza chown y chmod si no has creado este archivo como usuario 
postfixfilter, si no como administrador (root) u otro.

¿Que hace esto? Postfix vuelca un mensaje a /usr/bin/postfixfilter. Lo 
interceptamos y lo volcamos a spamassassin. Le hemos dicho a 
spamassassin que lo escriba por la salida estándar (la opción -P) y 
mediante una tubería lo enviamos a la entrada estándar de sendmail para 
reinsertarlo en postfix y que continúe su envío. Una vez hecho esto 
termina sea cual sea el valor de retorno de sendmail.

Lo siguiente es configurar postfix para que haga el filtrado.

Edita el fichero /etc/postfix/master.cf (o donde hayas colocado tus 
ficheros de configuración). Encuentra la siguiente línea:

	smtp      inet  n       -       n       -       -       smtpd

Puede que sea un poco diferente, pero esta es la que se encuentra por 
omisión. Esta línea es la que le indica a postfix que lea el correo de 
entrada por el puerto smtp (25) y que el demonio smtpd se encargue de 
él. Esto es lo que queremos modificar para realizar el filtrado antes 
de el envío. Directamente debajo de esta línea añade esta otra:

	-o content_filter=postfixfilter:

Es bueno que pongas sangría con un tabulador o espacios para que sea 
fácil de ver que pertenece a la línea anterior. No olvides los dos puntos
al final de postfixfilter. No estoy muy seguro de lo que hace, pero el 
FILTER_README lo advierte, por lo tanto yo también lo hago. Aun tengo
que comprenderlo.

Añade al final del fichero master.cf la siguientes líneas:

postfixfilter unix - n n - - pipe
        flags=Rq user=postfixfilter argv=/home/postfixfilter/postfixfilter -f ${sender} -- ${recipient}


Bueno, si has hecho todo lo que te he dicho, y no se me ha olvidado
decirte nada, ya está todo configurado. Recarga el postfix ejecutando:

	postfix reload

El correo de entrada será filtrado por spamassassin en busca de correo 
no solicitado (spam). Puedes configurar spamassassin y razor mediante
los ficheros de configuración de /home/postfixfilter.

Desmentido: He escrito esta receta después de configurar 
linuxfromscratch.org. Algunas cosas están distintas y no he usado el 
comando groupadd/useradd, ni /home/postfixfilter. Lo que he escrito 
aquí parece mas acertado (pensé en ello tras configurar 
linuxfromscratch.org, así que lo cambiare algún día). No se si he 
escrito todo correctamente porque no he probado todo paso a paso. Puede
que haya olvidado algunos pasos.