%2C%20%D0%BD%D0%BE%20%D1%81%20%D0%B4%D1%80%D1%83%D0%B3%D0%B8%D0%BC%D0%B8%20%D0%B2%D1%81%D0%B5%20%D0%B2%20%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B5.%20%D0%9F%D0%BE%D1%87%D0%B5%D0%BC%D1%83%3F.png)
Мне только что пришлось рассмотреть сервер CentOS 6, работающий под управлением Postfix 2.6.6, который мог отправлять электронные письма всем, но не мог получать их от GMail (и нескольких других MTA) из-за проблем с согласованием входящих сообщений TLS.
Соединение с .google.com
SMTP-сервера (например, GMail) привело к следующему:
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]
Увеличение детализации журнала 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]
Нет общего шифра?!
TLS уже был включен с помощью (хотя и самоподписанного) сертификата сервера; клиенты успешно подключались для отправки и получения почты через IMAP/POP с SASL.
Я читал о распространенных причинах 1408A0C1
ошибки постфикса, но ни одна из них не подходила к этому сценарию. Некоторые из проведенных мной проверок давали результаты, которые, казалось, противоречили моим ожиданиям;
postconf -d | grep cipherlist
имел довольно короткий список исключений:
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
и протоколы TLS были довольно снисходительны:
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_protocols = !SSLv2, !SSLv3
smtp_tls_protocols = !SSLv2, !SSLv3
Так почему же не удалось договориться о шифре?
Сначала я приступил к обновлению OpenSSL (последняя версия была OpenSSL 1.0.1e-fips 11 Feb 2013
доступна через yum
); я сделал этокак указано в этой статьеи в результате коробка запускается OpenSSL 1.0.2p 14 Aug 2018
.
Но проблема с приемом почты GMail все равно продолжалась...
Я оставил их как есть, чтобы дать всем возможным вариантам TLS шанс на успех, и более подробно изучил шифры.
Отключениевсеисключений шифра я отправил тестовое письмо со своего Gmail и, что неудивительно, оно пришло:
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)
Итак, если GMail взаимодействовал AES128-GCM-SHA256
через TLSv1.2 — почему это не работало раньше? Тем более, что их шифрлист, похоже, содержит все возможные совпадения, с RC4 в конце, упорядоченные по силе?
Для проверки я взял определенный список шифров, добавил к нему глубины хэша AES128 (выделены курсивом) — методы ECDHE и DHE — и явно объявил его в postfix, что сработало:
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+КАМЕЛЯ:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+КАМЕЛЯ256:+AES256:+КАМЕЛЯ128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:КАМЕЛЯ256-SHA:AES256-SHA:КАМЕЛЯ128-SHA:AES128-SHA
Однако я не хотел постоянно обновлять рецепты шифровального списка, поэтому закомментировал это tls_high_cipherlist
объявление.
Затем я сделал несколько вещей.
В postfix master.cf
я добавил -o smtp_tls_mandatory_protocols=TLSv1
в раздел smtpd, как и рекомендовалось.
Я хотел улучшить протоколы TLS, используя декларации изhttps://blog.kruyt.org/postfix-and-tls-encryption/, которые явно одобряют TLSv1.2 и TLSv1.1 перед исключением более старых. Однако с postfix 2.6.6 это не работает; я увидел это в журнале вскоре после перезагрузки/перезапуска:
warning: Invalid TLS protocol list "TLSv1.2, TLSv1.1, !TLSv1, !SSLv2, !SSLv3": disabling TLS support
Это происходило, если я смешивал правила исключения ! с правилами включения, поэтому я вернулся к явному формату исключения:
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
и это было принято постфиксом.
Я установил оппортунистический TLS с
smtp_tls_security_level = may
smtpd_tls_security_level = may
Я заметил, что даже после решения проблемы с доставкой GMail несколько других MTA по-прежнему не работают:
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]
Затем я попробовал несколько вариантов tls_high_cipherlist, прежде чем остановился нарекомендуемый список 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
Сервер был протестирован различными тестерами SSL, включаяПроверитьTLS(100% результат),Люкс(результат A+),Тестер SSL htbridge(хорошая оценка) иSSL-инструменты.
Я знаю, что можно сопоставлять политики исходящих соединений, но я ищу эквивалент, чтобы иметь возможность выборочно отключать любые исключения для определенных MTA (по мере их обнаружения) и определять, какой шифр они используют, а затем корректировать представленный мной список шифров.
Я не вижу никаких очевидных недостатков в текущей конфигурации Postfix TLS. Я в недоумении, почему некоторые MTA не могут согласовать шифр TLS, когда другие справляются. Даже придирчивый GMail теперь в порядке.
Есть идеи?:-)
Я заметилэтот вопрос SE о том, почему Google предпочитает именно этот шифр, что сделало чтение интересным.
Предоставленоэта ветка форума пользователей Postfix, я нашел полезный рецепт, позволяющий быстро увидеть, сколько соединений TLS было успешно установлено с использованием всех доступных шифров:
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 -
решение1
В конечном счете, эта проблема, похоже, связана с тем, что некоторые отправители все еще могут согласовывать только SSLv3. Это Плохо, но не получать письма тоже Не Хорошо.
На самом деле, все так просто. Я этим не доволен, но если отправляющие MTA отказываются переходить на TLS и просто вечно повторяют попытки с SSLv3, то сейчас мы мало что можем сделать.
Поэтому на данный момент я прибегнул к разрешению шифрования входящих писем с помощью SSLv3, но при этом потребовал, чтобы все клиенты на сервере по-прежнему проходили аутентификацию через TLS.
Я добился этого, ослабив отрицатели протокола в main.cf
:
smtpd_tls_mandatory_protocols = !TLSv1, !SSLv2
smtpd_tls_protocols = !TLSv1, !SSLv2
Обратите внимание, что smtp_tls_
определения относятся к почте, отправляемой с этого сервера, поэтому они соотносятся с клиентскими подключениями, поэтому вы можете сделать их настолько строгими, насколько захотите (при условии, что вы готовы объяснить всем, как настраивать их почтовые клиенты):
smtp_tls_mandatory_protocols = !TLSv1, !SSLv2, !SSLv3
smtp_tls_protocols = !TLSv1, !SSLv2, !SSLv3
Если отправляющие MTA не могут согласовать TLS, ожидая SSLv3, вот что вы обычно увидите в почтовом журнале:
warning: TLS library problem: 364:error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol:s23_srvr.c:647:
Если вы повысите уровень ведения журнала, вы увидите сбой согласования TLS и больше сообщений типа
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
Я тестировал периодический запрет соединений SSLv3 (в этом случае MTA неизбежно будут повторять попытки в течение многих дней), чтобы можно было допустить накопление нескольких сбоев в журналах, а затем проанализировать их.
Этот bash-скрипт помогает мне анализировать, какие серверы пытаются использовать SSLv3:
#!/bin/sh
egrep "SSL_accept error" /var/log/maillog | awk '{printf("%s %s %s\n", $9, $10, $11)}' | sort | uniq -c | sort -`
А этот вариант показывает согласованные шифры — поэтому, как только вы снова включите SSLv3, вы можете оставить его на некоторое время, а затем убедиться, что MTA используют 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 -
Мне еще предстоит найти лучший ответ; я хотел бы использовать более тонкий подход и иметь возможность выборочно разрешать SSLv3 для определенных MTA в зависимости от того, завершаются ли их попытки подключения с определенными ошибками в maillog
. Приветствуются все комментарии и предложения.