Instalación y configuración de dkim-milter.

Autor: Joel Barrios Dueñas
Correo electrónico: darkshram en gmail punto com
Sitio de Red: http://www.alcancelibre.org/
Jabber ID: darkshram@jabber.org

Creative Commons Reconocimiento-NoComercial-CompartirIgual 2.1

© 1999-2016 Joel Barrios Dueñas. Usted es libre de copiar, distribuir y comunicar públicamente la obra y hacer obras derivadas bajo las condiciones siguientes: a) Debe reconocer y citar al autor original. b) No puede utilizar esta obra para fines comerciales (incluyendo su publicación, a través de cualquier medio, por entidades con fines de lucro). c) Si altera o transforma esta obra o genera una obra derivada, sólo puede distribuir la obra generada bajo una licencia idéntica a ésta. Al reutilizar o distribuir la obra, tiene que dejar bien claro los términos de la licencia de esta obra. Alguna de estas condiciones puede no aplicarse si se obtiene el permiso del titular de los derechos de autor. Los derechos derivados de usos legítimos u otras limitaciones no se ven afectados por lo anterior. Licencia completa en castellano. La información contenida en este documento y los derivados de éste se proporcionan tal cual son y los autores no asumirán responsabilidad alguna si el usuario o lector, hace mal uso de éstos.

Introducción.

Este documento incluye los procedimientos necesarios para configurar dkim-milter con Sendmail o Postfix.

Acerca de DKIM.

DKIM (DomainKeys Identified Mail) es un mecanismo de autenticación de correo electrónico que permite firmar los mensajes de correo electrónico con una llave privada —de 1024 a 2048 bits— de modo que éste pueda ser validado por un destinatario a través de una llave pública distribuida a través de DNS.

Fue diseñado para combatir la falsificación de correo electrónico (mail spoofing), práctica muy utilizada para enviar spam que consiste en falsificar el valor del campo de la cabecera "From:" de un mensaje de corro electrónico, es decir el remitente, cuando en realidad proviene de un servidor distinto al que realmente corresponde al dominio involucrado, dificultando de este modo el poder hacer reclamos o bien engañar a los servidores de correo electrónico para que reciban spam como correo legítimo aprovechando un defecto del protocolo SMTP. Todos los grandes servicios de correo electrónico —incluidos GMail, Hotmail/Outlook.com, Yahoo y Fastmail— utilizan esta tecnología para mitigar el problema del spam.

DKIM también impide la manipulación de correo electrónico, garantizando la integridad de extremo a extremo, desde el módulo firmante en el servidor de correo de origen, que inserta una firma DKIM en las cabeceras del mensaje, hasta el módulo de comprobación en el servidor de destino que valida la firma obteniendo la llave pública del firmante a través de un registro TXT en la zona de DNS que resuelve el domino del remitente.

Equipamiento lógico necesario.

Instalación a través de yum.

ALDOS y Fedora™ ya incluyen lo necesario para realizar la instalación del paquete necesario. Si utiliza CentOS o Red Hat™ Enterprise Linux, puede utilizar el almacén YUM de Alcance Libre para servidores en producción, descargando el archivo http://www.alcancelibre.org/al/server/AL-Server.repo dentro del directorio /etc/yum.repos.d/:

wget -N http://www.alcancelibre.org/al/server/AL-Server.repo \
    -O /etc/yum.repos.d/AL-Server.repo

Examine el contenido del archivo /etc/yum.repos.d/AL-Server.repo:

vi /etc/yum.repos.d/AL-Server.repo

El contenido debe ser el siguiente:

[AL-Server]
name=AL Server para Enterprise Linux $releasever
mirrorlist=http://www.alcancelibre.org/al/el$releasever/al-server
gpgcheck=1
gpgkey=http://www.alcancelibre.org/al/AL-RPM-KEY

Salga del editor de texto y ejecute lo siguiente para instalar lo necesario:

yum -y install dkim-milter

Procedimientos.

SELinux y el servicio dkim-milter.

Se debe crear una política para permitir al servicio dkim-milter acceder a los contenidos de /sys y acceder a los archivos de firmas digitales, aunque éstos sean enlaces simbólicos —requerido por Virtualmin para gestionar DKIM.

Genere un nuevo directorio denominado /usr/share/selinux/packages/dkim:

mkdir -p /usr/share/selinux/packages/dkim

Cambie al directorio /usr/share/selinux/packages/clamd:

cd /usr/share/selinux/packages/dkim

Descargue el archivo http://www.alcancelibre.org/linux/secrets/dkim.te:

wget http://www.alcancelibre.org/linux/secrets/dkim.te

Edite el archivo recién descargado:

vi dkim.te

Asegúrese que éste tenga el siguiente contenido:

module dkim 1.0;

require {
	type sysfs_t;
	type dkim_milter_t;
	type dkim_milter_private_key_t;
	class lnk_file read;
	class dir search;
	class file { read open };
}

#============= dkim_milter_t ==============
allow dkim_milter_t dkim_milter_private_key_t:lnk_file read;
allow dkim_milter_t sysfs_t:dir search;
allow dkim_milter_t sysfs_t:file { read open };

Lo anterior fue obtenido de la salida de cat /var/log/audit/audit.log|grep audit|audit2allow -m dkim>dkim.te en un sistema donde SELinux impedía a dkim-milter acceder a los contenidos de /sys y acceder a los archivos de firmas digitales.

Genere el archivo de módulo para SELinux (dkim.mod) ejecutando checkmodule del siguiente modo:

checkmodule -M -m -o dkim.mod dkim.te

Empaquete el archivo clamd.mod como el archivo clamd.pp:

semodule_package -o dkim.pp -m dkim.mod

Finalmente, vincule el archivo dkim.pp obtenido con las políticas actuales de SELinux y se cargan éstas en el núcleo en ejecución:

semodule -i /usr/share/selinux/packages/dkim/dkim.pp

Una vez cargadas las nuevas políticas, se pueden eliminar los archivos dkim.te y dkim.mod, pues sólo será necesario que exista el archivo binario dkim.pp.

Creación de firma digital y configuración del servicio dkim-milter.

Si utiliza o bien planea utilizar Virtualmin para administrar o gestionar DKIM, por favor omita todos los procedimientos a continuación, debido a que este módulo para Webmin realiza todo lo necesario y porque éste ignorará y eliminará cualquier firma digital y configuración para dominio que se haya configurado fuera de la interfaz de Virtualmin.

Cambie al directorio /etc/mail/dkim-milter:

cd /etc/mail/dkim-milter

Tome en cuenta que muchos servicios de DNS públicos carecen de soporte para añadir registros tan grandes como los requeridos para publicar una firma de 2048 bits. Si así fuese el caso, genere la firma digital de 1024 bits, lo cual debe poder funcionar en prácticamente todos los servicios de DNS.

Ejecute dkim-genkey con la opción -b y 2048 —asumiendo que el proveedor de servicio de DNS tiene soporte para registros de gran tamaño— como argumento para crear una nueva firma digital de 2048 bits, la opción -r para definir que la firma a crear sólo puede ser utilizar para firmar correo electrónico y la opción -d con el dominio a utilizar como argumento. Ejemplo:

dkim-genkey -b 2048 -r -d mi-dominio.com

Lo anterior creará los archivos denominados default.private y default.txt; el primero corresponde a la firma digital que se utilizará para firmar todos los mensajes de correo; el segundo corresponde al archivo que incluye el registro TXT que debe añadirse a la zona de reenvío del dominio.

A fin de tener todo organizado y permitir gestionar otros dominios en el mismo servidor, genere el directorio específico para el dominio que se está configurando:

mkdir /etc/mail/dkim-milter/keys/mi-dominio.com

Mueva el archivo default.private como el archivo default dentro del directorio para el dominio.

mv default.private /etc/mail/dkim-milter/keys/mi-dominio.com/default

Mueva el archivo default.txt como el archivo default.txt dentro del directorio para el dominio.

mv default.txt /etc/mail/dkim-milter/keys/mi-dominio.com/

Cambie el propietario de todo el directorio que corresponde al dominio gestionado para que pertenezca al usuario y grupo dkim-milter:

chown -R dkim-milter:dkim-milter /etc/mail/dkim-milter/keys/mi-dominio.com

Edite el archivo de configuración /etc/mail/dkim-milter/dkim-filter.conf:

vi /etc/mail/dkim-milter/dkim-filter.conf

Si planea utilizar Sendmail como MTA, busque las siguientes opciones y defina para éstas los valores que se muestras a continuación.

AutoRestart yes
Domain mi-dominio.com
Selector default
Socket local:/var/run/dkim-milter/dkim-milter.sock
Syslog Yes
X-Header Yes

Si planea utilizar Postfix como MTA, busque las siguientes opciones y defina para éstas los valores que se muestras a continuación.

AutoRestart yes
Domain mi-dominio.com
Selector default
Socket inet:20209@localhost
Syslog Yes
X-Header Yes

Edite el archivo /etc/mail/dkim-milter/keys/keylist:

vi /etc/mail/dkim-milter/keys/keylist

Añada el siguiente contenido para definir que se firmará el correo de todos los usuarios (*@mi-dominio.com) del dominio a gestionar (mi-dominio.com) utilizando el archivo de firma digital correspondiente (/etc/mail/dkim-milter/keys/mi-dominio.com/default):

*@mi-dominio.com:mi-dominio.com:/etc/mail/dkim-milter/keys/mi-dominio.com/default

Configuración del MTA.

Procedimientos de configuración de Sendmail.

Edite el archivo /etc/mail/sendmail.mc.

vim /etc/mail/sendmail.mc

Es necesario agregar el siguiente contenido resaltado en el archivo /etc/mail/sendmail.mc, justo arriba de la línea MAILER(smtp)dnl.

dnl MASQUERADE_DOMAIN(localhost)dnl
dnl MASQUERADE_DOMAIN(localhost.localdomain)dnl
dnl MASQUERADE_DOMAIN(mydomainalias.com)dnl
dnl MASQUERADE_DOMAIN(mydomain.lan)dnl

INPUT_MAIL_FILTER(`dkim-milter', `S=local:/var/run/dkim-milter/dkim-milter.sock')dnl
define(`confMILTER_MACROS_ENVFROM', `{i}, {auth_type}, {auth_authen}, {auth_ssf}, {auth_author}, {mail_mailer}, {mail_host}, {mail_addr}')dnl
define(`confINPUT_MAIL_FILTERS', `dkim-milter')dnl
MAILER(smtp)dnl
MAILER(procmail)dnl

dnl MAILER(cyrusv2)dnl

Utilice lo siguiente si se combina con Clamav Milter y Spamassassin Milter:

dnl MASQUERADE_DOMAIN(localhost)dnl
dnl MASQUERADE_DOMAIN(localhost.localdomain)dnl
dnl MASQUERADE_DOMAIN(mydomainalias.com)dnl
dnl MASQUERADE_DOMAIN(mydomain.lan)dnl

INPUT_MAIL_FILTER(`dkim-milter', `S=local:/var/run/dkim-milter/dkim-milter.sock')dnl
INPUT_MAIL_FILTER(`spamassassin', `S=unix:/var/run/spamass-milter/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')dnl
INPUT_MAIL_FILTER(`clamav', `S=local:/var/run/clamav-milter/clamav.sock, F=, T=S:4m;R:4m')dnl
define(`confMILTER_MACROS_ENVRCPT', `b, r, v, Z')dnl
define(`confMILTER_MACROS_ENVFROM', `{i}, {auth_type}, {auth_authen}, {auth_ssf}, {auth_author}, {mail_mailer}, {mail_host}, {mail_addr}')dnl
define(`confINPUT_MAIL_FILTERS', `dkim-milter,spamassassin,clamav')dnl

MAILER(smtp)dnl
MAILER(procmail)dnl

dnl MAILER(cyrusv2)dnl

Utilice lo siguiente si se combina con Clamav Milter, Spamassassin Milter y Milter Greylist:

dnl MASQUERADE_DOMAIN(localhost)dnl
dnl MASQUERADE_DOMAIN(localhost.localdomain)dnl
dnl MASQUERADE_DOMAIN(mydomainalias.com)dnl
dnl MASQUERADE_DOMAIN(mydomain.lan)dnl

INPUT_MAIL_FILTER(`dkim-milter', `S=local:/var/run/dkim-milter/dkim-milter.sock')dnl
INPUT_MAIL_FILTER(`greylist', `S=local:/var/run/milter-greylist/milter-greylist.sock')dnl
INPUT_MAIL_FILTER(`spamassassin', `S=unix:/var/run/spamass-milter/spamass-milter.sock, F=, T=C:15m;S:4m;R:4m;E:10m')dnl
INPUT_MAIL_FILTER(`clamav', `S=local:/var/run/clamav-milter/clamav.sock, F=, T=S:4m;R:4m')dnl
define(`confMILTER_MACROS_ENVRCPT', `b, r, v, Z, {greylist}')dnl
define(`confMILTER_MACROS_CONNECT', `{_}, {j}, {if_addr}, {daemon_port}')dnl
define(`confMILTER_MACROS_HELO', `{verify}, {cert_subject}')dnl
define(`confMILTER_MACROS_ENVFROM', `{i}, {auth_type}, {auth_authen}, {auth_ssf}, {auth_author}, {mail_mailer}, {mail_host}, {mail_addr}')dnl
define(`confINPUT_MAIL_FILTERS', `dkim-milter,greylist,spamassassin,clamav')dnl

MAILER(smtp)dnl
MAILER(procmail)dnl

dnl MAILER(cyrusv2)dnl

Inicie el servicio dkim-milter.

service dkim-milter start

Añada el servicio dkim-milter a los servicios de arranque del sistema:

chkconfig dkim-milter on

Reinicie el servicio sendmail para que surtan efectos los cambios.

service sendmail restart

A partir de este momento, todo el correo electrónico emitido por el servidor incluirá una firma digital que será validada por el registro TXT anunciado a través de los servidores DNS que resuelven el dominio.

Procedimientos de configuración de Postfix.

Para un mejor funcionamiento, Postfix requiere que el servicio dkim-milter utilice un puerto (20209) en lugar de un archivo de zócalo para establecer la comunicación entre ambos.

Edite el archivo /etc/sysconfig/dkim-milter:

vi /etc/sysconfig/dkim-milter

Añada el siguiente contenido:

SOCKET=inet:20209@localhost

Ejecute lo siguiente para añadir las opciones de configuración necesarias para Postfix:

postconf -e "smtpd_milters = inet:localhost:20209"
postconf -e "non_smtpd_milters = inet:localhost:20209"
postconf -e "milter_protocol = 2"
postconf -e "milter_default_action = accept"

O bien edite el archivo /etc/postfix/main.cf:

vi /etc/postfix/main.cf

Y añada el siguiente contenido:

smtpd_milters = inet:localhost:20209
non_smtpd_milters = inet:localhost:20209
milter_protocol = 2
milter_default_action = accept

Inicie el servicio dkim-milter.

service dkim-milter start

Añada el servicio dkim-milter a los servicios de arranque del sistema:

chkconfig dkim-milter on

Reinicie el servicio postfix para que surtan efectos los cambios.

service postfix restart

A partir de este momento, todo el correo electrónico emitido por el servidor incluirá una firma digital que será validada por el registro TXT anunciado a través de los servidores DNS que resuelven el dominio.

Registro TXT en el zona de reenvío en el servidor DNS.

El archivo default.txt correspondiente al dominio gestionado contiene el registro TXT correspondiente y que es necesario publicar para permitir al resto de los servidores de correo electrónico del mundo el poder validar los mensajes firmados con DKIM. Contiene algo similar lo siguiente:

default._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ
8AMIIBCgKCAQEArwJp9KDhf44dzWbtzDucXa0JGCyLCLcHiUkmxwlMJn5i9+ivX6jmKo5kXrpzD0BrOu
3bB0tKChd08Ozbx70w6+t3Ubmi8Dw+Sxc0rlvJtyOR4IpSLGJhmD7FP8q+fiaaY+NDEiqbdXdc8GYE4y
DpN//X9F+J8PQH2rs+WFI0A+xob2ezOMpX/qIuZzPVDAgsDKIyeXV316Zc8vh1Cq02ABFk/GfzZB5vYE
kjFs8HKdj7ulnztGuOX0JVQHmt9BzwSUwIoEuUpaNiLs0UnxCKen4krme5ARZvSo5tQCm3GmXUMe6FGs
X2LM/bg2WDMzfNP2/NLRgXapFWiZIV9tmXcwIDAQAB" ; ----- DKIM default for mi-dominio.com

Si el registro resulta ser demasiado grande para ser utilizado por algunas versiones de servidores de DNS o bien limitaciones de la interfaz gráfica para administración, puede utilizarse éste segmentando del siguiente modo:

default._domainkey IN TXT ( "v=DKIM1; g=*; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOC"
"AQ8AMIIBCgKCAQEArwJp9KDhf44dzWbtzDucXa0JGCyLCLcHiUkmxwlMJn5i9+ivX6jmKo5kXrpzD0B"
"rOu3bB0tKChd08Ozbx70w6+t3Ubmi8Dw+Sxc0rlvJtyOR4IpSLGJhmD7FP8q+fiaaY+NDEiqbdXdc8G"
"YE4yDpN//X9F+J8PQH2rs+WFI0A+xob2ezOMpX/qIuZzPVDAgsDKIyeXV316Zc8vh1Cq02ABFk/GfzZ"
"B5vYEkjFs8HKdj7ulnztGuOX0JVQHmt9BzwSUwIoEuUpaNiLs0UnxCKen4krme5ARZvSo5tQCm3GmXU"
"Me6FGsX2LM/bg2WDMzfNP2/NLRgXapFWiZIV9tmXcwIDAQAB" )

La segmentación se realiza encerrando entre paréntesis el valor del registro TXT y dividiendo la firma en cualquier número de partes de hasta 80 caracteres encerradas entre comillas dobles. Es importante señalar que debido al tamaño del registro TXT para firmas de 2048 bits, será imposible añadirlo a través de nsupdate y por tanto sólo será posible hacerlo editando directamente el archivo correspondiente a la zona de reenvío del dominio.

Ejecute lo siguiente para verificar el registro después de ser añadido a la zona de reenvío del dominio involucrado:

dig default._domainkey.mi-dominio.com TXT

La respuesta debe ser similar a la siguiente:

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.23.rc1.el6_5.1 <<>>
default._domainkey.mi-dominio.com TXT
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23403
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;default._domainkey.mi-dominio.com. IN TXT

;; ANSWER SECTION:
default._domainkey.mi-dominio.com. 1440 IN TXT "v=DKIM1; g=*; k=rsa; p=MIIBI
jANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwJp9KDhf44dzWbtzDucXa0JGCyLCLcHiUkmxwlMJ
n5i9+ivX6jmKo5kXrpzD0BrOu3bB0tKChd08Ozbx70w6+t3Ubmi8Dw+Sxc0rlvJtyOR4IpSLGJhmD7FP
8q+fiaaY+NDEiqbdXdc8GYE4yDpN//X9F+J8PQH2rs+WFI0A+xob2ezOMpX/qIuZzPVDAgsDKIyeXV31
6Zc8vh1Cq02ABFk/GfzZB5vYEkjFs8HKdj7ulnztGuOX0JVQHmt9BzwSUwIoEuUpaNiLs0UnxCKen4kr
me5ARZvSo5tQCm3GmXUMe6FGsX2LM/bg2WDMzfNP2/NLRgXapFWiZIV9tmXcwIDAQAB"

;; Query time: 75 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Mar 25 12:32:33 2014
;; MSG SIZE rcvd: 312

Es importante señalar que este registro debe ser publicado sólo hasta haber concluida la configuración de Sendmail o Postfix y se debe esperar desde 1 hasta 24 horas para que el nuevo registro sea replicado en el resto de los servidores DNS del mundo. Éste es el motivo por el cual se recomienda realizar los procedimientos sólo durante el fin de semana.

Bibliografía: