Підтримка 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 відмовлялися встановлювати сесію з використанням 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



Користувачі щасливі, кількість ентропії в світі трохи зменшили :)

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.