Debian Jessie - SPF DKIM con Postfix y Spamassassin

En este articulo voy a documentar la forma de configurar SPF (Sender Policy Framework) y DKIM (DomainKeys Identified Mail) en Debian Jessie con Postfix y Spamassassin para evitar la sumplatanción de correos.

Suponemos que mi servidor de correo esta bajo el dominio dominio.com y el nombre del host es correo.dominio.com.

Configurando SPF
SPF es el responsable de identificar mediante la IP y por medio de los registros del DNS, a los servidores de correo SMTP autorizados para el envío de mensajes de un dominio concreto.
Agregamos  al archivo /var/bind9/chroot/var/lib/bind/db.dominio.com las siguientes lineas

@          IN  TXT "v=spf1 ip4:10.10.10.0/29 a mx ~all"
correo                   IN      TXT     "v=spf1 a mx -all"

# Reiniciamos
systemctl restart bind9

# Probamos nuestra configuracion
host -t txt dominio.com
host -t txt correo.dominio.com

# Activamos nuestro registro SPF en postfix

# Instalamos los paquetes postfix-policyd-spf-python postfix-pcre
apt-get install postfix-policyd-spf-python postfix-pcre

Creamos el archivo /etc/postfix-policyd-spf-python/policyd-spf.conf con el siguiente contenido

### inicio archivo policyd-spf.conf
#  For a fully commented sample config file see policyd-spf.conf.commented

debugLevel = 1
defaultSeedOnly = 1

HELO_reject = False
Mail_From_reject = False

PermError_reject = False
TempError_Defer = False

skip_addresses = 127.0.0.0/8,::ffff:127.0.0.0/104,::1

### fin archivo policyd-spf.conf

# Editamos el archivo /etc/postfix/main.cf
# agregamos la siguiente linea

check_policy_service unix:private/policyd-spf,

# en la secion smtpd_recipient_restrictions después de reject_unauth_destination,

#  se vera de la siguiente manera
smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_recipient,
        reject_unauth_destination,
        check_policy_service unix:private/policyd-spf,

# además agregamos la linea siguiente al final del archivo main.cf
policyd-spf_time_limit = 3600

#  agregamos en el archivo /etc/postfix/master.cf la siguiente linea
policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf


# reiniciamos postfix
systemctl restart postfix

### con esto queda finalizado la configuracion de nuestro registro SPF

Configurando DKIM

# instalación opendkim
apt-get install opendkim opendkim-tools

# agregamos el usuario postfix al grupo opendkim
adduser postfix opendkim

# Modificamos el archivo /etc/opendkim.conf para que quede de la siguiente forma
### inicio archivo opendkim.conf

Syslog            yes
Domain            dominio.com
KeyFile            /etc/opendkim/keys/201711.private
Selector        201711
Canonicalization    simple
Mode            sv
SubDomains        no
LogWhy                  yes
UMask                   002
PidFile /var/run/opendkim/opendkim.pid
SignatureAlgorithm rsa-sha256
UserID                  opendkim:opendkim

OversignHeaders        From

KeyTable                /etc/opendkim/key.table
SigningTable            refile:/etc/opendkim/signing.table
ExternalIgnoreList      /etc/opendkim/trusted.hosts
InternalHosts           /etc/opendkim/trusted.hosts

### fin archivo opendkim.conf

# asegúrese del parámetro SigningTable quede con el prefijo refile:

# creamos las carpetas y archivos según se detalla a continuación
mkdir /etc/opendkim
mkdir /etc/opendkim/keys

root@srvcorreo:/etc/opendkim# cat signing.table
*@dominio.com     dominio

root@srvcorreo:/etc/opendkim# cat key.table
dominio     dominio.com:201711:/etc/opendkim/keys/201711.private

root@srvcorreo:/etc/opendkim# cat trusted.hosts
127.0.0.1
::1
localhost
201711  # este es el registro para la clave a generar
correo.dominio.com
dominio.com


# Generamos la clave dkim 201711
opendkim-genkey -s 201711 -d dominio.com -D /etc/opendkim/keys/ -vvv


# Damos los permisos a las carpetas y archivos

cd /etc/opendkim

chown -R opendkim:opendkim /etc/opendkim
chmod 644 /etc/opendkim/*
chmod 700 /etc/opendkim/keys
chmod 600 /etc/opendkim/keys/*

# Reiniciamos el servicio
systemctl restart opendkim

# Revisamos la clave generada
cd /etc/opendkim/keys

root@srvcorreo:/etc/opendkim/keys# cat 201711.txt
201711._domainkey    IN    TXT    ( "v=DKIM1; k=rsa; "
      "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+wVtgfP7+gPfm9oTUHQAxFl+2E03LTVlPBOMRVAcXeEz1ruZ6q8T9hTRsGdXcHxJo0pukQ5kx2/oR36QwHTKVd1aLpTFGp+d7AEvIm5O+zyZZWBmoTGgbwTo8zKavGwWy9Vn2/GTsaXtC4RPD+PwtB4IuYjiiYq85Rrj5kRqIQQIDAQAB" )  ; ----- DKIM key 201711 for dominio.com

# El registro para DNS deberá quedar de la siguiente manera, elimina los parentesis y los signos " que estan de mas se deberá ver de la siguiente manera
201711._domainkey    IN    TXT    "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+wVtgfP7+gPfm9oTUHQAxFl+2E03LTVlPBOMRVAcXeEz1ruZ6q8T9hTRsGdXcHxJo0pukQ5kx2/oR36QwHTKVd1aLpTFGp+d7AEvIm5O+zyZZWBmoTGgbwTo8zKavGwWy9Vn2/GTsaXtC4RPD+PwtB4IuYjiiYq85Rrj5kRqIQQIDAQAB"   ; ----- DKIM key 201711 for dominio.com
# Agregamos la clave anterior a nuestro DNS en el archivo /var/bind9/chroot/var/lib/bind/db.dominio.com

# Reiniciamos los servicios
systemctl restart opendkim bind9

# Probamos nuestra clave
opendkim-testkey -d dominio.com -s 201711 -vvv

# Veremos lo siguiente:
opendkim-testkey: using default configfile /etc/opendkim.conf
opendkim-testkey: key loaded from /etc/opendkim/keys/201711.private
opendkim-testkey: checking key '201711._domainkey.dominio'
opendkim-testkey: key not secure
opendkim-testkey: key OK

## Puede verificar la clave desde fuera de su red en la siguiente dirección http://dkimcore.org/c/keycheck

## Puede revisar la respuesta de su DNS en http://network-tools.com/nslook/Default.asp utilice la clave 201711._domainkey.dominio.com

# Activamos nuestra clave DKIM en postfix

# Creamos la carpeta del socket y le damos los permisos
mkdir /var/spool/postfix/opendkim
chown opendkim:postfix /var/spool/postfix/opendkim


# Configuramos el socket
root@srvcorreo:/etc/opendkim# cat /etc/default/opendkim
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"

# Agregamos las siguientes lineas al archivo /etc/postfix/main.cf
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:/opendkim/opendkim.sock, unix:spamass/spamass.sock
non_smtpd_milters = unix:/opendkim/opendkim.sock, unix:spamass/spamass.sock

# Note las ultimas 2 lineas hay 2 sockets uno para spamassassin y el otro para opendkim

# Reiniciamos los servicios
systemctl restart opendkim postfix

# Enviamos  correo de prueba a la siguiente dirección check-auth@verifier.port25.com y si todo esta bien, tendremos una respuesta similar a la siguiente:

==========================================================
Summary of Results
==========================================================
SPF check:          pass
DKIM check:         pass
SpamAssassin check: ham

==========================================================
Details:
==========================================================

# Agregamos el siguiente registro TXT al dns en el archivo /var/bind9/chroot/var/lib/bind/db.dominio.com
_adsp._domainkey    IN    TXT    "dkim=all"

# Si todo esta bien podemos agregar DMARC para recibir reportes de nuestro servidor de correos agregando otro registro TXT a nuesto DNS como el siguiente
_dmarc            IN    TXT    "v=DMARC1;p=quarantine;sp=quarantine;adkim=r;aspf=r;fo=1;rf=afrf;rua=mailto:dmarc@dominio.com"

Espero que este tuturial les sirva reciban bendiciones de el Señor Jesús


Fuentes:
Configure SPF and DKIM With Postfix on Debian 8
https://www.linode.com/docs/email/postfix/configure-spf-and-dkim-in-postfix-on-debian-8

Que es el Mail Spoofing y como evitarlo usando SPF
https://www.webempresa.com/blog/que-es-el-mail-spoofing-y-como-evitarlo-usando-spf.html


Comentarios