El SysAdmin del 3er Mundo

todo lo que expliqué mientras nadie prestaba atención

dkim y spf en postfix

| Comments

Aunque no de mi agrado, reconozco que es una solución muy buena. DKIM y SPF, se ha vuelto hoy en día un mecanismo para mitigar el SPAM en el correo electrónico.

Esto no quita, que un spammer puede hacerse con un buen esquema de DKIM para sus dominos de porquería; lo cual sería un estupendo negocio, teniendo en cuenta que un servidor puede tener tantos dominios como quiera. Si conoce a algún spammer que quiera tener DKIM y SPF en su negocio, por favor, mándele mi tarjeta.

Me imagino que a los usuarios de nauta, les duela bajar un mensaje que aparentemente tiene dos lineas, pagando por uno que realmente tiene más de 20 líneas de pura mierda que no les incumbe. Espero que etecsa se digne a retirar encabezados innecesarios como esos (para el cliente).

Por otra parte, mucha gente tiene antivirus que modifican el correo o son fanáticos a instalar mil gangarreas (mailscanner, clamav, etc…) que también modifican el correo. Con esto, DKIM y SPF se van a la mierda.

Le diré que hice con un postfix que ya estaba instalado en un debian8 para ponerle DKIM y SPF.

Instalamos los jueguetes requeridos ante todo:

1
apt-get install opendkim opendkim-tools postfix-policyd-spf-python

y establecemos los permisos adecuados, ojo con esto, ya que dkim es muy riguroso con el tema de los permisos

1
adduser postfix opendkim

SPF

Ahora procedemos a crear el registro DNS. Como hay muchos DNS y cada quién tiene sus preferencias, me reduciré a describir de manera abstracta los registros. Usted, aterrize la idea en su DNS.

Esto tiene DOS formas de hacerse:

La primera:

Declarar que TODOS los MX del dominio, pueden mandar correo (lo cual inspira desconfianza) en este caso, registra un puntero del tipo TXT con el siguiente valor

v=spf1 mx -all

Por ejemplo, bind9

“registro”
1
@               IN      TXT     "v=spf1 mx -all"

La segunda:

Declarar que un host, que tiene un registro A, está autorizado a enviar correos (esta me gusta más, si tienes un solo servidor de correo) Si fueran varios, por ejemplo 3. Podrías declarar un A para cada uno y de manera individual, ellos generarían su SPF apuntándose a si mismo.

v=spf1 a:mx1.tudominio.cu -all

Como ya sabemos, un puntero MX siempre deberá apuntar a un rgistro A, ya que no se recomienda apuntar a un CNAME…

Nota para los apurados: “Si declaras ambos registros, no pincha, LEE!!”

Otra cosa, puedes declarar -all o ~all El primero le dirá al receptor que si el correo no viene del dominio que dice enviarlo (el puntero A o los MX), lo rechace porque es falso (muy radical) y el segundo, que empieza por ~ le indica al receptor, que puede recibir el mensaje y si no pude verificarlo que lo marque como spam, pero que por favor, no lo rechaze.

Esto nos lleva a una:

Situación peligrosa

Cuba, un descerebrado configuró verificación de DKIM, porque está de moda. PERO! Está detrás de un smarthost (pasarela) o simplemente, su configuración de DNS no vale un quilo (por culpa del proveedor)

Metedura de pata - A:

Ese servidor de correo, que se cree Oggun con machete en mano; descartará todo correo con -all debido a su incapacidad de realizar un lookup decente.

Metedura de pata - B:

Uno más descerebrado todavía, vio que DKIM estaba de moda y sin importar que no tiene control de su DNS, lo hizo todo, saltándose el paso del DNS. Su servidor le estará gritando a toda voz al mundo entero, que está falseando el dominio

Su ignorancia le costará caer de cabeza en las listas negras…

Y es que:

Generalmente, los servidores que entregan a través de un smarthost, carecen de DNS real. También hay una pila de gente que administran servidores sin tener control de su DNS.

Seguimos…

Ya que tenemos el SPF pinchando, podemos añadirle chequeo de SPF a nuestro postfix que tiene bien configurado el DNS y entrega de cara a internet sin smarthost

En el fichero /etc/postfix/master.cf le agregamos esto:

master.cf
1
2
policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

y a los posftfix cubanos, le decimos que sea paciente con el proceso de verificación, incrementando el tiempo que tiene que esperar por el policyd, ya que dicha verificación puede tardar (dns lookup, cpu a tope, etc..) Añadimos esto a /etc/postfix/main.cf

main.cf
1
policyd-spf_time_limit = 3600

Ahora viene una parte complicada, pues no hay manera de que pueda reflejarla como para copiar y pegar.

Deberás modificar tus reglas de postfix, de forma que antepongas el chequeo SPF, como una más de tus restricciones de recibo. Para mi caso, está bien la última linea.

“scpe del main.cf”
1
2
3
4
5
6
7
8
9
10
11
12
smtpd_sender_restrictions =
   reject_non_fqdn_sender,
   reject_non_fqdn_recipient,
   permit_sasl_authenticated,
   reject_unknown_sender_domain,
   reject_unknown_recipient_domain,
   reject_rbl_client bl.spamcop.net,
   reject_rbl_client sbl.spamhaus.org,
   reject_rbl_client xbl.spamhaus.org,
   defer_unauth_destination,
   reject_unverified_sender,
   check_policy_service unix:private/policyd-spf

Reinicia postfix y chequea el /var/log/mail.log para que veas SPF pinchando.

DKIM

Me parece que la configuración de DKIM en debian está buena, pero por si las moscas. Copias esta que pongo aquí y métela en tu /etc/opendkim.conf

/etc/opendkim.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Syslog          yes
UMask           002
UserID          opendkim
KeyTable        /etc/opendkim/key.table
SigningTable        refile:/etc/opendkim/signing.table
ExternalIgnoreList  /etc/opendkim/trusted.hosts
InternalHosts       /etc/opendkim/trusted.hosts
Canonicalization    relaxed/simple
Mode            sv
SubDomains      no
#ADSPAction     continue
AutoRestart     yes
AutoRestartRate     10/1M
Background      yes
DNSTimeout      5
SignatureAlgorithm  rsa-sha256
OversignHeaders     From

De ahí puede que quizás te interese la variables SubDomains, sobre todo si eres proveedor de correo.

Como ya te dije, los permisos son sumamente importantes en este caso

permisos
1
chmod u=rw,go=r /etc/opendkim.conf

Ahora creamos el directorio donde vamos a meter todo el zoológico requerido para que DKIM pinche. Hay quién prefiere meterlo en /var, para mi en /etc/opendkim es un buen lugar.

“creando el directorio de residencia”
1
2
3
4
mkdir /etc/opendkim
mkdir /etc/opendkim/keys
chown -R opendkim:opendkim /etc/opendkim
chmod go-rw /etc/opendkim/keys

La Firma

Ahora vamos a crear la tabla de rúbricas (se aceptan contribuciones para traducir). Ahí, ponemos una linea por cada dominio que tengas. Creas el fichero /etc/opendkim/signing.table y está recomendado que le pongas lo siguiente:

“como dicen que debe ser”
1
   *@tudominio.cu   tudominio

Nota para los imbéciles: No olvide remplazar tudominio.cu por el nombre del dominio suyo.

Con eso, casamos todos los correos que parezcan a tu dominio, con el DKIM que llamamos “tudominio”, si quiere atrás le puede poner “pepe”. Lo que debe quedarte claro, es que todos los correos que macheen a la expresión regular de alante, pasarán por el filtro llamado tudominio (o “pepe” si lo cambiaste) ¿Se entendió?

Por ejemplo, si tu dominio fuera *@cacocum.hlg.sld.cu podrías ponerle detrás “midkim” para que todos los correos de ese dominio, se firmen con la firma que será configurada bajo el nombre “midkim” Quedaría así:

  *@cacocum.hlg.sld.cu  midkim

Resumen:

El primero campo, es una expresión regular que mache las direcciones de correo y el segundo el nombre de la firma que se usará. Para mayor confusión, se recomienda que se hagan nombres parecidos. Finalmente nos quedó así:

/etc/opendkim/signing.table
1
*@tudominio.cu    tudominio

La clave

Ahora creamos el fichero, donde le diremos a “midkim” donde va a encontrar su parafernalia cifradora. Crea el fichero /etc/opendkim/key.table y ponle dentro esto:

/etc/opendkim/key.table
1
tudominio     tudominio.cu:YYYYMM:/etc/opendkim/keys/example.private

IMPORTANTE

Remplaza YYYYMM por el año y el número de mes en el que estamos.

SI NO, NO PINCHA

A mi me quedó así:

/etc/opendkim/key.table
1
tudominio     tudominio.cu:201606:/etc/opendkim/keys/example.private

Ya que estamos en el año 2016 y el mes 06 no el 6 (lleva cero delante).

Ojo aquí, ya que si tienes más dominios, es complicado. Nota que debes reflejar a localhost con sus pertinentes ip, además, tu nombre de host, tu dominio y el nombre del host conjugado con el dominio. Siendo entonces fulanito el nombre del host, quedaría así en el fichero /etc/opendkim/trusted.hosts

/etc/opendkim/trusted.hosts
1
2
3
4
5
6
127.0.0.1
::1
localhost
fulanito
fulanito.dominio.cu
dominio.cu

Los permisos, ya tu sabes:

“seteando permisos”
1
2
chown -R opendkim:opendkim /etc/opendkim
chmod -R go-rwx /etc/opendkim/keys

FINALMENTE! Vamos a generar la clave para el dominio:

“generando las claves”
1
2
cd /etc/opendkim/keys/
opendkim-genkey -b 2048 -r -s 201606

Las claves se generan en base a la fecha, pero luego se colocan en base al dominio. Esto se hace porque hay que renovarlos pero si configuramos opendkim para que apunte a un fichero cuyo nombre sea la fecha, tendríamos que cambiar la configuración cada vez que renovamos.

“la clave por su nombre”
1
2
mv 201606.private tudominio.private
mv 201606.txt tudominio.txt

Si tu clave se llamase “pepe” o “midkim”, ya sabes que esos ficheros se llamarían “pepe.private” o “tudkim.txt” ¿Entiendes ahora? Seguimos…

El argumento -b indica la longitud de clave en Bit. En otros tiempo 1024 era la tisa, pero ahora, se recomienda usar 2048 porque las máquinas son más potentes. Quizás dentro de un par de años, sea 4096.

Bueno, ya sabes, la ceremonia de los permisos:

“seteando permisos”
1
2
chown -R opendkim:opendkim /etc/opendkim
chmod -R go-rw /etc/opendkim/keys

Arranca opendkim y asegúrate mirando los; log que esté pinchando.

“arranca opendkim”
1
2
systemctl restart opendkim
systemctl status -l opendkim

El DNS

El patico feo de internet, el DNS. El remedio que se inventó pa ir tirando y acabó quedándose con su pésimo diseño y su horrible arquitectura que hasta el sol de hoy, pretende llamarse “distribuida”

Lázaro Armando Mi Criterio Sobre DNS

Agregamos le registro TXT con la clave. Te cuento que el fichero “.txt” contiene el tabaco base64 que usualmente vemos en el encabezado DKIM-Signature, pues proviene de este registro TXT que estamos creando.

Añade un registro del tipo TXT que apunte a un hostname llamado 201606._domainkey dentro de tu domino. Pero ahora viene la parte difícil:

Copia el texto que contiene el fichero tudominio.txt dentro de la primera comilla hasta la última, pero sin tomar las comillas.

¿Se entendió?

O sea, dentro del fichero tiene esto:

“tudominio.txt”
1
201606._domainkey  IN  TXT ( "**v=DKIM1; k=rsa; s=email; " "p=ZjiONVGXom64jANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5oIUrFDWZK7F4thFxpZa2or6jBEX3cSL6b2TJdPkO5iNn9vHNXhNX31nOefN8FksX94YbLJ8NHcFPbaZTW8R2HthYxRaCyqodxlLHibg8aHdfa+bxKeiI/xABRuAM0WG0JEDSyakMFqIO40ghj/h7DUc/4OXNdeQhrKDTlgf2bd+FjpJ3bNAFcMYa3Oeju33b2Tp+PdtqIwXR" "ZksfuXh7m30kuyavp3Uaso145DRBaJZA55lNxmHWMgMjO+YjNeuR6j4oQqyGwzPaVcSdOG8Js2mXt+J3Hr+nNmJGxZUUW4Uw5ws08wT9opRgSpn+ThX2d1AgQePpGrWOamC3PdcwIDAQAB**")  ; ----- DKIM key 201606 for tudominio.cu

Al extraer la parte que nos interesa, no quedamos con esto (sin las comillas)

“la clave sin las comillas”
1
**v=DKIM1; k=rsa; s=email; p=ZJiONVGXom64zhNjwdAmo2XnMhAXeGXxB0p5PJkHxUk5XMXNaoUbMwfGOBOQYKsiQp0k9KwcYu2SNAlcFrGIugPG035Ng4r8mlBRLS5+dak90HuH+hb2d8aa+djRFn4PIS2RcAZZJgJjRgF1NbWZpBlj8IpXJ7MywrUxtj1e+TU/tCiWQxCc9uMqgWA53NeqRGEFPwCuTfDMKWbbMhZkbe+pOOtEqQBQ0HsvJ3n09ZNhh3AjbNP6JOpAyK+4hqHohDTrLhxdSFsNiaoAaJXsxDdAHIs2U3QNmrbAFEg7aPOBgaHLXv28k88EDqo4cIuOxa/c24e3F4O6TY3fpydRmekadtCW+waY3aCIIwIA7DdAABFUTR3ABI8WnFTjgDyj1/IQ53Af**

OJO Tiene más comillas en el medio!!!!

Auxíliate de un editor de texto decente. Deshabilita el wrap y busca la comilla como cadena de texto.

Ese texto, será el valor del puntero TXT

A mi me quedó así:

“puntero TXT de 201606._domainkey”
1
201601._domainkey    IN      TXT     "**v=DKIM1; k=rsa; s=email; p=ZJiONVGXom64zhNjwdAmo2XnMhAXeGXxB0p5PJkHxUk5XMXNaoUbMwfGOBOQYKsiQp0k9KwcYu2SNAlcFrGIugPG035Ng4r8mlBRLS5+dak90HuH+hb2d8aa+djRFn4PIS2RcAZZJgJjRgF1NbWZpBlj8IpXJ7MywrUxtj1e+TU/tCiWQxCc9uMqgWA53NeqRGEFPwCuTfDMKWbbMhZkbe+pOOtEqQBQ0HsvJ3n09ZNhh3AjbNP6JOpAyK+4hqHohDTrLhxdSFsNiaoAaJXsxDdAHIs2U3QNmrbAFEg7aPOBgaHLXv28k88EDqo4cIuOxa/c24e3F4O6TY3fpydRmekadtCW+waY3aCIIwIA7DdAABFUTR3ABI8WnFTjgDyj1/IQ53Af**"

Completo! Vamos a probarlo a ver que pasa:

“1, 2, 3, probando”
1
opendkim-testkey -d example.com -s 201606

Si sale silentemente sin mostrar algo. Es que todo está bien.

opendkim y postfix

Finalmente, nuestro postfix tendrá el privilegio de firmar los correos usando el aparataje recién configurado. Vamos a crearle un cuartico de dkim en la casa de postfix

“dkim en postfix”
1
2
mkdir /var/spool/postfix/opendkim
chown opendkim:postfix /var/spool/postfix/opendkim

y habilitamos el socket de opendkim, editando el fichero /etc/default/opendkim

/etc/default/opendkim
1
2
3
4
5
6
7
8
9
10
# Command-line options specified here will override the contents of
# /etc/opendkim.conf. See opendkim(8) for a complete list of options.
#DAEMON_OPTS=""
#
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
#SOCKET="inet:54321" # listen on all interfaces on port 54321
#SOCKET="inet:12345@localhost" # listen on loopback on port 12345
#SOCKET="inet:12345@192.0.2.1" # listen on 192.0.2.1 on port 12345

Note como retiramos el comentario de la línea 7

Ahora declaramos en postfix que debe usar a opendkim como demonio de preprocesamiento en el típico /etc/postfix/main.cf

/etc/postfix/main.cf
1
2
3
4
5
6
# Milter configuration
# OpenDKIM
milter_default_action = accept
milter_protocol = 2
smtpd_milters = local:/opendkim/opendkim.sock
non_smtpd_milters = local:/opendkim/opendkim.sock

Finalmente, reinicia opendkim y postfix

“systemctl”
1
systemctl restart opendkim postfix

COMPLETO!!!

Con eso hemos terminado. Para probarlo, puede enviar un correo a check-auth@verifier.port25.com

Esa dirección le hará una prueba al DKIM+SPF de tu correo. No solo eso, le hará una prueba del Pi al Pa a tu correo y te dirá todo lo que necesitas.

Si quieres ponerle la guinda al pastel, puede añadirle ADSP (Author Domain Signing Practices) a tu esquema. Esto indica que todos los correos que salgan de tu dominio deben estar firmados con DKIM, proveiendo aún más confianza al receptor.

Crea un registro TXT para el hostname adsp.domainkey y el valor del TXT será dkim=all. A mi me quedó así:

“registro”
1
_adsp._domainkey     IN      TXT     "dkim=all"

Con eso, tus correos no caerán más en la bandeja SPAM de gmail.

Otra cosa importante, asegúrate de tener el reverse lookup de tu MX bien puesto.

Si este artículo te resultó interesante, considere donar 0.06 BTC: 1Kg4gu3e7u8HUw8bj5NbBciRg6Y56kuFCU

Comments