Construyendo un Anti-SPAM Gateway. Parte 3 (SPF)
En nuestra segunda entrega se proporcionaban ciertos parámetros como buenas prácticas para mejorar el rendimiento y seguridad de nuestro Anti-SPAM Gateway. En esta nueva entrega vamos a mostrar como identificar los servidores SMTP válidos para nuestro dominio en Internet, además de detectar si los correos recibidos de un dominio vienen de un servidor SMTP válido.
Para esta funcionalidad vamos a usar SPF (Sender Policy Framework), que integraremos a nuestro Postfix para conseguir el objetivo buscado.
Hemos de diferenciar SPF desde dos puntos de vista, proteger nuestro dominio para poder ser usado con SPF y protegernos de dominios falsos gracias a SPF. Explicándolo de un modo más sencillo, tenemos que registrar nuestro MX del dominio con una IP válida en los DNS (como si se tratase de una guía de teléfonos con el nombre de una persona y su teléfono) y para protegernos de los dominios falsos tenemos que tener un complemento que nos permita consultar esa "guía".
Partimos de que ya tenemos nuestro servidor montado y funcionando como se ha explicado en los artículos anteriores. Los pasos que vamos a seguir durante este artículo son los siguientes:
- Configurar SPF en nuestro DNS.
- Configurar SPF en Postfix.
- Instalar componentes requeridos.
- Descargar SPF.
- Instalar SPF.
- Configurar SPF.
- Probar SPF.
Configurar SPF en nuestro DNS
SPF se apoya en nuestro DNS, es decir, se declara con un registro del tipo TXT. La sintaxis de este registro la vamos a explicar a continuación.
Existen cuatro calificadores que se usan en la sintaxis, "+" Pass, "-" Fail, "~" SoftFail y "?" Neutral.
- "+" Pass --> El registro SPF designa que ese host tiene permiso para enviar. Este calificador es el usado de forma predeterminado si no se declara ninguno. Acción mostrada --> accept.
- "-" Fail --> El registro SPF ha designado que ese host no tiene permiso para enviar. Acción mostrada --> reject.
- "~" SoftFail --> El registro SPF ha designado que ese host no tiene permiso para enviar pero lo deja pasar. Acción mostrada --> accept but mark.
- "?" Neutral --> El registro SPF especifica que nada puede decirse sobre su validez. Acción mostrada --> accept.
Si una sintaxis resulta coincidente, su calificador se usa. Como hemos dicho de modo predeterminado el calificador es "+" Pass. Por ejemplo:
"v=spf1 -all"
"v=spf1 a -all"
"v=spf1 a mx -all"
"v=spf1 +a +mx -all"
Las sintaxis son evaluadas en orden, si no existen coincidencias el resultado es "Neutral". Si el dominio no dispone de un registro SPF el resultado es "None", por lo que su acción es accept.
El mecanismo "all" siempre coincide. Normalmente es usado siempre al final de la sintaxis. A continuación mostramos unos ejemplos:
"v=spf1 mx -all" Permite todos los registros MX del dominio a enviar email y todos los demás se rechazan.
"v=spf1 -all" Se rechazan todos los envíos.
"v=spf1 +all" Se aceptan todos los envíos, no usar nunca o hacerlo con cuidado.
El mecanismo "ip4" se refiere a una dirección de red, si no se establece una máscara se entiende que es /32 (un equipo individual). A continuación unos ejemplos de su uso:
"v=spf1 ip4:192.168.0.1/16 -all" Permite el envío desde cualquier IP entre 192.168.0.1 y 192.168.255.255.
Existen otros mecanismos como "mx", "a", "ptr", .... Puedes encontrar más información sobre las sintaxis en la web de openspf.
Vamos a mostrar un ejemplo real con el dominio e2h.net. Para esta prueba vamos a usar nslookup, consultando el registro TXT declarado. Ejecutamos los siguientes comandos bien en Windows o Linux.
nslookup
set type=txt
e2h.net
Podemos ver en este ejemplo que se aceptan envíos desde cualquier registro declarado en nuestro DNS como A, MX y desde la dirección IP 94.23.229.13; todo lo demás es rechazado.
En definitiva, todo esto nos sirve para ayudar a servidores de correos que disponen de consulta SPF informarles quien tiene permiso a realizar envíos EN NUESTRO NOMBRE (dominio). El servidor realizará una consulta SPF, comprobará que desde el dominio e2h.net sólo tienen derecho a enviar los registros A, MX y la IP mostrada, si resulta que están enviando desde cualquier otro sitio que no está declarado, el servidor de correo lo rechazará.
Es aconsejable no usar "-all", ya que no es totalmente funcional cuando por medio existen reenviadores a nivel de buzón o servidores MX de respaldo. Si enviamos un correo a un usuario y este tiene hecha una redirección a otro buzón y tiene activado SPF dará como envío no permitido, ya que aparece como remitente la IP desde el servidor que se reenvía asociado al dominio registrado con SPF. Lo mismo ocurre con un servidor MX de backup, cuando este devuelva todos los correos al primario aparecerá su IP como el remitente, asociada al dominio registrado con SPF.
Por lo tanto, su mejor uso es con "~all". Nos avisará, dejando pasar el correo y con otros mecanismos como Spamassassin ya controlaremos si es válido o no.
Configurar SPF en Postfix
Una vez registrado nuestro SPF y permitiendo así que servidores de correos puedan comprobar la autenticidad de nuestro dominio en los envíos recibidos, ahora le toca el turno a nuestro servidor. Vamos a preparar nuestro Postfix para que él también pueda consultar si los correos que reciben son legítimos gracias a los registros SPF que deberán haber declarado los dominios desde los cuales recibimos correo.
Instalar componentes requeridos
El primer paso es preparar nuestro servidor para que pueda ser instalado SPF. Para ello necesitamos instalar el componente Mail::SPF. Como root ejecutamos los siguientes comandos:
perl -MCPAN -e shell
Yes (si es la primera vez que ejecutamos CPAN)
install Mail::SPF (responder a todas las preguntas que nos haga con yes o y)
Cuando se muestre las siguientes líneas el proceso habrá terminado
JMEHNLE/mail-spf/Mail-SPF-v2.007.tar.gz
./Build install -- OK
quit
Descargar SPF
Existen dos aplicaciones para realizar las comprobaciones SPF, una escrita en Perl (para servidores sin altas exigencias) y otra en Python (para servidores con altas exigencias). A nosotros nos vale con el escrito en Perl, en su página web copiamos el enlace para posteriormente descargarlo en nuestro servidor.
Una vez hemos copiado el enlace del fichero ejecutamos los siguientes comandos como root en nuestro servidor:
cd /usr/local/src
Instalar SPF
Una vez hemos descargado el paquete, lo vamos a descomprimir y copiar su contenido. Para ello ejecutamos los siguientes comandos como root:
tar xzf postfix-policyd-spf-perl-2.007.tar.gz
cd postfix-policyd-spf-perl-2.007
cp postfix-policyd-spf-perl /usr/libexec/postfix/policyd-spf-perl
Configurar SPF
Para que SPF sea lanzado cuando llegue un correo elecrónico es necesario crear un servicio en el fichero master.cf de nuestro Postfix. Este servicio lo que hará es lanzar el script que hemos instalado y comprobar el dominio del remitente con su dirección IP de conexión. Para crear este servicio en el fichero master.cf vamos a agregar unas líneas al final, ejecutamos los siguientes comandos como root:
vi /etc/postfix/master.cf
policy unix - n n - - spawn
user=nobody argv=/usr/bin/perl /usr/libexec/postfix/policyd-spf-perl
Ahora vamos a configurar nuestro main.cf para que lance el servicio cuando llegue un correo y pase por todo el proceso de comprobación. Esta línea ha de colocarse siempre después de reject_unauth_destination. Ejecutamos los siguientes comandos como root:
vi /etc/postfix/main.cf
check_policy_service unix:private/policy
Para que los cambios surtan efecto, necesitamos recargar la configuración Postfix. Ejecutamos el siguiente comando como root:
postfix reload
Probar SPF
El método más rápido de probar nuestro SPF es realizando una conexión local a nuestro AntiSPAM Gateway. Mientras hacemos la prueba vamos a monitorizar el fichero de logs de nuestro AntiSPAM. Primero vamos a dejar monitorizando nuestro fichero de logs, para ello ejecutamos el siguiente comando como root:
tail -f /var/log/mail.log
Ahora vamos a conectar desde nuestro cliente al servidor, ejecutamos los siguientes comandos:
telnet IP_AntiSPAM 25
ehlo <dominio>
mail from:usuario@dominio.com
rcpt to:usuario@example.com
Podemos observar en las imágenes superiores primero el log de nuestro AntiSPAM, detectando el intento de envío inválido que estamos realizando desde el cliente (captura inferior). Se puede observar que aparece una dirección Web la cual podemos visitar y nos informará el porque ha fallado el envío. Esta dirección sirve de ayuda para el cliente, así sabrá porque no ha podido enviar el correo.














6 agosto, 2010 - 19:50
Muy bueno lo de SPF no lo tenía. lo voy a implementar, después te cuento cómo me fue.
Una consulta, veo que si intento mandar un mail desde una red externa pero con mi dominio, me deja enviarlo y recibo unos 10 o 15 spams al día de esa manera.
SpamAssassin los detecta claro, pero sería interesante poder bloquearlo desde Postfix.
el ejemplo sería
ehlo dominio.com.ar
mail from:user@dominio.com.ar
rcpt to:user@dominio.com.ar
(si en el rcpt to: pongo otro dominio me dice que no porque es relay)
muchas gracias nuevamente por el doc. muy completo y detallado.
saludos!
6 agosto, 2010 - 20:02
Hola gilgamezh,
Gracias por el comentario, si usas el gateway únicamente para recibir correo puedes bloquearlo al nivel de configuraciones con HELO/EHLO.
Te paso un enlace por si quieres ir echándole un vistazo, ya que dejaremos estos apartados para un artículo donde irán comandos más específicos.
http://www.postfix.org/postconf.5.html#smtpd_helo_restrictions
Saludos.
6 agosto, 2010 - 20:04
gracias
6 agosto, 2010 - 20:10
De nada,
Pero se me olvidaba, si ocurre que ponen otro dominio en el HELO/EHLO y luego el remitente usa el dominio tuyo, puedes bloquearlo con restricciones del sender.
http://www.postfix.org/postconf.5.html#smtpd_sender_restrictions
Recuerda, siempre si el gateway es receptor. Ya que si mandaras tus correos también mediante el gateway, tu eres remitente de ese dominio y te bloquearía los correos.
Un saludo.