
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.cfReducido 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 MySQLTenga 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 SSLAunque 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 = true
sus 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-mysql
paquete 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.cnf
fue 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:
- 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
postfix3
ypostfix3-mysql
deGhettoForge Plusporque parecebien recomendado por la comunidad CentOS. - Colocardentro de sus
mysql_table
archivos de configuracióncualquiera:- Al menos un
tls_ciphers
entorno permitido; - 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
- ambos.
- Al menos un
- ¡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_table
archivos 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_table
archivos 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_table
archivos 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_ciphers
alternativa 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..