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

в 6:37, , рубрики: communigate, dovecot, gmail, ldap, postfix, TLS, Настройка Linux, Серверное администрирование, метки: , ,

Почтовый сервер 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+ldap
wiki2.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=<hidden>
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

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

Автор: Viliar

Источник

Поделиться

* - обязательные к заполнению поля