Logjam: генерируем свои DH-параметры и закрываем DHE_EXPORT на всём парке
Атака Logjam деградирует TLS до 512-битного экспортного Diffie-Hellman. Проходим по nginx, Apache и Postfix: генерируем DH 2048-бит, отключаем DHE_EXPORT.
Уязвимость Logjam (май 2015) - атака деградации TLS-соединений до 512-битного экспортного Diffie-Hellman
Два месяца назад мы разбирались с FREAK - атакой деградации TLS до 512-битных RSA EXPORT-шифров. Не успели выдохнуть, как подоспел Logjam: та же идея, другой алгоритм. На этот раз под удар попал Diffie-Hellman в режиме DHE_EXPORT. И снова, пройдясь по клиентским серверам, мы нашли что почистить.
Механика атаки
Logjam эксплуатирует поддержку DHE_EXPORT - набора шифров с обменом ключами Diffie-Hellman на 512-битных группах. Эти группы остались в TLS-стеке с 1990-х, по той же причине что и RSA EXPORT: американский экспортный контроль требовал ослаблять криптографию для поставок за рубеж.
Атакующий в позиции man-in-the-middle перехватывает TLS-хендшейк и подменяет предложение клиента так, чтобы сервер согласился на DHE_EXPORT. 512-битная группа DH вскрывается дискретным логарифмированием - для часто используемых предопределённых групп (p1024 от Apache, аналогичных от OpenSSL) это вычисление можно сделать заранее и хранить таблицы. Атака против конкретного соединения тогда занимает минуты, а не годы.
Дополнительная неприятность: даже без DHE_EXPORT, сервер, использующий стандартную 1024-битную группу DH, уязвим к атаке на уровне государственного актора - группа одна на всех, таблицы предвычислены. Это уже не про CVE, это про архитектуру.
Что мы нашли в ходе аудита
Начали с инвентаризации - кто вообще использует DHE и какие группы. Быстрый способ проверить конкретный сервер:
openssl s_client -connect example.com:443 -cipher 'EXP' 2>/dev/null | head -5
Если хендшейк проходит - плохо. Для массовой проверки удобнее testssl.sh с флагом --logjam или просто полный прогон - он покажет все проблемные cipher suite-ы разом.
Из того, что нашли: DHE_EXPORT присутствовал на части серверов с дефолтными или давно не обновлявшимися конфигами. У нескольких серверов nginx вообще не было явно заданных ssl_dhparam - то есть DH-параметры брались встроенные, 1024-битные. Apache в стандартной поставке на CentOS 6 - аналогично. Postfix, который гоняет STARTTLS на SMTP - там DHE_EXPORT тоже нашёлся, и про него вспоминают реже всего.
Генерируем DH-параметры
Первый шаг - сгенерировать собственные DH-параметры длиной 2048 бит. Готовые группы из пакетов OpenSSL или дистрибутива трогать не стоит: если все используют одну группу, атака на неё становится выгоднее. Своя группа - своя математика.
openssl dhparam -out /etc/ssl/dhparam2048.pem 2048
Предупреждение: это медленно. На слабом VPS может занять несколько минут - это нормально, генератор делает своё дело. Запускать один раз, файл хранить.
nginx
В конфиг добавляем путь к параметрам и правим cipher suite:
ssl_dhparam /etc/ssl/dhparam2048.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
ssl_prefer_server_ciphers on;
Ключевое: !EXPORT явно вырезает все EXPORT-варианты, включая DHE_EXPORT. Без этого флага групповые псевдонимы вроде HIGH или kEDH могут протащить слабые варианты.
После правки - nginx -t и nginx -s reload.
Apache
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDHE+AESGCM:DHE+AESGCM:ECDHE+AES256:DHE+AES256:ECDHE+AES128:DHE+AES:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5
SSLHonorCipherOrder on
В Apache 2.4.8+ можно также добавить:
SSLOpenSSLConfCmd DHParameters /etc/ssl/dhparam2048.pem
В более ранних версиях параметры задаются через отдельный файл в зависимости от дистрибутива - на RHEL/CentOS 6 это может потребовать пересборки mod_ssl, что неприятно. Проще всего убедиться, что !EXPORT стоит, и перейти на ECDHE-only там, где совместимость позволяет.
Postfix
Про почтовые серверы вспоминают в последнюю очередь, а зря. STARTTLS на SMTP тоже ходит через TLS, и DHE_EXPORT там тоже может быть.
В /etc/postfix/main.cf:
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtpd_tls_protocols = !SSLv2, !SSLv3
smtpd_tls_mandatory_ciphers = high
smtpd_tls_ciphers = high
smtpd_tls_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, 3DES, MD5, PSK
smtpd_tls_dh1024_param_file = /etc/ssl/dhparam2048.pem
Файл параметров тот же самый - генерировать заново не нужно. После правки - postfix reload.
Проверка
После всех изменений прогоняем testssl.sh по каждому хосту:
./testssl.sh --logjam --protocols --ciphers example.com:443
Для Postfix - указываем порт 25 или 587 с флагом -t smtp. Если в выводе нет строк с EXPORT и нет предупреждений про 512-bit или 1024-bit DH - считаем хост закрытым.
Qualys SSL Labs отдельно проверяет Logjam и показывает, какая длина DH-ключа используется при хендшейке. Там же можно убедиться, что подобранные параметры не конфликтуют с нужными браузерами.
Что в итоге
За один день прошли весь парк: nginx-серверы, Apache-хосты, Postfix. DHE_EXPORT закрыт везде, свои DH-параметры 2048-бит сгенерированы и подключены. Процедура несложная, но без явного повода её не делают - вот и живут на 1024-битных группах годами.
История FREAK и теперь Logjam показывает одно и то же: в TLS-конфигах накапливается legacy, и без периодического аудита его не видно. Атаки деградации работают именно потому, что где-то в стеке сидит поддержка шифров 20-летней давности - и она там тихо ждёт своего часа.
Детальная публикация исследователей ожидается в начале мая. Данных уже достаточно, чтобы не ждать.