Почтовый сервер 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