Postfix con DKIM y múltiples dominios

Tras pruebas varias e integraciones con otros sistemas de la plataforma, ya estamos firmando, desde hace unos meses, correos salientes con DKIM (RFC 5585).

¿Y qué es DKIM? Es una idea desarrollada a partir de DomainKeys e IdentifiedMail que
garantiza que un mensaje procede de un determinado sitio. Es usado por grandes proveedores como Yahoo, Gmail, Hotmail…etc.

DKIM usa claves públicas/privadas para certificar el origen de un email a través de DNS. Se crean dos claves, la pública se publica en un registro TXT del DNS del dominio cuyos mensajes se quieren firmar y la privada se usa para crear la firma digital de los mensajes añadiendo el resultado en una cabecera del propio mensaje a enviar.

El servidor destino, consultará la clave pública y chequeará que se corresponde con la clave que ha firmado el mensaje.

En Postfix la puesta en marcha es sencilla. Hay varias opciones pero el paquete OpenDKIM ofrece un milter que implementa DKIM. La instalación en Debian es sencilla:

apt-get install opendkim

El archivo de configuración queda en /etc/opendkim.conf. En este punto, debemos saber si queremos firmar los mensajes (salida) o verificar la firma (entrada). En nuestro caso, vamos a firmar los mensajes así que la opción Mode deberá estar configurado como s, de signer (la otra opción es v de verifier).

Además, veremos si queremos firmar solamente un dominio o si queremos firmar los correos de varios dominios, como es nuestro caso. Para ello, OpenDKIM soporta el uso de archivos externos para estos listados, con las directivas:

KeyTable /etc/opendkim/KeyTable
SigningTable /etc/opendkim/SigningTable

Pero necesitamos generar la clave pública y privada, y para generarla, tenemos el comando:

/usr/bin/opendkim-genkey -D /etc/opendkim/keys/dominiogeneral.com/ -d dominiogeneral.com -s domgen

con lo que nos creará 2 archivos en el directorio /etc/opendkim/keys/dominiogeneral.com/, con la clave privada y con la pública, para el dominio indicado (aunque esto realmente no se usará ya que podemos usarla para varios dominios diferentes) y con el selector (un dominio puede firmar con varias claves así que se usan selectores para diferenciarlas; debemos elegir uno para cada clave ya que irá indicado en la firma y asociado a la clave pública en el DNS).

En dicho directorio, estará por tanto un archivo con la clave privada (que mantendremos en privado) y otro con el registro DNS que debemos publicar en los dominios que queremos firmar con la clave:

domgen._domainkey IN TXT “v=DKIM1; k=rsa; p=MIGfMA0aCSrGSIb3DQEBAQUAAVGNADCBiQKBgQzut1LT3mNz2wv4bkZoW/HKYs4g
M9Rlm3lasoAKOwOasd7wUN34rs0dwWl+OEnEKP7Zhz34k3hy8OYaWF125PQy2F8EqP
1234rz81234123kasdhkqh345jg23cx5X5qS64FO1234pil1j45h134uiky5h123unC
bmQIDAQAB”

Es ese el registro TXT que debemos añadir al DNS.

Hecho esto, deberemos poblar los archivos referenciados en KeyTable y SigningTable, que comentaba antes. El formato es tal que:

/etc/opendkim/SigningTable :
dom1.com domgen._domainkey.dom1.com
dom2.com domgen._domainkey.dom2.com
dom3.com domgen._domainkey.dom3.com

indicando el dominio a firmar y cuál es el registro TXT publicado en el DNS, donde se indica el selector y la clave pública. El registro TXT anterior se debe añadir a todos los dominios que aparezcan en este archivo, lógicamente.

/etc/opendkim/KeyTable
domgen._domainkey.dom1.com dom1.com:domgen:/etc/opendkim/keys/dominiogeneral.com/domgen.private
domgen._domainkey.dom1.com dom2.com:domgen:/etc/opendkim/keys/dominiogeneral.com/domgen.private
domgen._domainkey.dom1.com dom3.com:domgen:/etc/opendkim/keys/dominiogeneral.com/domgen.private

indicando el nombre del registro TXT donde está la clave pública, el dominio, el selector y la ruta a la clave privada con la cuál firmar los mensajes. En este caso, usaremos la misma clave para todos los dominios (aunque podemos tener una clave pública/privada por dominio); esto es para facilitar la gestión de las claves y registros ya que realmente lo que interesa en DKIM (desde el punto de vista del ISP con miles de dominios) es ver que el mensaje está firmado, no que se comparta la clave con otros dominios.

Mediante el uso de dichos archivos para los listados, aunque gestionemos la salida de correo de otros dominios, solo se firmarán los indicados en dichos archivos, el resto irán sin firma.

Hecho ya esto, aparte de modificar alguna otra directiva del archivo de configuración, solo faltaría indicar a Postfix que use dicho milter con la configuración típica en el main.cf:

# DKIM
milter_protocol = 2
milter_default_action = accept
smtpd_milters = inet:127.0.0.1:8891
non_smtpd_milters = inet:127.0.0.1:8891

A partir de entonces, se empezará a firmar los mensajes de los dominios indicados en los archivos de configuración y en los logs, aparecerán líneas como:

Feb 27 16:03:39 relay opendkim[27424]: 7028B182EC6: DKIM-Signature header added (s=domgen, d=dom1.com)

indicando qué mensajes se van firmando. La cabecera generada en cada email de los dominios presentes en los archivos de OpenDKIM para su firmado, es algo como la siguiente:

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=dom1.com;
s=domgen; t=1416842492;
bh=wrcn8uVGZ28r7aV+qSPQ5naq/kE+5fh0D4aLoOyTb8g=;
h=Subject:From:To:From;
b=gOovLmVaruPnahXFtavoadaEWvch5wA/2uWPRQaY7Z6oKzcTdT2VB/IQaXGcLlJHo
wW30zyAa1H/bhQ8se8IrfXCfZaBko2jVI5DYa22i7clQrkfafXQ7zKuXGrDR128RGR
q079zMIZzWtH8JswaJf0RxBGQGBsC5P+qDWRFDqg=

Como se puede ver, la cabecera incluye el dominio “d” y el selector “s”, con lo que con ello, el servidor destino puede crear el registro TXT a consultar (domgen._domainkey.dom1.com) para recuperar la clave pública. Con ella, se verificará que el contenido del campo “b”, que es la firma digital, se ha firmado con la privada asociada. Si hay un error (principalmente porque la clave pública no se corresponde con la privada que ha firmado), se generará un error de verificación.
Por otra parte, con el cuerpo del mensaje y las cabeceras indicadas en “h”, se genera un hash. Este hash debe coincidir con el campo “bh” de la cabecera DKIM-Signature, sino, también se generará un error de verificación (el mensaje habría sido modificado).
Esto es, de forma muy resumida, el proceso de validación que harán los servidores remotos.

La implantación se está realizando de forma muy progresiva, así que poco a poco, se van firmando más mensajes de más dominios. Gmail, Yahoo…etc comprueban DKIM en sus servidores de entrada y recomiendan su uso, así que es algo importante a la hora de entregar mensajes a sus servidores.

Ya que hacemos uso tanto de SPF (desde hace ya bastantes años) como de DKIM, quizá, el próximo paso sea empezar a usar DMARC, pero tiempo al tiempo.

Un pensamiento en “Postfix con DKIM y múltiples dominios

  1. Hola.
    Es bueno tu titorial, pero deberías indicar más a detalle que valores se remmplazan por otros o que configuraciones extras se deben agregar o modificar si existen. Lo digo para varios que por primera vez tenemos que generar llaves DKIM.

    Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada.