Reglas SPF para validar el correo: lo básico

SPF (Sender Policy Framework) es el sistema generalmente implementado en los servidores de correo para evitar el spam mediante spoofing (falsificación del origen) y consiste en verificar la ip del remitente. Veamos un ejemplo muy sencillo de email spoofing. Para simplificar, supongamos que tenemos acceso a un servidor de correo (MTA) Postfix desastrosamente configurado: sin mecanismo de autentificación, sin limitación de retransmisión (relay) y, obviamente, sin reglas SPF especificadas. Accedemos pues tranquilamente al puerto 25 del blanco y saludamos:

telnet servidor.com 25

220 correo.servidor.com ESMTP Postfix
HELO comoestas.com
250 correo.servidor.com
MAIL FROM: mailfalso@otroservidor.com
250 2.1.0. Ok
RCPT TO: mailreal@otroservidormas.com
250 2.1.0 Ok
DATA
354 Start mail input; end with <CRLF>.<CRLF>
Compra ésto barato barato.
.
250 Ok

El servidor enviará nuestro correo con remitente falso a un destinatario real sin preocuparse de nada: no comprueba si dicho remitente existe y mucho menos si es un usuario legítimo del servidor. Para evitarlo es para lo que se creo SPF. ¿Cómo se valida una dirección de email con este sistema? Tomando el dominio del remitente y usándolo para buscar su ip en ciertos registros que se especifican en la zona DNS de nuestro (su) servidor. Todo servidor en la red tiene asociado un fichero de texto que describe su zona dentro de la red, el fichero de zona precisamente. Su formato es engañosamente sencillo: Nombre - TTL - Tipo - Prioridad - Valor, por ejemplo:

servidor.com 600 A 0 245.136.54.211

y una de las acciones que se puede realizar consultando dicho fichero es, dado un nombre de dominio, conocer su ip y viceversa (dns inversa). En concreto SPF se vale de los registros A (o AAAA), MX y PTR. El registro A debe contener una ip de 32 bits (ipv4) o de 128 (ipv6) si el registro es AAAA. El registro MX se usa para apuntar a servidores de correo que podemos usar además del propio y el registro PTR contiene el nombre de nuestro dominio en un formato especial. Sabiendo esto, ¿cómo especificamos una directiva SPF? Añadiendo también en la zona DNS un registro de tipo TXT cuyo nombre será nuestro dominio y que contendrá una cadena de texto según la especificación SPF:

servidor.com 600 TXT 0 v=spf1 a mx -all

Esta cadena de ejemplo simplemente especifica la versión de SPF (obligatorio) y dispone que se compruebe si el nombre de dominio del remitente tiene una ip asociada (consulta al registro A) o si dicho dominio dispone de registros MX (servidores de correo) cuyos A puedan autentificar dicha ip, en cuyo caso el email será enviado, sino se rechaza (-all). Evidentemente con algo tan simple no sería excesivamente complicado crear un servidor con los datos de zona DNS falsificados para eludir el control, por lo que SPF permite afinar mucho más el control.

SPF dispone de mecanismos a los que se puede aplicar prefijos para cambiar su comportamiento, y de modificadores. Los mecanismos en un registro SPF pueden ser cero o más, y son

  • all
  • a
  • mx
  • ptr
  • ip4
  • ip6
  • include
  • exists

a los que se les puede aplicar cualquiera de los siguientes prefijos:

  • - fail, se rechaza la ip que coincide con el mecanismo y se desecha el mensaje
  • ~ softfail, no se desecha el email pero se marca una cabecera especial para darle algún tratamiento posterior
  • + passse aprueba la ip y se añade una cabecera de tipo Received-SPF: pass
  • ? neutral, no se da el mensaje como bueno pero tampoco como malo. Añade una cabecera de tipo Received-SPF: neutral, se utiliza sobretodo para periodos de prueba

Los modificadores, que no veremos aquí, son

  • redirect
  • explanation

Cómo funcionan

El servidor de correo toma el dominio del remitente y lo somete a las pruebas SPF que se le indiquen para saber si debe enviarlo, rechazarlo o bloquearlo. SPF consultará los registros A necesarios para ello e incluso podrá realizar alguna consulta de dns inversa si se requiere. Las reglas por defecto son:

  • El prefijo por defecto es pass (+).
  • Los mecanismos se evalúan de izquierda a derecha, hasta que se encuentra una coincidencia entre mecanismo y dirección ip del emisor, entonces se usa el valor de su prefijo.
  • Si no hay coincidencias de mecanismo o modificador, el resultado por defecto es neutral.
  • Si un dominio no tiene registro SPF, el valor que toma la comprobación de SPF es none.
  • Si un dominio tiene un error temporal durante el procesamiento DNS, se devuelve el valor TempError. - Si ocurre algún tipo de error sintáctico o de evaluación (por ejemplo, el domino especifica un mecanismo desconocido) el resultado es PermError.

Mecanismos

A partir de este punto el resultado cierto se usa para indicar que se ha encontrado un ip para el remitente, y falso en caso contrario. En todos los ejemplos se asume que el remitente es usuario@servidor.com

all

Devuelve siempre cierto, es decir, admite todos los remitentes sean cuales sean. Suele usarse con el prefijo - (o ~) al final de la cadena para indicar que deben rechazarse todas las direcciones que no hayan sido validadas por reglas anteriores.

a

Sin especificar nada más se utiliza el dominio del remitente para consultar los registros A.

a:dominio, a:dominio/rango, a/rango

Se comprueban todos los registros A en el dominio, si se especifica un rango cada ip devuelta por la consulta se expande a la correspondiente subred CIDR para seguir buscando en dicha subred.

Ejemplos:

v=spf1 a -all
v=spf1 a:servidor.com -all

En el primer caso se toma el dominio del remitente y se consulta la ip, el resto se rechazan. El segundo caso equivale al primero solo que se ha especificado el dominio.

v=spf1 a/24 a:servidor2.com/24 -all

Si la ip del remitente se resuelve a 237.245.0.10 se buscara su ip en la red de clase C 237.245.0.0/24, después se consulta en servidor2.com cuyos registros A se expanden a su vez a subredes CDIR para seguir buscando.

mx

Se comprueban todos los registros A de los MX del dominio del remitente en orden de prioridad MX.

mx/rango, mx:dominio, mx:dominio/rango

Al igual que con el mecanismo a, si se especifica un rango la ip se expande en una subred CDIR donde se buscan los MX para obtener los registros A.

Ejemplos:

v=spf1 mx mx:otrodominio.com -all

Se consultan los MX propios y los de otro servidor para reintentar el envío.

v=spf1 mx/24 mx:otrodominio.com/24 -all

Se comprueban todos los registros MX de todo el rango de red del servidor propio y de otrodominio.

ptr, ptr:dominio

Se consulta el hostname (o hostnames) para la ip del cliente y se validan posteriormente buscando los registros A. Un hostname invalido se descarta.

ip4:ip, ip4:ip/rango

Se permite enviar correo desde la ipv4 o rango de ip's indicado. Si no se especifica rango se asume /32.

ip6:ip, ip6:ip/rango

Se permite enviar correo desde la ipv6 o rango de ip's indicado. Si no se especifica rango se asume /128.

Con estos mecanismos básicos ya podemos ponérselo muy difícil al que intente spoofear nuestro servidor de correo. Para más información sobre los modificadores y otras características avanzadas o de prueba pueden consultarse los enlaces.

Enlaces: Registro SPF (Franja San), List of DNS Record Types, MX Record

1 comentario: