Firma tu correo con opendkim y evita ser tratado como spammer

Una manera de certificar nuestro correo para evitar ser rechazados como spam, y de comprobar también los que nos llegan, es instalar el software opendkim, la implementación abierta y en estos momentos más actualizada de DKIM (dkim-milter). DKIM implementa un mecanismo de autentificación de correo de forma que éste puede ser validado por el destinatario mediante criptografía de clave pública. El proceso es muy sencillo: se generan dos claves para el servidor, una pública y una privada, la clave pública se coloca en un registro DNS, se configura opendkim para que sepa dónde encontrarlas y Postfix (o SendMail) para que utilize DKIM y listo. Todos nuestros correos se enviarán firmados y se comprobará la autenticidad de los que se reciban (siempre que contengan una clave DKIM).
Lo he probado sobre CentOS 5 pero no debería haber problema con otras versiones. En primer lugar descargamos opendkim desde el repositorio REHL EPEL de Fedora que aunque no está soportado oficialmente por CentOS, sirve a nuestros propósitos. Si no tienes dicho repositorio ejecuta:
wget http://dl.fedoraproject.org/pub/epel/5/x86_64/epel-release-5-4.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
sudo rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm

En estas notas se asume que:

  • Usamos una versión actual de Linux compatible Red-Hat (RHEL 5/6, CentOS 5/6, Fedora...)
  • Está corriendo una MTA capaz de correr un filtro de correo (milter) como Postfix 2.3.3 o superior (ejecuta postconf -d mail_version) o SendMail
  • La configuración de Postix (o SendMail) está actualmente activa
  • Si prefieres usar Postfix debes detener SendMail (ejecuta service sendmail status para verificarlo), de hecho la distribución CentOS 5 recomienda incluso desinstalar SendMail
  • Si prefieres usar SendMail debes detener Postfix (service postfix status para verificarlo)
  • Todo los ejemplos se ejecutan como root, si lo pruebas mediante sudo puede que algo no funcione como debe
Empezamos pues instalando opendkim: yum install opendkim y creando un usuario: useradd -s /sbin/nologin -b /var/run/opendkim opendkim

Generación de claves

Por defecto, cuando opendkim se instala se crean dos ficheros de clave (publica y privada) en la carpeta /etc/opendkim/keys: default.private y default.txt, usando el nombre de tu dominio. Nosotros vamos a generarlos de todas formas para aprender el proceso. El primer paso es elegir un selector, esto es, una palabra clave que será asociada con ambas claves, incluida en todas las firmas y publicada como registro DNS. En el ejemplo usaré el selector clave. A continuación nuestro nombre de dominio: aquí usaré ejemplo.com
mkdir /etc/opendkim/keys/ejemplo.com
/usr/sbin/opendkim-genkey -D /etc/opendkim/keys/ejemplo.com/ -d ejemplo.com -s clave
chown -R opendkim:opendkim /etc/opendkim/keys/ejemplo.com
mv /etc/opendkim/keys/ejemplo.com/clave.private /etc/opendkim/keys/ejemplo.com/clave
La primera línea crea la carpeta ejemplo.com donde guardaremos nuestras claves, la segunda genera las claves: -D para que las guarde en la carpeta creada, -d el dominio para el que las creamos y -s el selector que dará nombre a los ficheros. La tercera linea asigna la carpeta al usuario opendkim y la cuarta simplemente renombra el fichero *.private para tener un nombre más manejable. Para ver las opciones de opendkim-genkey puedes consultar su web o cargar man.

Editar los ficheros de configuración

Los ficheros de configuración de opendkim son:
  • /etc/opendkim.conf – configuración principal
  • /etc/opendkim/KeyTable – lista de claves disponibles para firmas
  • /etc/opendkim/SigningTable - lista de dominios y/o cuentas a las que se les permite firmar
  • /etc/opendkim/TrustedHosts – lista de servidores fiables (trust) cuando se firma o se verifica
Cuando se instala DKIM el fichero principal de configuración está configurado para modo verificación sólo (v) para evitar que se marquen como spam los correos mientras se configura adecuadamente. Esta es una de las opciones que vamos a modificar. El fichero opendkim.conf debe quedar así:

## CONFIGURATION OPTIONS

# Specifies the path to the process ID file.
PidFile /var/run/opendkim/opendkim.pid

# Selects operating modes. Valid modes are s (signer) and v (verifier). Default is v.
Mode    sv

# Log activity to the system log.
Syslog  yes

# Log additional entries indicating successful signing or verification of messages.
SyslogSuccess yes

# If logging is enabled, include detailed logging about why or why not a message was
# signed or verified. This causes a large increase in the amount of log data generated
# for each message, so it should be limited to debugging use only.
#LogWhy yes

# Attempt to become the specified user before starting operations.
UserID  opendkim:opendkim

# Create a socket through which your MTA can communicate.
Socket  inet:8891@localhost

# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
Umask   002

# This specifies a file in which to store DKIM transaction statistics.
#Statistics              /var/spool/opendkim/stats.dat

## SIGNING OPTIONS

# Selects the canonicalization method(s) to be used when signing messages.
Canonicalization        relaxed/simple

# Domain(s) whose mail should be signed by this filter. Mail from other domains will
# be verified rather than being signed. Uncomment and use your domain name.
# This parameter is not required if a SigningTable is in use.
Domain                  ejemplo.com

# Defines the name of the selector to be used when signing messages.
Selector                clave

# Gives the location of a private key to be used for signing ALL messages.
#KeyFile                 /etc/opendkim/keys/default.private

# Gives the location of a file mapping key names to signing keys. In simple terms,
# this tells OpenDKIM where to find your keys. If present, overrides any KeyFile
# setting in the configuration file.
KeyTable                 refile:/etc/opendkim/KeyTable

# Defines a table used to select one or more signatures to apply to a message based
# on the address found in the From: header field. In simple terms, this tells
# OpenDKIM how to use your keys.
SigningTable                 refile:/etc/opendkim/SigningTable

# Identifies a set of "external" hosts that may send mail through the server as one
# of the signing domains without credentials as such.
ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts

# Identifies a set internal hosts whose mail should be signed rather than verified.
InternalHosts           refile:/etc/opendkim/TrustedHosts

Las claves generadas son de 1024 bits por defecto. Si quieres cambiar su longitud y experimentar recuerda cambiar la línea:
# Specifies the minimum number of key bits for acceptable keys and signatures.
MinimumKeyBits 1024

Descomenta las opciones KeyTable, SigningTable, ExternalIgnoreList e InternalHosts. Si sólo generamos una clave para un dominio especificamos éste en la directiva Domain. Configuramos ahora KeyTable para indicarle a DKIM dónde encontrar las claves. El formato es:
clave._domainkey.ejemplo.com ejemplo.com:clave:/etc/opendkim/keys/ejemplo.com/clave
en una sola línea. Si estableces múltiples claves debes añadir una línea para cada una:
clave._domainkey.ejemplo.com ejemplo.com:clave:/etc/opendkim/keys/ejemplo.com/clave
clave2._domainkey.ejemplo2.com ejemplo2.com:clave2:/etc/opendkim/keys/ejemplo2.com/clave2
Pasamos a configurar ahora SigningTable para indicarle a DKIM cómo usar las claves, qué selectores usar para firmar según el dominio:
*@ejemplo.com clave._domainkey.ejemplo.com
Con dicha línea indicamos que cualquier correo del dominio ejemplo.com debe ser firmado con el selector clave. Igualmente si establecemos varios dominios:
*@ejemplo.com clave._domainkey.ejemplo.com
micorreo@ejemplo3.com clave3._domainkey.ejemplo3.com
En este ejemplo se firman todos los correos de ejemplo.com pero sólo los correos micorreo del dominio ejemplo3.com, la opción del comodín (*) solo funciona si el fichero SigningTable aparece con el prefijo refile: en opendkim.conf, véase la documentación.
Ahora modificamos TrustedHosts para indicar a DKIM quién tiene permiso para usar estas claves. Como está referenciado por la directiva ExternalIgnoreList los hosts aquí listados se ignorarán cuando se verifiquen los correos entrantes y, como esta referenciado también por InternalHosts, todos los correos salientes serán firmados.
127.0.0.1
hostname.ejemplo.com
ejemplo.com
hostname1.ejemplo1.com
ejemplo2.com
Es importante que figure la ip 127.0.0.1 o DKIM no firmará correos salientes del host local. Si dispones de varios servidores en la misma red que reenvían su correo a través de éste y quieres que sus correos también sean firmados deben estar incluidos en esta lista, cada una en su propia línea. Cada entrada puede ser un nombre de dominio, un host, una ip (IPV4 o IPV6) o estilo CIDR (192.168.33.210/24). Tambien hay que tener en cuenta que si se desea firmar correo procedente de otros hosts hay que tener configurado el relay para dichos servidores.

Editar la configuración MTA

Para usuarios de Postfix añadir estas líneas a main.cf:
smtpd_milters           = inet:127.0.0.1:8891
non_smtpd_milters       = $smtpd_milters
milter_default_action   = accept
y, si la versión de Postfix es anterior a la 2.6:
milter_protocol   = 2
Para los usuarios de SendMail, editar el fichero de configuración .mc que se uso para compilar la versión instalada en tu servidor y añadir:
INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@localhost')
Recompilar e instalar de nuevo.

Iniciar OpenDKIM y reiniciar la MTA

Reseteamos la tabla hash de la shell: hash -r y arrancamos opendkim: service opendkim start. Debe aparece el mensaje
Starting OpenDKIM Milter:     [  OK  ]
si  aparece algo como
Starting OpenDKIM Milter: opendkim: /etc/opendkim.conf: configuration error at line 6: unrecognized parameter
hay que volver a repasar los pasos dados. Una vez iniciado opendkim refrescamos postfix: postfix reload o, si usamos SendMail: service sendmail restart. Si todo va bien podemos indicar al sistema que cargue opendkim en los reinicios: chkconfig opendkim on.

Añadir registros DNS

En este punto los correo enviados son firmados y los entrantes son verificados. Ahora debemos añadir alguna información a nuestra zona DNS para que otros servidores puedan verificar nuestra firma. Necesitamos la clave pública que obtenemos con cat /etc/opendkim/keys/example.com/clave.txt cuya salida será algo como
clave._domainkey IN TXT "v=DKIM1; g=*; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHY7Zl+n3SUldTYRUEU1BErHkKN0Ya52gazp1R7FA7vN5RddPxW/sO9JVRLiWg6iAE4hxBp42YKfxOwEnxPADbBuiELKZ2ddxo2aDFAb9U/lp47k45u5i2T1AlEBeurUbdKh7Nypq4lLMXC2FHhezK33BuYR+3L7jxVj7FATylhwIDAQAB" ; ----- DKIM default for example.com
Copiamos todo el contenido entre las comillas, sin incluirlas, y creamos dos registros en la zona DNS de tipo TXT:

  • clave._domainkey.ejemplo.com con la clave obtenida
  • _adsp._domainkey.ejemplo.com con el contenido dkim=unknown
Este registro publica nuestra política de firmas (Author Domain Signing Practices). Unknown es la directiva menos restrictiva y la más usada.

Comprobar DKIM

Podemos comprobar si DKIM está activo con un vistazo al log de la cola de correo:
tail -f /var/log/maillog (o tail -f /var/usr/local/psa/log/maillog en CentOS)
donde deberían aparecer unas líneas como éstas
opendkim[4397]: OpenDKIM Filter: mi_stop=1
opendkim[4397]: OpenDKIM Filter v2.4.2 terminating with status 0, errno = 0
opendkim[27444]: OpenDKIM Filter v2.4.2 starting (args: -x /etc/opendkim.conf)
y cuando enviamos un correo
opendkim[22254]: 53D0314803B: DKIM-Signature header added
También podemos enviar correos de prueba a

Brandon Checketts Email Validator
autorespond+dkim@dk.elandsys.com
sa-test@sendmail.net
check-auth@verifier.port25.com

Si lo probamos con GMail: enviamos un correo a cualquiera de las anteriores direcciones y se nos devolverá con el campo signed by indicando el nombre del dominio (opcion show details).

2 comentarios:

  1. Gracias.

    Por fin me funciona, tengo varios dominios diferentes y no había manera humana de que firmara los correos salientes.

    He seguido TODAS tus recomendaciones. Si no no funcionaba el programa.

    Probado en Debian 7

    ResponderEliminar
  2. Funciona muy bien gracias
    centos6

    ResponderEliminar