Вопрос или проблема
Мне нужно добавить ssl_ciphers
в мой конфиг nginx. Согласно https://wiki.mozilla.org/Security/Server_Side_TLS, следующие наборы шифров рекомендуются (с промежуточной совместимостью):
Наборы шифров (TLS 1.3): TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
Наборы шифров (TLS 1.2): ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
Мой вопрос совсем простой: как мне добавить оба набора TLS 1.3 и TLS 1.2 в мой конфиг nginx?
Вот так?
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256';
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
Обратите внимание, что параметры TLSv1.1 и TLSv1.2 (1.1.13, 1.0.12) работают только при использовании OpenSSL 1.0.1 или выше. Параметр TLSv1.3 (1.13.0) работает только при использовании OpenSSL 1.1.1, собранного с поддержкой TLSv1.3
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
Если тест конфигурации не пройден, ваша версия nginx не поддерживает tlsv1.3
$ nginx -t
nginx: [emerg] invalid value "TLSv1.3" in /etc/nginx/conf.d/<file>:34
nginx: configuration file /etc/nginx/nginx.conf test failed
Выберите совместимую версию nginx, если ошибки нет — все в порядке.
Инструмент Mozilla хороший для получения нужного результата. Этот вопрос (и связанные ответы) и предоставленные ссылки также интересны для понимания работы директив конфигурации.
Конфигурация следующая:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
Это промежуточная конфигурация Mozilla:
ssl_protocols TLSv1.2 TLSv1.3
включает версии 1.2 и 1.3. Обратите внимание, что все шифры версии 1.3 автоматически включены, нам ничего не нужно делать, и также, что директиваssl_ciphers
предоставляет шифры только для версии 1.2.ssl_ciphers
: все шифры для TLS 1.2.ssl_prefer_server_ciphers off
: позволяет клиенту выбрать наиболее производительный набор шифров для их аппаратной конфигурации среди шифров, предлагаемых сервером. См. Почему ‘ssl_prefer_server_ciphers off’?- Если вы хотите только TLS 1.3, читайте Nginx с только TLS1.3 наборами шифров, так как там есть нюанс. Вы также можете использовать инструмент в ответе, чтобы проверить, какие шифры предлагались, с последней версией
openssl
(например,OpenSSL 1.1.1l 24 Aug 2021
).
$ ./test_ciphers.sh <вставьте IP здесь>:443
Using OpenSSL 1.1.1l 24 Aug 2021.
Using tls1_1
Testing ECDHE-ECDSA-AES256-SHA ... NO (tlsv1 alert protocol version)
...
Using tls1_2
Testing ECDHE-ECDSA-AES256-GCM-SHA384 ... NO (sslv3 alert handshake failure)
...
Testing ECDHE-RSA-AES256-GCM-SHA384 ... YES
Testing ECDHE-RSA-CHACHA20-POLY1305 ... YES
Testing ECDHE-RSA-AES128-GCM-SHA256 ... YES
Using tls1_3
Testing TLS_AES_256_GCM_SHA384 ... YES
Testing TLS_CHACHA20_POLY1305_SHA256 ... YES
Testing TLS_AES_128_GCM_SHA256 ... YES
Вы должны использовать следующие строки:
ssl_session_timeout 5m;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; # Включите TLSv1.3, если поддерживается
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH"; # Используйте генератор Mozilla
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
.
Ответ или решение
Введение в вопрос настройки шифровальных наборов в конфигурации Nginx является актуальной темой для ИТ-специалистов, особенно с учетом изменений в протоколах безопасности и поддержке различных версий TLS. В данной консультации мы обсудим, как правильно интегрировать шифровальные наборы в Nginx, учитывая рекомендации Mozilla и специфику использования разных версий TLS.
Теория
Nginx, популярный веб-сервер, поддерживает разнообразные протоколы и шифровальные наборы, обеспечивая безопасность соединений между клиентами и серверами. Протоколы TLS (Transport Layer Security) являются основными механизмами для обеспечения конфиденциальности и целостности данных в интернете. C течением времени, требования к безопасности растут, и более старые версии протоколов TLS (например, TLS 1.0 и TLS 1.1) становятся неактуальными из-за уязвимостей.
Рекомендации от Mozilla касательно использования различных шифровальных наборов помогают создать баланс между безопасностью и совместимостью. Intermediate уровень конфигурации предлагает современные и безопасные шифры, которые поддерживаются большинством клиентов и серверов.
Для более новых TLS 1.3, шифровальные наборы определены самим протоколом, и их явное указание в конфигурации не требуется. Однако, для TLS 1.2 необходимо указать полный список поддерживаемых шифров.
Пример реализации
Рассмотрим, как настроить nginx.conf для поддержки TLS 1.2 и TLS 1.3:
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3; # Включаем TLSv1.3, если он поддерживается
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off; # Позволяет клиенту выбирать наиболее подходящий шифр
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
-
ssl_protocols: Директива включения протоколов TLS. Мы ограничиваем список до TLSv1.2 и TLSv1.3, которые считаются более безопасными по сравнению с устаревшими версиями.
-
ssl_ciphers: Для TLS 1.2 указываем список рекомендованных шифров, которые обеспечивают высокую степень безопасности и совместимость.
-
ssl_prefer_server_ciphers: Установка в ‘off’ позволяет клиенту выбрать наиболее производительный набор шифров, что может быть предпочтительнее в некоторых сценариях работы с разнообразными клиентами.
Применение
После настройки конфигурации, вам необходимо перезапустить Nginx для принятия изменений. Проверить правильность конфигурации можно с помощью команды:
nginx -t
Если Nginx выдает ошибку, возможно, ваша версия Nginx или OpenSSL не поддерживает указанные шифры или TLS 1.3. Убедитесь, что вы используете актуальную версию, совместимую с современными требованиями безопасности.
Кроме того, можно проверить, какие шифровальные алгоритмы поддерживаются сервером, используя утилиты вроде openssl
:
openssl s_client -connect server.example.com:443 -tls1_2
Заключение
Настройка шифровальных наборов в Nginx — критичный аспект обеспечения безопасности вашего веб-сервера. Следование современным рекомендациям и использование актуальных версий программного обеспечения существенно снижает риск уязвимостей. Обеспечьте, что используемые шифры соответствуют вашим требованиям к безопасности и совместимости, а также учитывайте возможность будущих обновлений, чтобы оставаться на шаг впереди в вопросах информационной безопасности.