Desde hace ya un tiempo existe una RFC que se creó para crear una nueva técnica (adicional) en la lucha contra el SPAM y el phishing. Yahoo! diseño, supongo en conjunto con otros, la RFC 4871 (DomainKeys Identified Mail (DKIM) Signatures) que cuyo objetivo es el de -sin modificar la forma en que se envía y recibe mail, o sea, el protocolo SMTP- se pueda implementar un método de verificación de remitente, a nivel dominio, usando claves públicas y privadas.
El método básicamente es el agregar un encabezado SMTP cuando se envía el mail con un hash (firma) creado con la parte privada de la clave RSA. Cuando el MTA receptor recibe este correo, hace una consulta DNS, obtiene la clave pública del dominio del cual fue enviado el correo y verifica la autenticidad del hash.
En este post voy a describir cómo lo implementé en un debian etch.
Implementación
Para implementarlo finalmente elegimos usar dk-milter o dk-filter (que es lo mismo).
Debian trae un paquete en lenny, por lo que me baje los fuentes con:
apt-get -t lenny source dk-milter
y después lo compilé (con dpkg-buildpackage)
Lo primero que hay que hacer es armar los certificados. El paquete trae un comandito para hacerlo gentxt.csh, este comando se ejecuta pasandole dos argumentos, el “selector” que es un nombre (yo le mandé “calculin”) y el nombre del dominio al que pertenece el certificado, en este caso fue “cafelug.org.ar”.
Genera dos archivos:
- calculin.public
- calculin.private
El archivo privado es el más importante y hay que ponerlo en alguna parte que después lea el demonio, yo lo mandé en /etc/postfix/domainkeys.
Luego hay que configurar el DNS y también algunos parámetros del dk-filter.
El dk-filter se configura tocando el archivo /etc/default/dk-filter y así quedó:
# Sane defaults: log to syslog
DAEMON_OPTS="-l -m smtpd,postfix"
# Sign for example.com with key in /etc/mail/domainkey.key using
# selector '2007' (e.g. 2007._domainkey.example.com)
DAEMON_OPTS="$DAEMON_OPTS -d cafelug.org.ar -s /etc/postfix/domainkeys/dk_cafelug.org.ar.pem -S calculin"
# See dk-filter(8) for a complete list of options
#
# Uncomment to specify an alternate socket
#SOCKET="/var/run/dk-filter/dk-filter.sock" # default
#SOCKET="inet:54321" # listen on all interfaces on port 54321
SOCKET="inet:1025@localhost" # listen on loopback on port 12345
#SOCKET="inet:12345@192.0.2.1" # listen on 192.0.2.1 on port 12345
Entre las opciones esta -l que es para que mande los logs a través de syslog, -m smtpd,postfix no sé si es necesario (entre las pruebas que hice quedó). Las otras son más importantes:
-d cafelug.org.ar(el dominio del certificado, se pueden poner más dominios)-s /etc/postfix/domainkeys/dk_cafelug.org.ar.pem(el lugar donde está la clave privada)-S calculin(el “selector”).
Y la parte que me volvió un poco loco fue la opción de SOCKET=, postfix corre en chroot, por lo que la opción SOCKET="/var/run/dk-filter/dk-filter.sock" me tiraba ”’file not found”’… estuve un rato para acordarme y darme cuenta que no lo encontraba porque no estaba dentro del jail. En fin, lo deje escuchando en un puerto y así no da problemas.
Configuración de DNS
La configuración de DNS es ”tricky”, la documentación que encontré no es muy específica. La forma de correcta de setearlo es poniendo ”’dos”’ entradas de tipo ”TXT” en la zona:
calculin._domainkey.cafelug.org.ar. TXT "k=rsa; t=y; p=MFwwDQYJ[...]xfS+g/UlcszvzvY3UPFNEVGEecCAwEAAQ==”
_domainkey.cafelug.org.ar. TXT "t=y; o=-"
La primera indica la clave pública (encodeada en Base64) para el selector ”calculin” (que use con el gentxt.csh) y es importante que esté con el selector adelante y seguido de un ”.” (punto). O sea ”<selector>._domainkey.<dominio>”, las demás opciones (”’k=”’ y ”’t=”’) están claramente documentadas en la RFC 4870.
La segunda entrada indica cómo deben ser tratados los mails que llegan de este dominio, ”’t=”’ indica que el dominio está en ”test-mode” (esto se saca una vez que lo pasamos a producción), luego la opción ”’o=”’ tiene varios valores, ”~” indica que los mails pueden ser firmados o no, en cambio ”-” indica que todos los mails enviados van a salir firmados.
Configuración de postfix
La configuración de postfix es simple, lo único que hay que tener en cuenta es la versión de postfix. Esto está soportado desde la versión 2.3.
smtpd_milters = inet:127.0.0.1:1025
non_smtpd_milters = inet:127.0.0.1:1025
smtpd_milters indica donde encuentra los ”milters” definidos (ojo con la sintaxis, no es la misma que usa el dk-milter, intercambia la posición del ”host” y ”puerto”, así que no hay que hacer cut&paste).
non_smtpd_milters es para los mails generados localmente.
Probando la configuración
Para probar si todo quedó bien se pueden enviar mails a una cuenta de Yahoo! que hace el chequeo (aparece una leyenda debajo del “From:” visible desde la interfaz web (sin tener que ver los encabezados completos). La otra forma es enviando un mail a una cuenta que responde automáticamente diciendo el estado del tema. Esta cuenta es autorespond e@n dk.elandsys.com
Lo que hay que tener muy en cuenta es que tanto Yahoo! como el servidor que recibe el mail de la dirección de testeo tienen que tener la zona de nuestro dominio actualizada. Generalmente van a tenerla en un cache (si es que ya mandaron algun mail al dominio en cuestión), por lo que el test puede darnos que falló, cuando en realidad solo hay que tener paciencia y esperar a que nuestra zona expire en el DNS cache que leen estos MTA.
Tags: DKIM DomainKeys Yahoo!

1 comment
Comments feed for this article
Trackback link
http://www.danielcoletti.com.ar/2008/04/03/dkim-domainkeys-identified-mail/trackback/
2008-06-03 at 7.54 pm
MARIA
Mi casilla de email recibe cuando mando a alguien mi nombre con el icono de la llavecita que dice domainkeys, que significa porque no lo entiendo, que alguien puede entrar a mi casilla de mail y saber que es lo que hago a quien envio mails o que estoy protegida de virus y spam, es decir es bueno tener esa llavecita o es malo y que alguien me copio mi clave, por favor dime que no lo entiendo, gracias maria