Configurando DKIM sobre Proxmox Mail Gateway

Proxmox Mail Gateway (PMG) es una plataforma integral de seguridad de correo electrónico de fuente abierta que lo ayuda a proteger su servidor de correo de las amenazas de correo electrónico y a garantizar la integridad de los datos con su conjunto de funciones de clase empresarial. Pero carece del mecanismo de autenticación de correo electrónico DKIM, que aún no han implementado y que de seguro pondrán mas adelante. DKIM utiliza criptografía de clave pública para permitir al origen firmar electrónicamente correos electrónicos legítimos de manera que puedan ser verificados por los destinatarios. Entre los proveedores de servicio de correo que implementan ese sistema se encuentran Yahoo, Gmail, y FastMail. Cualquier correo originado desde estas organizaciones deben llevar una firma DKIM.

DKIM también protege contra la manipulación de correo electrónico, proporcionando integridad de extremo a extremo, desde un módulo firmante a un módulo validador. En la mayoría de los casos el módulo firmante actúa en nombre de la organización originaria insertando una firma DKIM en las cabeceras del mensaje, y el módulo de comprobación en nombre de la organización del receptor, validando la firma obteniendo la clave pública del firmante a través del DNS.

Cómo funciona

DKIM añade una cabecera llamada «DKIM-Signature» que contiene una firma digital del contenido (cabeceras y cuerpo) del mensaje. Los parámetros por defecto del mecanismo de autenticación son la utilización de SHA-256 como la firma criptográfica y RSA como el esquema de criptografía asimétrica. Finalmente se codifica la firma resultante con Base64.

El servidor SMTP utiliza el nombre de dominio perteneciente al emisor, la cadena «_domainkey», y un selector del campo de la firma DKIM para realizar una consulta al DNS. La respuesta debe incluir la clave pública del dominio. El receptor puede utilizar esta información para descifrar el valor de la firma del campo de la cabecera, y al mismo tiempo, recalcular el valor de la firma para el mensaje (cabeceras y cuerpo) que ha recibido. Si los dos resultados coinciden, esto prueba criptográficamente que el mensaje fue firmado por el dominio indicado y que no ha sido alterado en tránsito.

Un fallo en la verificación de la firma no fuerza el rechazo del mensaje. Por contra, las razones precisas por las cuales la autenticidad del mensaje no ha podido ser verificada deberían comunicarse tanto al proceso de envío como el de recepción.

Instalamos paquetes necesarios, es muy recomendable actualizar el sistema antes de continuar.

apt update && apt upgrade -y && apt dist-upgrade -y

aptitude install opendkim opendkim-tools ccze

Editamos el fichero de configuración /etc/opendkim.conf en nuestro caso como manejamos varios subdominios de correo, es decir un dominio principal y varios subdominios de este, vamos a necesitar un juego de llaves privada/pública para cada uno. Comentamos todas las líneas que aparecen en el fichero y al final añadimos todas estas que es en realidad como debe quedarnos el fichero.

nano /etc/opendkim.conf

El mismo debe de quedar de la siguiente forma:

PidFile /var/run/opendkim/opendkim.pid
Mode sv
Syslog yes
SyslogSuccess yes
LogWhy yes
UserID opendkim:opendkim
Socket inet:8891@localhost
Umask 002
Canonicalization relaxed/relaxed
Selector default
MinimumKeyBits 1024
KeyTable /etc/opendkim/KeyTable
SigningTable refile:/etc/opendkim/SigningTable
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts

>>Salvamos y continuamos <<

Ahora conectamos OpenDKIM con Postfix.

Editamos el default de opendkim, nos debe quedar de la siguiente forma:

 nano /etc/default/opendkim

RUNDIR=/var/spool/postfix/var/run/opendkim
RUNDIR=/var/run/opendkim
SOCKET=local:$RUNDIR/opendkim.sock
SOCKET="inet:8891@localhost"
USER=opendkim
GROUP=opendkim
PIDFILE=$RUNDIR/$NAME.pid
EXTRAAFTER=

>>Salvamos y continuamos <<

Ahora crearemos la estructura de directorios que contendrán los host de confianza, firmas y claves criptográficas.

mkdir /etc/opendkim
mkdir /etc/opendkim/keys

Especificamos los hosts de confianza en el archivo /etc/opendkim/TrustedHosts

Vamos a utilizar este archivo para definir tanto ExternalIgnoreList y InternalHosts, los mensajes procedentes de estos hosts, dominios y direcciones IP son de confianza y pueden ser firmados.

Personalice y añada las siguientes líneas al archivo recién creado. Dominios múltiples pueden especificarse, no edite las tres primeras líneas:

nano /etc/opendkim/TrustedHosts

127.0.0.1
127.0.0.0/8
localhost
000.000.000.000 # ip del server interno de correo
pmg.dominio.cu #nombre y dominio de nuestro pmg

>> Salvamos y continuamos <<

Ahora creamos la tabla de llaves en el fichero /etc/opendkim/KeyTable

Una tabla de claves contiene cada selector por cada dominio y la ruta de acceso a su clave privada. Cualquier cadena alfanumérica puede ser utilizado como un selector, se utiliza en este ejemplo electrónico y no es necesario cambiarlo.

nano /etc/opendkim/KeyTable

default._domainkey.dominio.cu dominio.cu:default:/etc/opendkim/keys/dominio.cu/default.private

>> Salvamos y continuamos <<

Creamos una tabla de firmas. Este fichero se utiliza para declarar cada dominio de correo y su selector

nano /etc/opendkim/SigningTable

*@dominio.cu default._domainkey.dominio.cu

>> Salvamos y continuamos <<

Ahora vamos a generar las llaves privadas y públicas.

cd /etc/opendkim/keys

mkdir dominio.cu

cd dominio.cu

opendkim-genkey -r -b 2048 -d dominio.cu -s default

Cambiamos el propietario y el grupo para los ficheros de las claves privadas

cd /etc/opendkim/keys/

find . -type d -exec chown opendkim.opendkim {} \;
find . -type f -exec chown opendkim.opendkim {} \;

En este punto es el mas critico para los que no poseen delegada su zona DNS.

Añadiendo las claves públicas a los registros DNS para cada dominio. Contenido del fichero default.txt:

cat /etc/opendkim/keys/dominio.cu/default.txt

La clave pública se define con el parámetro p. No utilice la clave de este ejemplo, es sólo una ilustración y no funcionará en su servidor.

default._domainkey    IN    TXT  "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB" ; ----- DKIM key mail for dominio.cu

Copiamos el contenido integro del fichero «default.txt» a nuestra zona DNS externa, y le añadiremos «.dominio.du.», quedando así:

default._domainkey.dominio.cu.   IN   TXT   "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB" ; ----- DKIM key mail for dominio.cu

Debemos saber que Proxmox Mail Gateway no permite la modificacion directa de sus ficheros de configuración, así que necesitamos llegar a sus plantillas para que el reescriba el main.cf.

cd /var/lib/pmg/templates

nano main.cf.in

Y al final del mismo agregamos las siguientes líneas:

smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891

Nota Importante: Cuando actualice su PMG chequee que estos valores se mantengan agregados.

>> Salvamos y continuamos <<

Ahora para que aplique los cambios sin tener que reiniciar el contenedor, corremos este comando:

pmgconfig sync --restart 1

Nota: Recomiendo despues de reescribir los config con el comando anterior, en mi caso reinicio el postfix y el opendkim.

systemctl restart opendkim

systemctl restart postfix

Ahora comprobamos los mismos si estan corriendo correctamente

systemctl status opendkim

systemctl status postfix

 

Hasta aquí toda la configuración de nuestro DKIM sobre PMG, ahora solo nos queda comprobar que el mismo está firmando y comprobando correctamente los correos, para eso les dejo varios sitios muy interesantes:

http://dkimvalidator.com/

http://www.appmaildev.com/es/dkim

https://www.mail-tester.com/

Ahora en la consola ejecute el siguiente comando para que vea lo lindo que nuestro PMG utiliza el DKIM.

tailf /var/log/mail.log | ccze

En un proximo articulo como configurar Dmarc

¿De cuánta utilidad te ha parecido este contenido?

Adonis R. Carrillo Pedroso

Ver comentarios

  • Buen tutorial, solo un detalle:

    No es recomendable generar pares de llaves de 2048 bits pues algunos servers DNS tienen problemas con el largo que sobrepasa los 255 chars y no transfieren bien.

    Ya esto me mordió con dos dominios fuera de Cuba y el registro en Ceniai... la bajé a 1024 bits y todo al kilo.

    Es solo que cuando dices en el tutorial:

    opendkim-genkey -r -b 2048 -d dominio.cu -s default

    debes decir

    opendkim-genkey -r -b 1024 -d dominio.cu -s default

    • el problema del tamaño de las llaves, es que hay que saberlas escribir en el dns, no es que no lo soporten, sino que en estos hay que escribirlas en bloques de 256bit, cada trozo. Y la forma de escribirlas en todos los dns no es la misma, pero lo recomendado son 2048 bit o superior, ya 1024 es vulnerable.

  • excelente ayuda un aporte muy importante tendras la configuracion del dmark en esta misma plataforma promox mailgateway gracias

Compartir
Publicado por
Adonis R. Carrillo Pedroso

Entradas recientes

Cómo crear un volumen deduplicado en Ubuntu?

Qué es la deduplicación? La deduplicación de datos permite a los usuarios reducir los datos…

7 días hace

Cómo hacer que nuestra terminal luzca mejor? Parte2

2- Haciendo que nuestra terminal sea atractiva (Zsh + Oh-my-zsh) Ya conocemos una herramienta para…

1 semana hace

Cómo hacer que nuestra terminal luzca mejor? Parte1

Durante mucho tiempo hemos administrado servidores Linux y en contadas ocasiones (casi nunca) estos cuentan…

1 semana hace

Conexión OpenVPN ofuscada

El artículo se divide en dos secciones, una teórica y la otra práctica, la primera…

1 semana hace

Servidor de correo en un VPS

Después de haber visto varios escenarios de cómo configurar un servidor de correo, hoy veremos…

1 semana hace

Creación de un clúster de discos (SDS) usando GlusterFS (Parte 2)

Este artículo es la continuación de la Parte 1 y será tomado como base para…

1 semana hace