Защита сервера Ubuntu/Debian от уязвимости Logjam
Этот пошаговый гид показывает, как защитить серверы Ubuntu и Debian (включая установки ISPConfig 3) от уязвимости Logjam — атаки на обмен ключами Diffie‑Hellman. Вы сгенерируете уникальные DH‑параметры, настроите Apache, Nginx, Postfix, Dovecot и Pure‑ftpd, а также получите чек‑лист для проверки и варианты действий при несовместимости версий.
Что такое Logjam
Logjam — уязвимость в протоколе обмена ключами Diffie‑Hellman (DHE), которая позволяет атакующему заставить сервер и клиента использовать слабые, заранее вычисленные параметры DH и дешифровать трафик. Кратко: слабые DH‑параметры + старые реализации криптографии = риск компрометации TLS/HTTPS/SMTPS/SSH и других протоколов. Подробно: https://weakdh.org/.
Короткие определения
- Diffie‑Hellman (DHE): алгоритм для согласования секретного ключа по незащищённому каналу.
- ECDHE: вариант на эллиптических кривых (обычно безопаснее и быстрее).
- DH‑параметры (dhparams): наборы чисел, определяющие группу для DHE; для защиты нужна уникальная, длинная группа (рекомендуется 2048 бит и выше).
Совместимость и требования
- Руководство применимо к Debian и Ubuntu. Тесты и команды выполняются от root в shell.
- Для привязки dhparams в Apache необходимы: Apache ≥ 2.4.8 и OpenSSL ≥ 1.0.2. Если версии ниже — можно отключить слабые шифры и всё равно повысить безопасность, но привязка DH‑параметров потребует апгрейда.
Важное: не выдумывайте параметры: используйте openssl для генерации собственной dhparams.pem и храните файл с правами 600.
Генерация уникальной DH‑группы
Создайте каталог и права, если его нет:
mkdir -p /etc/ssl/private
chmod 710 /etc/ssl/private
Сгенерируйте файл dhparams.pem и установите безопасные права:
cd /etc/ssl/private
openssl dhparam -out dhparams.pem 2048
chmod 600 dhparams.pem
Примечание: генерация 2048‑битной группы может занять несколько минут. Для ещё более высокой стойкости используйте 4096 бит, но учтите большую нагрузку на CPU.
Apache
- Добавьте безопасный набор шифров в /etc/apache2/mods-available/ssl.conf:
nano /etc/apache2/mods-available/ssl.conf
Вставьте или измените эти строки (SSLCipherSuite — одна длинная строка, не разбивайте её):
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
SSLHonorCipherOrder on
- Если ваш Apache ≥ 2.4.8 и OpenSSL ≥ 1.0.2, добавьте привязку DH‑параметров:
Проверьте версии:
apache2 -v
Пример вывода:
root@server1:/etc/apache2# apache2 -v
Server version: Apache/2.2.22 (Debian)
Server built: Dec 23 2014 22:48:29
Проверьте OpenSSL:
openssl version
Пример вывода:
root@server1:/# openssl version
OpenSSL 1.0.1e 11 Feb 2013
Если версии удовлетворяют требованиям, отредактируйте ssl.conf и добавьте:
SSLOpenSSLConfCmd DHParameters "/etc/ssl/private/dhparams.pem"
и перезапустите Apache:
service apache2 restart
Если версии старые — либо обновите OpenSSL/Apache (желательно через пакетную систему или безопасно соберите из исходников), либо примените только настройку шифров (SSLCipherSuite), что уже значительно снижает риск.
Nginx
Отредактируйте /etc/nginx/nginx.conf:
nano /etc/nginx/nginx.conf
В секции http { … } добавьте или замените:
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/private/dhparams.pem;
Перезапустите Nginx:
service nginx restart
Postfix
Установите безопасный список шифров и укажите файл DH‑параметров:
postconf -e "smtpd_tls_mandatory_exclude_ciphers = aNULL, eNULL, EXPORT, DES, RC4, MD5, PSK, aECDH, EDH-DSS-DES-CBC3-SHA, EDH-RSA-DES-CDC3-SHA, KRB5-DE5, CBC3-SHA"
postconf -e "smtpd_tls_dh1024_param_file = /etc/ssl/private/dhparams.pem"
Перезапустите Postfix:
service postfix restart
Dovecot
Отредактируйте /etc/dovecot/dovecot.conf:
nano /etc/dovecot/dovecot.conf
Добавьте строку (после ssl_protocols):
ssl_cipher_list=ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
Проверьте версию dovecot:
dovecot --version
- Если версия ≥ 2.2.6, добавьте:
ssl_prefer_server_ciphers = yes
- Если версия ≥ 2.2.7, добавьте также:
ssl_dh_parameters_length = 2048
Перезапустите dovecot:
service dovecot restart
Pure‑ftpd
На Debian/Ubuntu оболочка /usr/sbin/pure-ftpd-wrapper не поддерживает опцию -J по умолчанию. Выполните следующие шаги:
- Отредактируйте обёртку:
nano /usr/sbin/pure-ftpd-wrapper
Найдите строку:
'TLS' => ['-Y %d', \&parse_number_1],
и добавьте сразу после неё:
'TLSCipherSuite' => ['-J %s', \&parse_string],
- Создайте или отредактируйте файл конфигурации шифров:
nano /etc/pure-ftpd/conf/TLSCipherSuite
Вставьте список шифров (замените существующий, если он есть):
ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
- Перезапустите pure‑ftpd (имя сервиса может отличаться в зависимости от пакета):
service pure-ftpd-mysql restart
Проверка и тестирование
Рекомендованные проверки:
- Внешние проверки: https://weakdh.org/ и инструменты вроде testssl.sh для полного аудита TLS.
- Локальные проверки:
- Проверить версии apache/openssl/dovecot: команды
apache2 -v
,openssl version
,dovecot --version
. - Проверить, что SSLv2/SSLv3 отключены и что сервер предпочитает свои шифры.
- Попробовать подключиться с использованием DHE‑наборов и убедиться, что используются параметры ≥2048 бит.
- Проверить версии apache/openssl/dovecot: команды
Пример команды теста TLS‑соединения (проверить сертификат и наборы шифров):
openssl s_client -connect example.com:443 -cipher "DHE" -brief
(замените example.com на ваш хост); отсутствие успешного соединения через слабые DHE‑наборы — желательный результат.
Контрольный список (роль‑ориентированный)
Для системного администратора:
- Сгенерировать /etc/ssl/private/dhparams.pem и установить chmod 600.
- Обновить конфигурации веб‑/почтовых/ftp‑серверов как описано.
- Перезапустить сервисы и проверить логи на ошибки.
Для веб‑администратора:
- Проверить, что SSLCipherSuite/ssl_ciphers обновлены.
- При возможности настроить SSLOpenSSLConfCmd для привязки dhparams.
Для почтового администратора:
- Применить postconf для исключения слабых шифров.
- Убедиться, что dovecot и postfix согласованы по шифрам.
Когда эти меры не помогут
- Если клиенты используют крайне старые ОС/браузеры, не поддерживающие современные шифры. В этом случае либо обновите клиенты, либо допустите понижение безопасности для совместимости, но это рисковано.
- Если у вас компрометированы приватные ключи сервера — замена DH‑параметров не спасёт; нужно заменить сертификаты и ключи.
- Если серверы используют сторонние аппаратные TLS‑акселераторы с собственными устаревшими наборами шифров — требуется обновление/перенастройка оборудования.
Альтернативные подходы
- Отключить DHE совсем и разрешить только ECDHE и AEAD‑шифры (современный и быстрый вариант). Минус: совместимость со старой клиентурой.
- Принудительное использование TLS 1.2/1.3, где DHE не требуется, и ECDHE/рабочие наборы сильнее.
- Централизованное управление конфигурациями (Ansible/Chef/Puppet) для массового применения безопасных настроек.
Мини‑методология внедрения (быстрый план)
- Сделать бэкап конфигураций.
- Сгенерировать dhparams.pem.
- Применить конфигурации сначала на тестовом узле.
- Провести тесты (testssl.sh, openssl s_client).
- Раскатать на продакшн и мониторить логи.
Критерии приёмки
- SSLv2 и SSLv3 отключены.
- Сервер использует предпочтительные серверные шифры (server‑cipher order).
- На стороне сервера нет слабых DHE с длиной < 2048 бит.
- Все изменённые сервисы успешно перезапускаются и обслуживают TLS‑подключения.
Простая диагностическая схема (рекомендации по решению проблем)
flowchart TD
A[Проверить версии Apache/OpenSSL] --> B{Apache >= 2.4.8 и OpenSSL >= 1.0.2?}
B -- Да --> C[Добавить SSLOpenSSLConfCmd и привязать /etc/ssl/private/dhparams.pem]
B -- Нет --> D[Обновить пакеты или применить только набор шифров]
D --> E[Отключить слабые шифры и задокументировать ограничения]
C --> F[Перезапустить сервис и протестировать]
E --> F
F --> G[Мониторинг и внешние тесты]
Факто‑бокс
- Рекомендуемая длина DH‑парамметров: 2048 бит (минимум). 4096 бит — сильнее, но дороже по CPU.
- Порог для SSLOpenSSLConfCmd: Apache 2.4.8, OpenSSL 1.0.2.
- Основной внешний ресурс по уязвимости: https://weakdh.org/.
Однострочный глоссарий
- Logjam: атака, заставляющая использовать слабые общие DH‑параметры; приводит к возможности расшифровки трафика.
- DH: Diffie‑Hellman, способ согласования секретного ключа.
- DH‑параметры (dhparams): числа, задающие группу для DHE.
Резюме
Генерация собственной dhparams.pem и обновление конфигураций шифров в веб‑ и почтовых сервисах — практический и эффективный способ снизить риск эксплуатации Logjam. При старых версиях Apache/OpenSSL важно либо обновиться, либо компенсировать отключением слабых шифров и дополнительным мониторингом.
Ссылки
Похожие материалы

Как использовать Android как модем по USB

Установить Linux на Chromebook: пошаговый гид

smartmontools: тест и мониторинг дисков
Защита от Logjam на Ubuntu/Debian

Dark Sky: гиперлокальный прогноз дождя
