Почтовый сервер CommuniGate Pro достаточно известен и популярен в России. Это действительно производительный и очень функциональный почтовый сервер (сейчас, впрочем, уже и VOIP/Messanger/etc). Впрочем, недостатки у него тоже есть. Закрытый код и ощутимо дорогая лицензия. Она ограничивает не только количество пользователей, но время обновлений. К сожалению, далеко не во всех ситуациях покупка обновленной лицензии возможна или целесообразна. Однако интернет меняется, в протоколах находят уязвимости, поддержку старых протоколов отменяют и с этим тоже как-то надо жить.
Задача в том, чтобы дать возможность legacy пользователям отправлять почту с авторизацией и поддержкой TLS1.1/TLS1.2, не внося каких-то серьезных архитектурных изменений в существующую систему. Под катом добавление поддержки TLS1.1+ для старых версий <5.1.3 СommuniGate c помощью Postfix и LDAP.
Один из наших клиентов обратился с проблемой невозможности отправки почты через google apps, используя в нем данные для доступа к нашему старому smtp. В журналах с нашей стороны ошибки типа:
В процессе диагностики выяснилось, что при установлении шифрованного соединия сервера 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
Конифгурация dovecot
Обратите внимание, что все LDAP сервера можно было бы указать в одном файле
Но в такой настройке предполагается, что каждый LDAP сервер владеет информацией о всех пользователях и проверка будет идти только до первой ошибки. В следующем варианте проверка пользователя будет выполнена на всех серверах.
Вывод doveconf
И файл настройки соединения c LDAP по шаблону
Ремарка по настройке 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.
Поддержка LDAP для обслуживаемых почтовых доменов должна быть включена, в нашей версии это так по-умолчанию.
После перезагрузки почтовых демонов тестируем авторизацию.
В журнале dovecot при включеной опции auth_verbose = yes видим:
Пользователи счастливы, количество энтропии в мире немного уменьшили :)
Задача в том, чтобы дать возможность 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
Пользователи счастливы, количество энтропии в мире немного уменьшили :)