Correo electronico

De Taquiones


Correo electrónico

Guía de ayuda para configurar un servidor de correo electrónico en un servidor Linux.

Mecanismos principales

SPF

Un registro SPF tiene el siguiente aspecto:

bovalo.org.        10800    IN    TXT    "v=spf1 include:_mailcust.gandi.net ?all"

Y para implementar SPF en un servidor de correo como exim4 es necesario actuar en dos sitios:

  1. Configurar el registro DNS del dominio para indicar al exterior que está autorizado para enviar mensajes en su nombre.
  2. Configurar el servidor para que valide los correos entrantes consultando los registros DNS de los que proceden.

El formato de un registro SPF en el DNS tiene las siguientes partes:

  • v=spf1versión empleada del mecanismo SPF.

Para crear el registro DNS se pueden emplear herramientas como SPF Wizard y obtener así el formato correcto que luego se deberá incluir en el registro DNS. Es útil echarle un vistazo antes a la documentación oficial porque aclara conceptos básicos y proporciona más enlaces interesantes.

La validación del registro DNS (una vez que exista y se ha propagado) puede realizarse por varios medios:

DKIM

DKIM es el acrónimo de Domain Keys Identified Mail y es un mecanismo que también consta, como [#SPF], de dos partes; ambas deben comenzar con la creación de un par de claves pública/privada que se utilizarán en:

  • La parte pública en un registro del DNS con formato especial.
  • La parte privada en el servidor que envía el correo y con la que firmará todos los que emita.

De esta manera aquél servidor que reciba nuestro correo firmado podrá descargar la clave pública de los registros del DNS y efectuar la verificación sobre los mensajes.

Los pasos a seguir mencionados en ésta o ésta página son:

  1. Elegir un texto breve como selector que se utilizará en ambos lados: DNS y exim. Vale cualquier cosa pero emplear algo estándar como exim o default es buena idea para no tener que recordar nombres extraños cuando verificamos lo que hemos hecho.
  2. Crear un par de claves pública/privada con openssl teniendo en cuenta las limitaciones de espacio del registrador (gandi.net por ejemplo sólo admite 1024 bytes de longitud).
  3. Configurar exim para que emplee las clave privada para firmar los mensajes salientes.
  4. Crear y publicar un registro TXT en el DNS con la parte pública.
  5. Verificar (una vez todo se ha actualizado) que los mensajes están correctamente firmados:
    1. Emplear un servicio en línea como DKIM Key Checker
    2. Enviar un correo a check-auth@verifier.port25.com o similar para obtener resultados desde el punto de vista del receptor.

La configuración de exim es sencilla. Una vez hemos guardado a salvo la clave cambiamos la configuración (el archivo /etc/exim4/conf.d/transport/10_exim4-config_transport-macros por ejemplo) para indicar que lo emplee cada vez que transporte un correo.

DKIM_DOMAIN = ${lc:${domain:$h_from:}}
 DKIM_FILE = /etc/exim4/dkim/dominio.com.private.key
 DKIM_PRIVATE_KEY = ${if exists{DKIM_FILE}{DKIM_FILE}{0}}
 DKIM_SELECTOR = exim

Podemos revisar la configuración de exim con:

# exim4 -bV
Exim version 4.84 #2 built 17-Feb-2015 17:01:49
Copyright (c) University of Cambridge, 1995 - 2014
(c) The Exim Maintainers and contributors in ACKNOWLEDGMENTS file, 2007 - 2014
Berkeley DB: Berkeley DB 5.3.28: (September  9, 2013)
Support for: crypteq iconv() IPv6 PAM Perl Expand_dlfunc GnuTLS move_frozen_messages Content_Scanning DKIM Old_Demime PRDR OCSP
Lookups (built-in): lsearch wildlsearch nwildlsearch iplsearch cdb dbm dbmjz dbmnz dnsdb dsearch ldap ldapdn ldapm mysql nis nis0 passwd pgsql sqlite
Authenticators: cram_md5 cyrus_sasl dovecot plaintext spa
Routers: accept dnslookup ipliteral iplookup manualroute queryprogram redirect
Transports: appendfile/maildir/mailstore/mbx autoreply lmtp pipe smtp
Fixed never_users: 0
Size of off_t: 8
Configuration file is /var/lib/exim4/config.autogenerated
# 

Registro DNS para DKIM

Se emplea un registro tipo TXT cuyo valor es un nombre DNS ficticio formado por el selector de clave definido en DKIM_SELECTOR, el literal _domainkey y el nombre del dominio completo (empresa.net por ejemplo).

Así pues quedaría de la siguiente forma:

default._domainkey.empresa.net 10799 IN TXT "v=DKIM1;p=..." 

donde el valor númerico es el TTL del registro y la clave pública va como valor del parámetro p, toda junta sin saltos de línea ni espacios.

DMARC

Recetario

Reescribiendo el asunto del mensaje

Cuando necesitamos reescribir el campo asunto de un mensaje de correo podemos utilizar una mezcla de herramientas que trabajan bien entre sí:

  • #reformail (en el paquete maildrop) para quitar y poner cabeceras al mensaje.
  • Perl y el módulo Encode por si es necesario manipular textos codificados.
  • maildrop o algo similar para filtrar el correo justo antes de su entrega.

Todo ello envuelto en un programa como el siguiente ...

#!/bin/sh

#   Como ayuda para depurar fijamos un valor 
#   predeterminado para la etiqueta 
LABEL=${1:-LABEL}

#   Tenemos que salvar todo el mensaje entrante en un archivo temporal
#   porque las operaciones posteriores se llevan en dos fases
TMPMSG=/tmp/$(basename $0).$$ 
cat > $TMPMSG

# La primera fase es leer el campo 'Subject' y almacenarlo en una 
# variable,
SUBJECT=$(reformail -x Subject: < $TMPMSG)

# a la que añadimos el etiquetado entre corchetes,
NEWSUBJECTPARAM="Subject: [${LABEL}] ${SUBJECT}"

# y la segunda fase consiste en sustituir el campo 'subject' por el que hemos
# formado y renombrar el anterior con el prefijo 'old-' para no perder
# contenido.
reformail -i "${NEWSUBJECTPARAM}" < $TMPMSG

... y situado en el filtro de correo de la cuenta o cuentas de correo que necesitamos; lo siguiente es un ejemplo de cómo añadir una etiqueta especial a aquellos mensajes que contengan notificaciones de Correos y Telégrafos y está situado dentro del archivo $HOME/.mailfilter:

#
#   Notificaciones e correos.es
#
if (/^From:.*correos.es/) 
{
    xfilter "/usr/local/bin/add2subject CORREOS"
}
Testear autentificación IMAP
  • Ref: How to test an IMAP server by using telnet

Si utilizamos una conexión plana con un servidor IMAP lo podremos hacer así:

 $ telnet taquiones.net imap
 Trying 80.68.92.119...
 Connected to taquiones.net.
 Escape character is '^]'.
 * OK [CAPABILITY IMAP4rev1 ... AUTH=PLAIN] Dovecot ready.
 a1 LOGIN victor PASSWORD
 a1 OK [CAPABILITY IMAP4rev1 ... SPECIAL-USE] Logged in
 a2 LOGOUT
 a3 LOGOUT
 * BYE Logging out
 a3 OK Logout completed.
 Connection closed by foreign host.

Y si necesitamos una conexión segura tendremos que utilizar openssh en lugar de telnet variando el puerto según el servidor esté configurado:

 $ openssl s_client -connect taquiones.net:995 -quiet
 depth=1 C = ES, ST = Madrid, O = Taquiones, OU = CA, CN = taquiones.net, emailAddress = postmaster@taquiones.net
 verify error:num=19:self signed certificate in certificate chain
 verify return:0