Поддержка TLS1.1+ для устаревших версий CommuniGate

Почтовый сервер CommuniGate Pro достаточно известен и популярен в России. Это действительно производительный и очень функциональный почтовый сервер (сейчас, впрочем, уже и VOIP/Messanger/etc). Впрочем, недостатки у него тоже есть. Закрытый код и ощутимо дорогая лицензия. Она ограничивает не только количество пользователей, но время обновлений. К сожалению, далеко не во всех ситуациях покупка обновленной лицензии возможна или целесообразна. Однако интернет меняется, в протоколах находят уязвимости, поддержку старых протоколов отменяют и с этим тоже как-то надо жить.Задача в том, чтобы дать возможность legacy пользователям отправлять почту с авторизацией и поддержкой TLS1.1/TLS1.2, не внося каких-то серьезных архитектурных изменений в существующую систему. Под катом добавление поддержки TLS1.1+ для старых версий <5.1.3 СommuniGate c помощью Postfix и LDAP.

Один из наших клиентов обратился с проблемой невозможности отправки почты через google apps, используя в нем данные для доступа к нашему старому smtp. В журналах с нашей стороны ошибки типа:

SMTPI-00139([x.x.x.x]) failed to accept a secure connection on [x.x.x.x] from [x.x.x.x]. Error Code=TLS 'client-hello' format error В процессе диагностики выяснилось, что при установлении шифрованного соединия сервера google отказывались устанавливать сессию c использованием SSL3/TLS1.0 и пытались использовать TLS1.1.На серверах стоит CommuniGate старой версии (аж 4.1.8), не поддерживающий TLS1.1. Он является частью старой (со всех сторон Outdated и Deprecated) системы, которая сама по себе не обновляется и в свое время уже получила помощника в виде внешнего postfix для входящего потока (spf/antispam) и исходящего (dkim/etc.).

Сначала рассматривался вариант nginx в качестве фронтенда (сначала smtp, потом pop3/imap), поддерживающего свежую версию TLS и прозрачно передающего запросы старому серверу, но выяснилось, что он не поддерживает проксирование smtp авторизации, а выполняет ее сам и потребуются дополнительные скрипты-надстройки для авторизации. Ситуация осложнялась еще тем, что бэкенд серверов было несколько. По итогу был найден более простой в настройке вариант без необходимости программирования.

Самая хорошая новость была в том, что CommuniGate даже в старых версиях из коробки поддерживает LDAP. На роль фронтенда в итоге был выбран уже частично используемый postfix, который также может предоставлять smtp авторизацию через модуль SASL. В качестве SASL+LDAP прослойки был выбран сервер Dovecot www.dovecot.org. Использование дополнительных компонентов imap сервера кажется чрезмерным усложнением, но прелесть dovecot в его модульности. В нем можно отключить все (модули imap/pop3/ssl/lmtp/sieve, поддержку postgresql/mysql/sqlite и т.д) и оставить только необходимый минимум, а именно требующийся нам демон авторизации dovecot-auth и поддержку LDAP. Что мы и сделаем.

Итак.

Минимальная конфигурация для Postfix+SASL:/etc/postfix/main.cf

… smtpd_sasl_auth_enable = yes broken_sasl_auth_clients = yes smtpd_sasl_security_options = noanonymous smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_authenticated_header = yes … Конифгурация dovecotОбратите внимание, что все LDAP сервера можно было бы указать в одном файле

hosts = mail1:3389 mail2:3389 mail3:3389 Но в такой настройке предполагается, что каждый LDAP сервер владеет информацией о всех пользователях и проверка будет идти только до первой ошибки. В следующем варианте проверка пользователя будет выполнена на всех серверах.

Вывод doveconf

root@smtp:~# doveconf -n # 2.1.7: /etc/dovecot/dovecot.conf # OS: Linux 3.2.0–4–686-pae i686 Debian 7.8 auth_cache_negative_ttl = 5 mins auth_cache_size = 10 M auth_cache_ttl = 5 mins auth_mechanisms = plain login cram-md5 listen = * passdb { args = /etc/dovecot/servers/mail1.conf driver = ldap } passdb { args = /etc/dovecot/servers/mail2.conf driver = ldap } passdb { args = /etc/dovecot/servers/mail3.conf driver = ldap } service auth { unix_listener /var/spool/postfix/private/auth { group = postfix mode = 0660 user = postfix } } #ssl здесь выключен, так как сервера находятся в одной доверенной подсети ssl = no

И файл настройки соединения c LDAP по шаблону /etc/dovecot/servers/mail1.conf hosts = mail1:3389 debug_level = 0 auth_bind = yes auth_bind_userdn = %u base =

Ремарка по настройке LDAP (Информация по модулю LDAP CommuniGate ищется и находится как на оффсайте, для последней версии, www.communigate.com/communigatepro/LDAP.htmlтак и для конкретной версии в составе идущего сервераhttps://mail.domain.com:8010/Guide/LDAP.htmlНюансы настройки dovecot+ldapwiki2.dovecot.org/AuthDatabase/LDAP

Схема «uid=%n, cn=%d» и подобные не сработали, но заработалоauth_bind_userdn = %uБыл выбран вариант, в котором dovecot не предоставляются специальные привилегии, а он просто пытается авторизоваться с полученными логином и паролем на сервере CommuniGate. Минус в скорости работы, плюс к безопасности, нет необходимости в лишних правах.

Конфигурация CommuniGate

Можно внести изменения через Settings→Access→Serving LDAP Clients, а можно просто добавить файл LDAP.settings и перезагрузить CommuniGate.

/etc/CommuniGate/Settings/LDAP.settings

{ Listener = { MaxConnectionsPerAddress = 10; MaxInputChannels = 10; Ports = ( { PortNumber = 3389; RestrictionData = «x.x.x.x»; RestrictionType = Grant; } ); }; LogLevel = 2; } Поддержка LDAP для обслуживаемых почтовых доменов должна быть включена, в нашей версии это так по-умолчанию.

После перезагрузки почтовых демонов тестируем авторизацию.

root@smtp:/etc/dovecot/servers# doveadm auth mail@domain.com password passdb: mail@domain.com auth succeeded extra fields: user=mail@domain.com В журнале dovecot при включеной опции auth_verbose = yes видим:

Feb 11 17:02:35 proxy dovecot: auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth Feb 11 17:02:35 proxy dovecot: auth: Debug: Loading modules from directory: /usr/lib/dovecot/modules/auth Feb 11 17:02:35 proxy dovecot: auth: Debug: Module loaded: /usr/lib/dovecot/modules/auth/libauthdb_ldap.so Feb 11 17:02:37 proxy dovecot: auth: Debug: auth client connected (pid=0) Feb 11 17:02:37 proxy dovecot: auth: Debug: client in: AUTH#0111#011PLAIN#011service=doveadm#011resp= Feb 11 17:02:37 proxy dovecot: auth: Debug: cache (mail@domain.com): miss Feb 11 17:02:37 proxy dovecot: auth: ldap (mail@domain.com): invalid credentials Feb 11 17:02:37 proxy dovecot: auth: Debug: cache (mail@domain.com): miss Feb 11 17:02:37 proxy dovecot: auth: ldap (mail@domain.com): invalid credentials Feb 11 17:02:37 proxy dovecot: auth: Debug: cache (mail@domain.com): miss Feb 11 17:02:37 proxy dovecot: auth: ldap (mail@domain.com): invalid credentials Feb 11 17:02:37 proxy dovecot: auth: Debug: cache (mail@domain.com): miss Feb 11 17:02:37 proxy dovecot: auth: ldap (mail@domain.com): invalid credentials Feb 11 17:02:37 proxy dovecot: auth: Debug: cache (mail@domain.com): miss Feb 11 17:02:37 proxy dovecot: auth: ldap (mail@domain.com): invalid credentials Feb 11 17:02:37 proxy dovecot: auth: Debug: cache (mail@domain.com): miss Feb 11 17:02:37 proxy dovecot: auth: ldap (mail@domain.com): invalid credentials Feb 11 17:02:37 proxy dovecot: auth: Debug: cache (mail@domain.com): miss Feb 11 17:02:37 proxy dovecot: auth: Debug: client out: OK#0111#011user=mail@domain.com

Пользователи счастливы, количество энтропии в мире немного уменьшили :)

© Habrahabr.ru