testssl.sh: аудит TLS-шифров и известных уязвимостей своего сервера

0
7
Обложка статьи: testssl.sh: аудит TLS-шифров и известных уязвимостей своего сервера

Мониторинг срока действия сертификата и ручная проверка через openssl и curl закрывают базовый минимум. testssl.sh — отдельный специализированный инструмент: он проверяет сотни комбинаций протоколов и шифров и сверяет конфигурацию с списком именованных уязвимостей (LUCKY13, DROWN, LOGJAM и другие), экономя часы ручной работы с openssl. Проверка выполняется только на своих серверах или по письменному разрешению владельца — сканирование чужих систем без согласия нарушает закон.

Статья опирается на логику направления «Тесты на проникновение» из методики зрелости Группы Сбер (источник); это методика для крупных компаний, мы используем её как ориентир и пересказываем своими словами. Проверка выполнена с testssl.sh (ветка dev) на тестовом сервере nginx с самоподписанным сертификатом в контейнере, после неё всё удалено.

Что должно получиться

Уровень Что это значит на практике
2. Гигиенический Конфигурация TLS проверяется специализированным инструментом по актуальному списку уязвимостей, а не только вручную по памяти

Критерии сформулированы нами по мотивам методики, это ориентир, а не оценка соответствия.

Запуск

git clone --depth 1 https://github.com/testssl/testssl.sh.git
cd testssl.sh
./testssl.sh --quiet --color 0 -e -S ваш-домен.ru:443

Ключ -e показывает каждый поддерживаемый шифр отдельно, -S — сведения о сертификате (срок действия, цепочка доверия, OCSP). Для точечных проверок есть более узкие режимы:

./testssl.sh -p ваш-домен.ru:443    # только версии протокола (TLS 1.0, 1.1, 1.2, 1.3)
./testssl.sh -U ваш-домен.ru:443    # только известные именованные уязвимости

Результат проверки

На тестовом сервере с nginx и минимальной конфигурацией (только TLS 1.2 и 1.3, самоподписанный сертификат) полная проверка (-e -S) заняла около 20 секунд и показала:

Проверка Результат
Сертификат: subjectAltName Отсутствует — браузеры будут жаловаться на несовпадение имени, даже если CN указан верно
Сертификат: цепочка доверия Не ок (самоподписанный) — ожидаемо для тестового сервера без реального CA
Отзыв сертификата Ни CRL, ни OCSP не указаны — для продуктивного сертификата это стоило бы поправить у вашего CA
Протоколы (-p) TLS 1.0 и 1.1 не предлагаются (ок), TLS 1.2 и 1.3 предлагаются (ок)
Известные уязвимости (-U) DROWN, LOGJAM, BEAST, Winshock, RC4 — не уязвим; LUCKY13 — потенциально уязвим, так как сервер предлагает шифры с режимом CBC

Находка по LUCKY13 — не ложная тревога и не повод для паники одновременно: современные версии OpenSSL и большинства серверов уже содержат исправления на уровне реализации, которые закрывают практическую эксплуатацию, но сам факт, что CBC-шифры в списке есть, testssl.sh справедливо отмечает как потенциальный риск. Решение — убрать CBC-шифры из списка разрешённых, если приоритет шифров позволяет полностью перейти на AEAD-режимы (GCM, ChaCha20-Poly1305).

Порядок внедрения

  1. Запускайте после любого изменения конфигурации TLS (nginx, Traefik, балансировщика) — до того, как изменение попадёт на весь трафик.
  2. Сверяйте список шифров с актуальной рекомендацией (Mozilla SSL Configuration Generator в режиме «Modern» или «Intermediate» в зависимости от требований к совместимости).
  3. Включите в регулярную проверку наряду с мониторингом срока действия сертификата — конфигурация шифров тоже устаревает по мере появления новых уязвимостей.
  4. Не запускайте против чужих серверов без письменного разрешения, даже «чтобы посмотреть, как у конкурентов» — это несанкционированное сканирование.

Диагностика

Симптом Причина и что делать
Fatal error: You need to install hexdump Не хватает системных утилит. Установите bsdextrautils (или bsdmainutils в более старых дистрибутивах) и dnsutils
Проверка зависает на DNS-запросах Сервер без выхода в интернет не может проверить CAA и некоторые записи DNS. Используйте изолированный стенд только для функциональных проверок, не для полной картины
Много находок уровня INFO Это справочная информация, не проблема. Фильтруйте вывод по WARN и выше при автоматическом разборе
Отчёт не совпадает с данными внешних сервисов (например, Qualys SSL Labs) Разные инструменты обновляют базы уязвимостей не одновременно. Сверяйте оба при спорном результате

Где это в модели зрелости

Материал относится к направлению «Тесты на проникновение» (материалы направления, карта зрелости). Уровень 2 требует регулярной технической проверки собственного периметра специализированными инструментами: testssl.sh даёт такую проверку для TLS конкретно, не заменяя при этом более широкий аудит внешней поверхности.

Как проверить

  1. Полная проверка (-e -S) запускается после каждого изменения конфигурации TLS.
  2. Находки уровня предупреждения и выше разобраны и либо исправлены, либо осознанно приняты с обоснованием.
  3. Устаревшие шифры (CBC-режим, RC4, экспортные шифры) не включены в список разрешённых там, где это не требуется для совместимости.
  4. Проверка применяется только к собственным серверам или по письменному разрешению владельца.

Источники

  • Методика оценки уровня зрелости кибербезопасности компании, Группа Сбер: sberbank.ru.
  • Документация testssl.sh: testssl.sh; исходный код: github.com/testssl/testssl.sh.

Комментарии закрыты.