Postfix 2.6.6 con TLS: no se pueden recibir correos electrónicos de GMail (y un par de otros MTA), pero otros están bien, ¿por qué?

Postfix 2.6.6 con TLS: no se pueden recibir correos electrónicos de GMail (y un par de otros MTA), pero otros están bien, ¿por qué?

Tuve que mirar un servidor CentOS 6 que ejecuta Postfix 2.6.6 que podía enviar correos electrónicos a todos, pero no podía recibirlos de GMail (y algunos otros MTA) debido a problemas de negociación TLS entrante.

Una conexión desde un .google.comservidor SMTP (es decir, GMail) resultó en esto:

Aug 23 19:34:29 server1 postfix/smtpd[7659]: connect from mail-lf1-f44.google.com[209.85.167.44]
Aug 23 19:34:29 server1 postfix/smtpd[7659]: setting up TLS connection from mail-lf1-f44.google.com[209.85.167.44]
Aug 23 19:34:29 server1 postfix/smtpd[7659]: SSL_accept error from mail-lf1-f44.google.com[209.85.167.44]: -1
Aug 23 19:34:29 server1 postfix/smtpd[7659]: warning: TLS library problem: 7659:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1387:
Aug 23 19:34:29 server1 postfix/smtpd[7659]: lost connection after STARTTLS from mail-lf1-f44.google.com[209.85.167.44]
Aug 23 19:34:29 server1 postfix/smtpd[7659]: disconnect from mail-lf1-f44.google.com[209.85.167.44]

Aumento de la detalle del registro TLS:

Aug 23 21:56:15 server1 postfix/smtpd[18103]: initializing the server-side TLS engine
Aug 23 21:56:15 server1 postfix/smtpd[18103]: connect from mail-lf1-f47.google.com[209.85.167.47]
Aug 23 21:56:15 server1 postfix/smtpd[18103]: setting up TLS connection from mail-lf1-f47.google.com[209.85.167.47]
Aug 23 21:56:15 server1 postfix/smtpd[18103]: mail-lf1-f47.google.com[209.85.167.47]: TLS cipher list "ALL:+RC4:@STRENGTH:!aNULL:!LOW:!EXP:!MEDIUM:!ADH:!AECDH:!MD5:!DSS:!ECDSA:!CAMELLIA128:!3DES:!CAMELLIA256:!RSA+AES:!eNULL"
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL_accept:before/accept initialization
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL3 alert write:fatal:handshake failure
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL_accept:error in SSLv3 read client hello C
Aug 23 21:56:15 server1 postfix/smtpd[18103]: SSL_accept error from mail-lf1-f47.google.com[209.85.167.47]: -1
Aug 23 21:56:15 server1 postfix/smtpd[18103]: warning: TLS library problem: 18103:error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher:s3_srvr.c:1387:
Aug 23 21:56:15 server1 postfix/smtpd[18103]: lost connection after STARTTLS from mail-lf1-f47.google.com[209.85.167.47]
Aug 23 21:56:15 server1 postfix/smtpd[18103]: disconnect from mail-lf1-f47.google.com[209.85.167.47]

¿No hay cifrado compartido?

TLS ya estaba habilitado con un certificado de servidor (aunque autofirmado); los clientes se conectaban exitosamente para enviar y recibir correo a través de IMAP/POP con SASL.

Leí sobre las causas comunes del 1408A0C1error postfix, pero ninguna parecía aplicarse a este escenario. Algunas de las comprobaciones que realicé produjeron resultados que parecían contradecir lo que esperaba;

postconf -d | grep cipherlistTenía esta lista bastante corta de exclusiones:

tls_export_cipherlist = ALL:+RC4:@STRENGTH
tls_high_cipherlist = ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH
tls_low_cipherlist = ALL:!EXPORT:+RC4:@STRENGTH
tls_medium_cipherlist = ALL:!EXPORT:!LOW:+RC4:@STRENGTH
tls_null_cipherlist = eNULL:!aNULL

y los protocolos TLS fueron bastante indulgentes:

smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_protocols  = !SSLv2, !SSLv3
smtpd_tls_protocols           = !SSLv2, !SSLv3
smtp_tls_protocols            = !SSLv2, !SSLv3

Entonces, ¿por qué no pudo negociar un cifrado?

Primero me propuse actualizar OpenSSL (que era OpenSSL 1.0.1e-fips 11 Feb 2013el último disponible a través de yum); Hicecomo se indica en este artículoy como resultado la caja se ejecuta OpenSSL 1.0.2p 14 Aug 2018.

Pero aún así, el problema de recepción de GMail continuó...

Los dejé como están para darles a todas las posibles variantes de TLS la oportunidad de tener éxito y estudié los cifrados con más detalle.

Deshabilitartodode las exclusiones de cifrado, envié un correo electrónico de prueba desde mi Gmail y, como era de esperar, llegó:

Aug 23 23:39:52 server1 postfix/smtpd[6036]: connect from mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/smtpd[6036]: setting up TLS connection from mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/smtpd[6036]: mail-lj1-f171.google.com[209.85.208.171]: TLS cipher list "ALL:+RC4:@STRENGTH"
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:before/accept initialization
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 read client hello B
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write server hello A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write certificate A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write server done A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 flush data
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 read client key exchange A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 read finished A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write session ticket A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write change cipher spec A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 write finished A
Aug 23 23:39:52 server1 postfix/smtpd[6036]: SSL_accept:SSLv3 flush data
Aug 23 23:39:52 server1 postfix/smtpd[6036]: Anonymous TLS connection established from mail-lj1-f171.google.com[209.85.208.171]: TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)
Aug 23 23:39:52 server1 postfix/smtpd[6036]: 66BB15DC6: client=mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/cleanup[6424]: 66BB15DC6: message-id=<CAK9Gk9r+6gt7g_U987A0XaGdKJGY=80n0rK595mqrmfGaL5LKQ@mail.gmail.com>
Aug 23 23:39:52 server1 opendkim[6890]: 66BB15DC6: mail-lj1-f171.google.com [209.85.208.171] not internal
Aug 23 23:39:52 server1 opendkim[6890]: 66BB15DC6: not authenticated
Aug 23 23:39:52 server1 opendkim[6890]: 66BB15DC6: DKIM verification successful
Aug 23 23:39:52 server1 postfix/qmgr[6032]: 66BB15DC6: from=<gmailaddress>, size=3988, nrcpt=1 (queue active)
Aug 23 23:39:52 server1 postfix/smtpd[6036]: disconnect from mail-lj1-f171.google.com[209.85.208.171]
Aug 23 23:39:52 server1 postfix/pipe[6425]: 66BB15DC6: to=<myinbox>, relay=dovecot, delay=0.48, delays=0.29/0.01/0/0.18, dsn=2.0.0, status=sent (delivered via dovecot service)

Entonces, si GMail negoció AES128-GCM-SHA256a través de TLSv1.2, ¿por qué no funcionaba antes? ¿Particularmente porque su lista de cifrado parece contener posibles coincidencias, con RC4 al final, ordenados en orden de fuerza?


Para probar, tomé una lista de cifrado específica, antepuse las profundidades de hash AES128 (en cursiva) (métodos ECDHE y DHE) y la declaré explícitamente en postfix, lo que funcionó:

tls_high_cipherlist=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256: DHE-DSS-AES128-GCM-SHA256:EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL: !LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA

Sin embargo, no quería tener que actualizar constantemente las recetas de la lista de cifrado, así que comenté la tls_high_cipherlistdeclaración.

Luego hice algunas cosas.

En Postfix master.cflo agregué -o smtp_tls_mandatory_protocols=TLSv1a la sección smtpd, como se recomienda.

Quería mejorar los protocolos TLS mediante el uso de declaraciones dehttps://blog.kruyt.org/postfix-and-tls-encryption/, que aprueban explícitamente TLSv1.2 y TLSv1.1 antes de excluir los más antiguos. Sin embargo, con postfix 2.6.6, esto no funciona; Vi esto en el registro poco después de una recarga/reinicio:

warning: Invalid TLS protocol list "TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3": disabling TLS support

Esto sucedió si mezclé reglas de exclusión con reglas de inclusión, así que volví al formato de exclusión explícita:

smtpd_tls_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_ciphers = high
smtpd_tls_ciphers = high
smtpd_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_mandatory_ciphers = high
smtpd_tls_mandatory_ciphers = high

y esto fue aceptado por postfix.

Configuré TLS oportunista con

smtp_tls_security_level = may
smtpd_tls_security_level = may

Noté que incluso después de resolver el problema de entrega de GMail, algunos otros MTA seguían fallando:

server1 postfix/smtpd[28167]: connect from mta3.email.secretescapes.com[198.245.84.110]
server1 postfix/smtpd[28167]: setting up TLS connection from mta3.email.secretescapes.com[198.245.84.110]
server1 postfix/smtpd[28167]: mta3.email.secretescapes.com[198.245.84.110]: TLS cipher list "ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH:!MD5:!DES:!ADH:!RC4:!PSD:!SRP:!3DES:!eNULL:!aNULL"
server1 postfix/smtpd[28167]: SSL_accept:before/accept initialization
server1 postfix/smtpd[28167]: SSL_accept:error in SSLv2/v3 read client hello A
server1 postfix/smtpd[28167]: SSL_accept error from mta3.email.secretescapes.com[198.245.84.110]: -1
server1 postfix/smtpd[28167]: warning: TLS library problem: 28167:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:
server1 postfix/smtpd[28167]: lost connection after STARTTLS from mta3.email.secretescapes.com[198.245.84.110]
server1 postfix/smtpd[28167]: disconnect from mta3.email.secretescapes.com[198.245.84.110]

-

server1 postfix/smtpd[1451]: initializing the server-side TLS engine
server1 postfix/smtpd[1451]: connect from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: setting up TLS connection from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: mta.email.bbc.com[198.245.84.99]: TLS cipher list "ALL:!EXPORT:!LOW:!MEDIUM:+RC4:@STRENGTH:!MD5:!aDSS:!kECDH:!kDH:!SEED:!IDEA:!DES:!ADH:!RC2:!RC4:!RC5:!PSD:!SRP:!3DES:!eNULL:!aNULL"
server1 postfix/smtpd[1451]: SSL_accept:before/accept initialization
server1 postfix/smtpd[1451]: SSL_accept:error in SSLv2/v3 read client hello A
server1 postfix/smtpd[1451]: SSL_accept error from mta.email.bbc.com[198.245.84.99]: -1
server1 postfix/smtpd[1451]: warning: TLS library problem: 1451:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:
server1 postfix/smtpd[1451]: lost connection after STARTTLS from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: disconnect from mta.email.bbc.com[198.245.84.99]
server1 postfix/smtpd[1451]: connect from unknown[107.174.30.57]
server1 postfix/smtpd[1451]: 4F6D0629C: client=unknown[107.174.30.57]

Luego probé algunas permutaciones de tls_high_cipherlist, antes de terminar usandola lista recomendada de bettercrypto.org:

tls_high_cipherlist=EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA

El servidor ha sido probado con varios probadores SSL, incluidosVerificar TLS(resultado 100%),Luxsci(resultado A+),probador SSL de htbridge(buena nota) yHerramientas SSL.

Soy consciente de que puede asignar políticas a las conexiones salientes, pero estoy buscando un equivalente para poder deshabilitar selectivamente cualquier exclusión para MTA particulares (tal como los encuentro) y determinar qué cifrado están negociando, luego ajustar la lista de cifrado que presento. .

No veo ningún defecto muy obvio en la configuración actual de Postfix TLS. No entiendo por qué ciertos MTA no pueden negociar un cifrado TLS cuando otros lo logran bien. Incluso el más exigente, GMail, ahora está bien.

¿Algunas ideas?:-)


lo notéesta pregunta de SE sobre por qué Google prefiere el cifrado que prefiere, lo que resultó en una lectura interesante.

Cortesía deeste hilo del foro de usuarios de Postfix, encontré una receta útil para ver rápidamente cuántas conexiones TLS se realizaron con éxito en todos los cifrados disponibles:

egrep "TLS connection established from.*with cipher" /var/log/maillog* | awk '{printf("%s %s %s %s\n", $12, $13, $14, $15)}' | sort | uniq -c | sort -

Respuesta1

En última instancia, este problema parece deberse a que algunos remitentes todavía solo pueden negociar SSLv3. Esto es algo malo, pero no recibir correos electrónicos tampoco es bueno.

Realmente es tan simple como eso. No estoy contento con esto, pero si los MTA de envío se niegan a renegociar con TLS y simplemente vuelven a intentarlo eternamente con SSLv3, no hay mucho que podamos hacer por ahora.

Entonces, por el momento, he recurrido a permitir que los correos electrónicos entrantes se cifren con SSLv3, pero requiriendo que todos los clientes en el servidor aún tengan que autenticarse a través de TLS.

Logré esto eliminando los negativos del protocolo en main.cf:

smtpd_tls_mandatory_protocols = !TLSv1, !SSLv2
smtpd_tls_protocols = !TLSv1, !SSLv2

Tenga en cuenta que las smtp_tls_definiciones son para el correo que se envía desde este servidor, así que tenga en cuenta las conexiones de los clientes, para que pueda hacerlas tan estrictas como desee (siempre que esté dispuesto a explicar a todos cómo configurar sus clientes de correo electrónico):

smtp_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = !TLSv1, !SSLv2, !SSLv3

Si los MTA emisores no pueden negociar TLS, esperando SSLv3, esto es lo que normalmente verá en el registro de correo:

warning: TLS library problem: 364:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:

Si marca el nivel de registro, verá que la negociación TLS falla, con más mensajes como

postfix/smtpd[26234]: SSL_accept:before/accept initialization
postfix/smtpd[26234]: SSL_accept:error in SSLv2/v3 read client hello A
postfix/smtpd[26234]: SSL_accept error from 201-62-89-201.life.com.br[201.62.89.201]: -1

He estado probando periódicamente no permitir conexiones SSLv3 (inevitablemente los MTA reintentan durante muchos días), por lo que puede permitir que se acumulen algunas fallas en los registros y luego analizarlas.

Este script bash me ayuda a analizar qué servidores están intentando utilizar SSLv3:

#!/bin/sh
egrep "SSL_accept error" /var/log/maillog | awk '{printf("%s %s %s\n", $9, $10, $11)}' | sort | uniq -c | sort -`

Y esta variación muestra cifrados negociados, por lo que una vez que vuelva a habilitar SSLv3, puede dejarlo por un tiempo y luego confirmar que los MTA están usando SSLv3:

#!/bin/sh
egrep "TLS connection established from.*with cipher" /var/log/maillog | awk '{printf("%s %s %s %s\n", $12, $13, $14, $15)}' | sort | uniq -c | sort -

Todavía tengo que encontrar una mejor respuesta; Me gustaría adoptar un enfoque más matizado y poder permitir SSLv3 de forma selectiva para ciertos MTA dependiendo de si sus intentos de conexión fallan con ciertos errores en maillog. Todos los comentarios/sugerencias son bienvenidos.

información relacionada