El problema

El problema

El problema

No puedo entender cómo obligar a Postfix a usar una conexión TLS a MySQL. Ipoderconéctese manualmente desde el servidor Postfix al servidor MySQL con TLS como usuario de Postfix, por lo que no hay nada roto con la autenticación de MySQL. El problema es claro: Postfix no solicita TLS para la conexión MySQL.

Versiones:

  • SO: CentOS 7
  • Sufijo: 2:2.10.1-6.el7 y 2:3.2.4-1.gf.el7
  • MySQL (MariaDB): 5.5.56

Cómo llegué aquí

He estado buscando en toda la web, incluidos los distintos sitios de StackExchange, una respuesta a esta pregunta. He leído la documentación de Postfix y MySQL detenidamente y repetidamente. La mejor respuesta que he encontrado es una que rechazo por considerarla innecesariamente complicada: "Configure un túnel SSH entre sus servidores Postfix y MySQL, luego conéctese a través de él."Tiene que haber una manera de indicarle a Postfix que utilice el cifrado TLS (SSL) con el cliente MySQL.

Antes de explorar la configuración, permítanme aclarar esto: La configuración de mi servidor de correo funciona perfectamente sin MySQL TLS. Estoy usando TLS con éxito para SMTPS e IMAPS y eso tienenada que ver con mi pregunta. El correo se transporta de forma segura tanto dentro como fuera de mi red, excepto que las conexiones MySQL entre Postfix y el servidor MySQL no están cifradas. Excepto por el enlace Postfix-MySQL expuesto, no hay ningún problema con mi infraestructura de correo.

Sin embargo, debido a los cambios en los requisitos de seguridad, debo actualizar mi infraestructura existente para cifrar todas las conexiones MySQL. Configurar TLS para conexiones MySQL fue fácil. Las pruebas manuales muestran que los clientes MySQL pueden conectarse exitosamente a través de un enlace cifrado con TLS desde todos los hosts permitidos.. Entonces, la configuración de MySQL TLS también es sólida y funciona para todo.excepto sufijo.

Lo que he probado

Configuración relevante en el servidor Postfix:

/etc/postfix/main.cf

Reducido a solo una de varias conexiones para mantener el material lo más específico posible.

virtual_alias_maps = proxy:mysql:/etc/postfix/lookup_aliases.cf
proxy_read_maps = $virtual_alias_maps
/etc/postfix/lookup_aliases.cf

Credenciales y nombres de host ofuscados.

hosts = mysql-server.domain.tld
user = postfix
password = *****
dbname = mail
option_file = /etc/my.cnf.d/client.cnf
option_group = client
tls_verify_cert = yes
query = SELECT goto FROM alias WHERE address = '%s' AND active = '1'
/etc/mi.cnf

Este archivo está intacto. Lo incluyo sólo para mostrar que el siguiente archivo de configuración está incluido correctamente en la configuración del Cliente MySQL.

!includedir /etc/my.cnf.d
/etc/my.cnf.d/client.cnf
[client]
ssl = true

Exitosa - MANUAL - Salida de conexión MySQL TLS desde el servidor Postfix como usuario de Postfix

Tenga en cuenta en particular que TLS se emplea con éxito:

# hostname -f
mail.domain.tld

# sudo -u postfix mysql -h mysql-server.domain.tld -u postfix -p mail
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 72
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [mail]> \s
--------------
mysql  Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:     72
Current database:  mail
Current user:      [email protected]
SSL:           Cipher in use is DHE-RSA-AES256-GCM-SHA384
Current pager:     stdout
Using outfile:     ''
Using delimiter:   ;
Server:            MariaDB
Server version:        5.5.56-MariaDB MariaDB Server
Protocol version:  10
Connection:        mysql-server.domain.tld via TCP/IP
Server characterset:   latin1
Db     characterset:   utf8
Client characterset:   utf8
Conn.  characterset:   utf8
TCP port:      3306
Uptime:            1 hour 27 min 23 sec

Threads: 1  Questions: 271  Slow queries: 0  Opens: 13  Flush tables: 2  Open tables: 39  Queries per second avg: 0.051
--------------

MariaDB [mail]> \q
Bye

Configuración relevante en el servidor MySQL:

Becas MySQL

Tenga en cuenta que se REQUIERE TLS (SSL), pero por lo demás los permisos son relativamente laxos hasta que solucione este problema de conexión TLS:

MariaDB [(none)]> SHOW GRANTS FOR 'postfix'@'10.0.101.%';
+-----------------------------------------------------------------------------------------------------+
| Grants for [email protected].%                                                                       |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'postfix'@'10.0.101.%' IDENTIFIED BY PASSWORD '*SOMEPASSWORDHASH' REQUIRE SSL |
| GRANT SELECT ON `mail`.* TO 'postfix'@'10.0.101.%'                                                  |
+-----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

Registros

La conexión Postfix falla cuando REQUIERE SSL

Aunque la prueba manual de línea de comandos de la conexión MySQL TLS tuvo éxito aquí, Postfix todavía no usará MySQL TLS.

El registro general de MySQL:

180217 14:45:15       16 Connect   [email protected] as anonymous on mail
      16 Connect   Access denied for user 'postfix'@'mail.domain.tld' (using password: YES)

El registro de Postfix:

Feb 19 19:22:55 mail postfix/cleanup[11951]: warning: proxy:mysql:/etc/postfix/lookup_aliases.cf lookup error for "[email protected]"
Feb 19 19:22:55 mail postfix/cleanup[11951]: warning: E2CCA2069823: virtual_alias_maps map lookup problem for [email protected] -- message not accepted, try again later
La conexión Postfix tiene éxito cuando se elimina REQUIRE SSL

Este es Postfix conectándose exitosamente después de cambiar el permiso de REQUIRE SSL a REQUIRE NONE. Sin embargo, la conexión esno encriptado.

180217 15:17:21       26 Connect   [email protected] as anonymous on mail
          26 Query show databases
          26 Query show tables
          26 Field List    admin
          26 Field List    alias
          26 Field List    alias_domain
          26 Field List    config
          26 Field List    domain
          26 Field List    domain_admins
          26 Field List    fetchmail
          26 Field List    log
          26 Field List    mailbox
          26 Field List    quota
          26 Field List    quota2
          26 Field List    vacation
          26 Field List    vacation_notification
          26 Query select @@version_comment limit 1

Conclusión

Todo lo que necesito es que Postfix respete ssl = truesus conexiones de cliente MySQL. Por favor, avíseme si necesita más información.

Actualizar:

Después de publicar esta pregunta, descubrí mediante una lectura más cuidadosa que las versiones de Postfix anteriores a la 2.11 no admiten la lectura de archivos de configuración de MySQL en absoluto. Como tal, es imposible configurar la versión de Postfix proporcionada por el proveedor (versión 2.10) para usar MySQL TLS. Siento una mala elección de redacción en la documentación de Postfix, donde la parte superior dela documentación de Postfix para la configuración de MySQLlee:

Postfix 3.1 and earlier don't read [client] option group settings unless a non-empty option_file or option_group value are specified. To enable this, specify, for example "option_group = client".

El autor no explicó:

These options are ignored for Postfix 2.10 and earlier.  Postfix 2.11 through 3.1 don't read [client] option group settings unless a non-empty option_file or option_group value are specified. To enable this, specify, for example "option_group = client".

Entonces, actualicé Postfix en CentOS 7 desde la versión 2.10 proporcionada por el proveedor a laGhettoForge Plus suministradoversión 3.2. Instalé el postfix3-mysqlpaquete adicional. Tenía grandes esperanzas pero se han visto frustradas. Ahora, incluso con Postfix 3.2,todavía no se conecta a MySQL a través de un enlace TLS.

Intenté ambas cosas option_file = /etc/my.cnf(debería ser la opción predeterminada e innecesaria) y option_file = /etc/my.cnf.d/client.cnffue en vano.

Incluso intenté obligar a Postfix a considerar TLS agregando tls_verify_cert = yes. Esto tampoco tuvo ningún efecto. Tenga en cuenta que el nombre del certificado coincide, por lo que esta verificación pasará si alguna vez se intenta.

Respuesta1

Sinopsis

Para establecer una conexión MySQL TLS desde Postfix, necesita:

  1. Postfix versión 2.11 o posterior. CentOS 7 sólo proporcionaPostfix versión 2.10. Debe adquirir una actualización para Postfix por medios que no sean CentOS. Elegí usar los paquetes postfix3y postfix3-mysqldeGhettoForge Plusporque parecebien recomendado por la comunidad CentOS.
  2. Colocardentro de sus mysql_tablearchivos de configuracióncualquiera:
    1. Al menos un tls_ciphersentorno permitido;
    2. Un certificado TLS del lado del cliente y su clave privada correspondiente,firmado por una autoridad de certificación que es común tanto para el servidor MySQL como para su cliente Postfix; o
    3. ambos.
  3. ¡No confíe en configurarlos en sus archivos /etc/my.cnf o /etc/my.cnf.d/*! El código Postfix MySQL no lee esos archivos para determinar si se debe establecer una conexión MySQL TLS; se analizan demasiado tarde. ElsoloUna forma de instigar a Postfix a abrir una conexión MySQL TLS es especificar la configuración de TLS dentro de sus mysql_tablearchivos de configuración. Período.

Cómo llegué aquí

Finalmente recurrí a leer el código fuente de Postfix 3.2. Las líneas 653-658 de src/global/dict_mysql.c fueron especialmente informativas.

Solución final

Si desea emular el comportamiento de ssl = true, solo necesita agregar una línea similar a la siguiente a sus mysql_tablearchivos de configuración:

tls_ciphers = TLSv1.2

Nuestra configuración requiere que solo se use TLS 1.2, y ya se había aplicado durante mucho tiempo en la configuración de nuestros servidores MySQL, por lo que no se me ocurrió automáticamente aplicarlo también en los clientes, pero usted es libre de agregar otros. cifrados si su organización tolera cifrados más antiguos.

Tenga en cuenta que estamos perfectamente contentos de no utilizar certificados del lado del cliente. Utilizamos otros medios para proteger y monitorear activamente las conexiones de nuestras bases de datos; simplemente no queremos complejidad adicional.

Solución alternativa

Si prefiere exigir que sólo los clientes conocidos y confiables se conecten a sus servidores MySQL, y no puede hacerlo a través de otros mecanismos de aplicación de políticas, como firewalls estrictos, complejidad estricta de contraseñas, periodicidad de rotación de contraseñas, auditoría de conexión, etc., entonces puede También use certificados del lado del cliente a través de estas configuraciones adicionales en sus mysql_tablearchivos de configuración:

tls_key_file = /path/to/private.key
tls_cert_file = /path/to/public.certificate
tls_CAfile = /path/to/common.CA.certificate # OR tls_CApath = /path/to/CA-and-intermediate-chain-certificates/

Nuevamente, configurándolos en /etc/my.cnf o /etc/my.cnf.d/*no ayudará. Estos archivos no se analizan hastadespuésel tipo de conexión (TLS o no TLS) tieneya ha sido decidido.

Si opta por utilizar certificados del lado del cliente,hacer cumplirlos en el servidor! Túnonecesita certificados del lado del cliente cuando lo único que desea es cifrar el tráfico MySQL; en su lugar, simplemente use la tls_ciphersalternativa anterior. Agregar certificados del lado del cliente permite a MySQL verificar que un cliente que se conecta ya es conocido y confiable, perosólo si le dices a MySQL cómo hacerlo! No adivinará y confiar únicamente en la presencia de una CA común entre el cliente y el servidor es sólo una implementación parcial de esta poderosa herramienta. Si está interesado en este modelo de seguridad de MySQL, encontré al menos unoGuía práctica que proporciona buenos ejemplos sobre cómo emplear la validación de certificados de cliente..

información relacionada