Cómo configurar el servidor de correo Postfix con DKIM

La instalación y configuración del servidor de correo (Agente de transferencia de correo, MTA) es una de las tareas típicas a las que se enfrenta cualquier administrador de sistemas. Aquí cubriremos la tarea y al final del artículo tendremos CentOS 7 con el servidor de correo Postfix que escucha el puerto 25 (SMTP) y entrega mensajes para el dominio seleccionado a los buzones de correo de los usuarios.

Primero, necesitamos tener los registros DNS de un dominio configurados correctamente. Esto se hace en 2 lugares:

Los registros A, TXT y MX se almacenan en el registrador de su dominio, GoDaddy para example.

Para verificar el registro usando el comando ‘dig’ con el nombre del registro y el nombre de dominio como argumento. En nuestro example, mi dominio andreybondarenko.com está configurado de la siguiente manera:

  ┌[root@andreybondarenko]─[~]
  └─10/09 08:37:08-# dig mx andreybondarenko.com
  [...]
  ;; ANSWER SECTION:
  andreybondarenko.com. 1800 IN MX 1 andreybondarenko.com.
  [...]

Eso indica que el correo para todo el dominio andreybondarenko.com es servido por el host llamado ‘andreybondarenko.com’ porque solo tengo un host. Si tenemos más, podemos crear mx1.andreybondarenko.com y mx2.andreybondarenko.com y ellos entregarían el correo elegido al azar por el cliente. Esto es útil para la estabilidad, la redundancia y el equilibrio de carga.

El registro PTR se establece en el lado del proveedor de alojamiento. Puede encontrar el registro en el panel de control o el servicio de soporte técnico lo hará por usted. Si el proveedor de alojamiento se niega a cambiarlo, sus mensajes serán rechazados por la mayoría de los grandes servidores de correo (incluido Google). Este registro se llama ‘inverso’ y permite que cualquiera verifique que la dirección IP que se utiliza para iniciar la conexión tiene un nombre de dominio válido. Es una forma rápida y fácil de detectar spam bot: utiliza una dirección IP que no controla, por lo que no puede establecer el registro PTR correctamente.

En segundo lugar, debe instalarse el propio Postfix. Recomiendo usarlo como servidor de correo debido a que es altamente flexible, seguro, extensible y puede brindarle un alto rendimiento en grandes instalaciones. En CentOS, simplemente ejecute:

yum install postfix

Y el administrador de paquetes lo instalará con todas las dependencias necesarias. Por el momento, la versión 2.10.1 es la última disponible en el repositorio de CentOS, así que la usaré.
Postfix tiene 2 archivos de configuración. /etc/postfix/master.cf controla el recuento de procesos, su comportamiento, en caso de que utilicen un entorno chrooted o no, y los valores predeterminados están bien en la mayoría de los casos. El /etc/postfix/main.cf controla todo lo demás, necesitamos cambiar lo siguiente:

  myhostname = andreybondrenko.com
  mydomain = andreybondarenko.com

Estas dos variables deben establecerse en el nombre de host válido del propio host y en el dominio para el que está sirviendo el correo. En mi caso son iguales.

  myorigin = $myhostname

El parámetro myorigin especifica el dominio del que parece provenir el correo enviado localmente. El valor predeterminado es agregar $ myhostname, que está bien para sitios pequeños. Si ejecuta un dominio con varios servidores de correo, debe cambiarlo a $ mydomain y configurar una base de datos de alias para todo el dominio que asigne un alias a cada usuario [email protected]. Para mantener la coherencia entre las direcciones del remitente y del destinatario, myorigin también especifica el nombre de dominio predeterminado que se agrega a las direcciones de los destinatarios que no tienen una parte @domain. Usaremos la configuración predeterminada.

  inet_interfaces = all
  inet_protocols = all

Estas dos configuraciones le dirán al smtpd que escuche tanto IPv4 como IPv6 en todas las interfaces.

  mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, myotherdomainihave.com

Esta variable establece todos los dominios a los que aceptaríamos correo. En este caso, es andreybondarenko.com, myotherdomainihave.com y localhost.

relay_domains = $ mydestination
Esta variable establece todos los dominios para retransmitir correo en caso de que el destinatario no se encuentre en nuestro host.
Esa es básicamente toda la configuración inicial que necesitamos: le dice al smtpd que escuche el puerto 25 en todas las interfaces, acepte correo a andreybondarenko.com, localhost y myotherdomainihave.com. De forma predeterminada, entregaría correo a los buzones de correo de los usuarios en / var / mail, en el futuro, podemos configurar dovecot para que sea un servidor IMAP y proporcionar la autenticación SASL, luego podemos fortalecer el Postfix contra correo no deseado, configurar listas grises y DKIM. Lo último que tenemos que hacer es decirle a Systemd que inicie Postfix al arrancar y que lo ejecute ahora:

  systemctl enable postfix
  systemctl start postfix

Ahora podemos ver que se está ejecutando en la lista de procesos:

   ┌[root@andreybondarenko]─[~]
   └─10/09 09:16:44-# ps ax|grep postfix
   1764 ? Ss 0:02 /usr/libexec/postfix/master -w

Podemos conectarnos al puerto 25 y enviar un mensaje con telnet:

  ┌[root@andreybondarenko]─[~]
  └─10/09 09:19:13-# telnet localhost 25
  Trying ::1...
  Connected to localhost.
  Escape character is '^]'.
  220 andreybondrenko.com ESMTP Postfix
  helo andreybondarenko.com
  250 andreybondrenko.com
  mail from:
  250 2.1.0 Ok
  rcpt to:
  250 2.1.5 Ok
  data
  354 End data with .
  test
  .
  250 2.0.0 Ok: queued as EBA0881589
  quit
  221 2.0.0 Bye

  Connection closed by foreign host.

Y véalo en / var / log / maillog

  Sep 10 09:19:18 andreybondarenko postfix/smtpd[10889]: connect from localhost[::1]
  Sep 10 09:19:47 andreybondarenko postfix/smtpd[10889]: EBA0881589: client=localhost[::1]
  Sep 10 09:19:54 andreybondarenko postfix/cleanup[10895]: EBA0881589: message-id=
  Sep 10 09:19:54 andreybondarenko postfix/qmgr[1770]: EBA0881589: from=, size=352, nrcpt=1

Ahora es el momento de configurar DKIM (consulte https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail). De hecho, lo único que proporciona la tecnología Domain Key es la información que la persona que controla el DNS también controla el servidor de correo. Esto significa que debemos configurar dos lugares al mismo tiempo: el registro TXT de DNS y el demonio especial en el lado del servidor.

Primero, instale el paquete opendkim:

  yum install opendkim

Segundo, corre

┌[root@andreybondarenko]─[~]
└─10/09 18:46:11-# opendkim-default-keygen
Generating default DKIM keys:
Default DKIM keys for freshdaymall.com created in /etc/opendkim/keys.

En / etc / opendkim / keys habría 2 archivos que contienen claves públicas y privadas. Verifique que los siguientes permisos para la clave privada (solo el usuario de opendkim puede leer):

  ┌[root@andreybondarenko]─[/etc/opendkim/keys]
  └─10/09 18:50:52-# ll default.private
  -r--------. 1 opendkim opendkim 887 Oct 2 2016 default.private

Ahora necesitamos corregir la configuración.

  • /etc/opendkim.conf – archivo de configuración de opendkim
  • / etc / opendkim / keytable: define la ruta de la clave privada para el dominio
  • / etc / opendkim / signingtable: le dice a OpenDKIM cómo aplicar las claves.
  • / etc / opendkim / TrustedHosts: define qué hosts pueden usar claves.

He copiado mis claves públicas y privadas en / etc / opendkim

  ┌[root@andreybondarenko]─[/etc/opendkim]
  └─10/09 18:53:40-# ls -la
  total 48K
  drwxr-xr-x. 3 root opendkim 4.0K Jan 9 2017 .
  drwxr-xr-x. 96 root root 12K Sep 8 07:28 ..
  -r--------. 1 opendkim opendkim 887 Oct 2 2016 andreybondarenko.com.private
  -rw-r-----. 1 root opendkim 333 Oct 2 2016 andreybondarenko.com.txt
  drwxr-x---. 2 opendkim opendkim 4.0K Dec 21 2016 keys
  -rw-r--r--. 1 root root 106 Oct 3 2016 keytable
  -rw-r--r--. 1 root root 60 Oct 3 2016 signingtable
  -rw-r-----. 1 opendkim opendkim 378 Dec 21 2016 TrustedHosts

En /etc/opendkim.conf necesitamos los siguientes parámetros:

  • Mode sv – firmar y verificar mensajes salientes
  • Socket inet: 8891 @ localhost – use el puerto 8891 en localhost para la comunicación
  • ReportAddress “andreybondarenko.com Postmaster”: dirección del administrador de correos.
  • Dominio andreybondarenko.com – mi dominio
  • Correo de selección: la parte para buscar en el registro TXT de la clave.

Se pueden vivir otros parámetros por defecto.

Luego, configure / etc / opendkim / keytable de la siguiente manera:

  mail._domainkey.andreybondarenko.com andreybondarenko.com:mail:/etc/opendkim/andreybondarenko.com.private

Y el / etc / opendkim / signingtable

  *@andreybondarenko.com mail._domainkey.andreybondarenko.com

El primer archivo define dónde buscar la clave privada para el dominio (recuerde que el servidor de la vida real puede tener muchos de ellos) y el segundo define que todo el correo debe estar firmado con esta clave. TrustedHosts es trivial y predeterminado:

  127.0.0.1
  ::1

Ahora podemos ejecutar opendkim:

  systemctl enable opendkim
  systemctl start opendkim

La última parte en el host es decirle al Postfix que reenvíe todo el correo al opendkim primero agregando un milter local:

  smtpd_milters = inet:127.0.0.1:8891
  non_smtpd_milters = inet:127.0.0.1:8891

¡Eso es! Reinicie Postfix para obtener una nueva configuración:

  systemctl restart postfix

Ahora la última y muy importante parte: necesitamos al público la parte abierta de la clave del mundo con el registro TXT de DNS. Debe crear el registro de la siguiente manera:

  • Nombre: mail._domainkey
  • Tipo: TXT
  • TTL: 1 hora
  • Valor: v = DKIM1; k = rsa; p = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvGRWfWPPZVIg0fy7Pr0 + rsBsoL6Imt1GBE / QRd3X5Izv1iAJFUsOteaf9TI9EO / YFwoLLahzuoZM1aUU4ED3fHlItEnqXCKQhX8Zripi7cfIO + DRFEhGuQtG6OIuA6 + c3ivao7DTPk / IFqY7MG5M3wMvAfV + eIBf1VjmajSwe3wIDAQABLast parte, el ‘valor’ es complicado y puede dar lugar a errores. Necesita leer /etc/opendkim/your_domain.txt o /etc/opendkim/keys/default.txt y copiar el valor eliminando todos los símbolos de comillas (es decir, todo “).

El servidor de correo es un servicio común pero complicado, ya que interactúa con el mundo exterior y debe obedecer las mejores prácticas, por lo que el correo será aceptado y nunca se perderá.