Postfix 2.6.6 com TLS - não é possível receber e-mails do GMail (e de alguns outros MTAs), mas outros estão OK, por quê?

Postfix 2.6.6 com TLS - não é possível receber e-mails do GMail (e de alguns outros MTAs), mas outros estão OK, por quê?

Acabei de dar uma olhada em um servidor CentOS 6 executando o Postfix 2.6.6 que era capaz de enviar e-mails para todos, mas não conseguia recebê-los do GMail (e de alguns outros MTAs) devido a problemas de negociação de TLS de entrada.

Uma conexão de um .google.comservidor SMTP (ou seja, GMail) resultou no seguinte:

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]

Aumentando o detalhamento do 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]

Nenhuma cifra compartilhada?!

O TLS já estava habilitado com um certificado de servidor (embora autoassinado); os clientes estavam se conectando com êxito para enviar e receber mensagens por meio de IMAP/POP com SASL.

Eu li sobre as causas comuns do 1408A0C1erro do postfix, mas nenhuma parecia se aplicar a esse cenário. Algumas das verificações que executei produziram resultados que pareciam contradizer o que eu esperava;

postconf -d | grep cipherlisttinha esta lista bastante curta de exclusões:

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

e os protocolos TLS foram bastante tolerantes:

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

Então, por que não foi possível negociar uma cifra?

Primeiro comecei a atualizar o OpenSSL (que era OpenSSL 1.0.1e-fips 11 Feb 2013o mais recente disponível via yum); Eu fizconforme instruído neste artigoe, consequentemente, a caixa é executada OpenSSL 1.0.2p 14 Aug 2018.

Mesmo assim, o problema de recepção do GMail continuou...

Deixei-os como estão para dar a todas as variantes possíveis do TLS uma chance de sucesso e estudei as cifras com mais detalhes.

Desativandotodosdas exclusões de criptografia, enviei um e-mail de teste do meu Gmail e, sem surpresa, ele chegou:

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)

Então, se o GMail negociava AES128-GCM-SHA256via TLSv1.2 – por que não funcionava antes? Principalmente porque sua lista de cifras parece conter alguma correspondência possível, com RC4 no final, ordenada em ordem de força?


Para testar, peguei uma lista de cifras específica, acrescentei as profundidades de hash AES128 (em itálico) - métodos ECDHE e DHE - e declarei-a explicitamente no postfix, que funcionou:

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

Eu não queria ter que atualizar constantemente as receitas da lista de cifras, então comentei a tls_high_cipherlistdeclaração.

Então fiz algumas coisas.

No postfix master.cfadicionei -o smtp_tls_mandatory_protocols=TLSv1à seção smtpd, conforme recomendado.

Eu queria melhorar os protocolos TLS usando declarações dehttps://blog.kruyt.org/postfix-and-tls-encryption/, que aprova explicitamente o TLSv1.2 e o TLSv1.1 antes de excluir os mais antigos. Porém com o postfix 2.6.6, isso não funciona; Eu vi isso no log pouco depois de recarregar/reiniciar:

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

Isso acontecia se eu misturasse regras de exclusão! com regras de inclusão, então reverti para o formato de exclusão explícito:

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

e isso foi aceito pelo postfix.

Eu configurei TLS oportunista com

smtp_tls_security_level = may
smtpd_tls_security_level = may

Percebi que mesmo depois de resolver o problema de entrega do GMail, vários outros MTAs ainda falhavam:

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]

Então tentei algumas permutações do tls_high_cipherlist, antes de acabar usandoa 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

O servidor foi testado com vários testadores SSL, incluindoVerificarTLS(resultado de 100%),Luxsci(resultado A+),testador SSL do htbridge(boa nota) eFerramentas SSL.

Estou ciente de que você pode mapear conexões de saída, mas estou procurando um equivalente para poder desabilitar seletivamente quaisquer exclusões para MTAs específicos (conforme as encontro) e descobrir qual cifra eles estão negociando e, em seguida, ajustar a lista de cifras que apresento .

Não consigo ver nenhuma falha extremamente óbvia na configuração atual do TLS do postfix. Não sei por que certos MTAs não conseguem negociar uma cifra TLS quando outros conseguem bem. Até mesmo o mais exigente, o GMail, agora está OK.

Alguma ideia?:-)


eu noteiesta pergunta SE sobre por que o Google prefere a cifra que usa, o que tornou a leitura interessante.

Cortesia deeste tópico do fórum de usuários do Postfix, encontrei uma receita útil para ver rapidamente quantas conexões TLS foram feitas com sucesso em todas as cifras disponíveis:

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 -

Responder1

Em última análise, este problema parece dever-se ao facto de alguns remetentes ainda só conseguirem negociar SSLv3. Isso é uma coisa ruim, mas não receber e-mails também não é bom.

É tão simples assim. Não estou satisfeito com isso, mas se o envio de MTAs se recusar a renegociar para TLS e tentar novamente eternamente com SSLv3, não há muito que possamos fazer por enquanto.

Então, por enquanto, resolvi permitir que os e-mails recebidos fossem criptografados com SSLv3, mas exigindo que todos os clientes no servidor ainda precisassem se autenticar via TLS.

Consegui isso aliviando os negadores do protocolo em main.cf:

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

Observe que as smtp_tls_definições são para e-mails enviados deste servidor, portanto, relacione-se às conexões do cliente, para que você possa torná-las tão rigorosas quanto desejar (desde que esteja disposto a explicar a todos como configurar seus clientes de e-mail):

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

Se os MTAs de envio não conseguirem negociar TLS, esperando SSLv3, isto é o que você normalmente verá no maillog:

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

Se você aumentar o nível de registro, verá a negociação TLS falhando, com mais mensagens 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

Tenho testado periodicamente a proibição de conexões SSLv3 (inevitavelmente os MTAs tentam novamente por muitos dias), para que você possa permitir que algumas falhas se acumulem nos logs e depois analisá-las.

Este script bash me ajuda a analisar quais servidores estão tentando usar SSLv3:

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

E esta variação mostra cifras negociadas - então, depois de reativar o SSLv3, você pode esperar um pouco e depois confirmar se os MTAs estão 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 -

Ainda estou para encontrar uma resposta melhor; Eu gostaria de adotar uma abordagem mais sutil e poder permitir seletivamente o SSLv3 para determinados MTAs, dependendo se as tentativas de conexão falharam com determinados erros no maillog. Todos os comentários/sugestões são bem-vindos.

informação relacionada