Вопрос или проблема
После нескольких недель чтения и тестирования я не могу создать стабильный файл Vhost, который удовлетворял бы всем критериям контрольного списка безопасности BSI. Я всегда проверяю с помощью tls-check.de и testssl.sh.
Либо один из шифросуитов TLS1.3 является недопустимым, TLS1.2 не включен, шифросуиты TLS1.2 некорректны или (если шифросуиты TLS1.2 корректны) критерии TLS1.3 не соответствуют.
Я запускаю контейнер Docker в сетевом режиме.
Мой файл конфигурации VHost в Apache выглядит следующим образом:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName $SERVERNAME ServerAdmin $ADMINMAIL DocumentRoot /var/www/html/public ErrorLog /var/log/apache2/error.log CustomLog /var/log/apache2/access.log combined <Directory "/var/www/html/public"> AllowOverride All Options -Indexes +FollowSymLinks -MultiViews Require all granted </Directory> Protocols h2 h2c http/1.1 H2Direct on H2Push on <FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php8.3-fpm.sock|fcgi://localhost/" </FilesMatch> # Включение SSL SSLEngine on # Сертификат SSLCertificateFile /etc/letsencrypt/live/$SERVERNAME/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/$SERVERNAME/privkey.pem # Версии TLS (разрешить только TLS 1.2 и TLS 1.3) SSLProtocol -all +TLSv1.2 +TLSv1.3 # Шифросуиты TLS1.3 (нотация IANA) SSLCipherSuite TLSv1.3 TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384 # это исключает TLS_CHACHA20_POLY1305_SHA256 (не допускается контрольным списком BSI) # Шифросуиты (TLS 1.2) SSLCipherSuite ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384 # эта строка, кажется, игнорируется # Строгая проверка SNI SSLStrictSNIVHostCheck on # Принудительный порядок шифров SSLHonorCipherOrder on # сжатие SSL SSLCompression off # НSTS (строгая транспортная безопасность HTTP) Header всегда set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" # Дополнительный заголовок безопасности Header всегда set X-Content-Type-Options "nosniff" Header всегда set X-Frame-Options "DENY" Header всегда set X-XSS-Protection "1; mode=block" </VirtualHost> </IfModule> ServerTokens Prod ServerSignature Off SSLUseStapling On SSLStaplingCache "shmcb:logs/stapling_cache(32768)"
Я прочитал всю документацию, спрашивал chatgpt, но ничего не работает. Может быть, у вас есть хорошая идея. спасибо
Ответ или решение
Конфигурация SSL/TLS для Apache, соответствующая требованиям BSI (Бундесама информационной безопасности, Германия) по чек-листу TR-03116-4, представляет собой важную задачу для обеспечения высокого уровня безопасности веб-сайтов и информационных систем. Этот документ задает строгие требования к защите данных и конфиденциальности, что делает его особенным при внедрении.
Теория (Theory)
В основе чек-листа BSI TR-03116-4 лежит необходимость использования современных и безопасных криптографических протоколов и алгоритмов. SSL/TLS протоколы должны быть правильно настроены, чтобы минимизировать риски уязвимостей и атак, таких как Padding Oracle, Man-in-the-Middle (MitM) и др. Чек-лист подробно описывает, какие версии протоколов, шифросистемы и дополнительные функции безопасности должны быть включены или исключены.
Пример (Example)
Ваш текущий конфигурационный файл для SSL/TLS содержит многие из нужных элементов, но требует корректировки. Давайте разберем его и внесем изменения шаг за шагом:
-
Версии TLS:
- Чек-лист BSI указывает на необходимость использования только TLS 1.2 и TLS 1.3. Это правильно учтено в вашей конфигурации:
SSLProtocol -all +TLSv1.2 +TLSv1.3
.
- Чек-лист BSI указывает на необходимость использования только TLS 1.2 и TLS 1.3. Это правильно учтено в вашей конфигурации:
-
Шифросистемы для TLS 1.3:
- Вы правильно исключили шифросистему
TLS_CHACHA20_POLY1305_SHA256
. Оставьте:SSLCipherSuite TLSv1.3 TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384
- Вы правильно исключили шифросистему
-
Шифросистемы для TLS 1.2:
- Здесь возникает ошибка, так как список шифросистем необходимо указать в отдельной директиве или вместе, но разделять версии:
SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305
Убедитесь, что все произведенные изменения для
SSLCipherSuite
применяются корректно через тесты и проверку конфигурации. - Здесь возникает ошибка, так как список шифросистем необходимо указать в отдельной директиве или вместе, но разделять версии:
-
Порядок шифросистем (
SSLHonorCipherOrder
):- Включено правильно, это заставляет сервер выбирать шифры из списка на основе собственного приоритета.
-
Строгая проверка SNI (
SSLStrictSNIVHostCheck
):- Включение этой опции помогает избежать уязвимостей, связанных с неявным выбором неправильных виртуальных хостов.
-
Отключение компрессии (
SSLCompression
):- Это основная рекомендация для предотвращения атаки BREACH.
-
HSTS:
- Настроено верно, обеспечивает дополнительный уровень защиты, подтверждая, что браузеры всегда используют HTTPS.
-
Дополнительные заголовки безопасности:
- Эти заголовки направлены на предотвращение разнообразных веб-атак и корректно включены.
Применение (Application)
Ваш конфигурационный файл должен протестироваться не только через онлайн-инструменты, но и через локальные тесты таких инструментов, как OpenSSL
, который позволяет проверить соответствие вашей конфигурации чек-листу BSI:
openssl s_client -connect example.com:443 -tls1_3
openssl s_client -connect example.com:443 -tls1_2
Используя testssl.sh
, вы можете глубже анализировать соответствие вашей конфигурации. Если какие-то шифры не отображаются, проверьте их поддержку вашей версией OpenSSL и Apache.
Также, учитывая, что вы используете контейнер Docker, убедитесь, что используете последнюю версию Apache и OpenSSL, возможно, конфигурация хоста влияет на работу контейнера.
Внедрение данных изменений и тестирование их производительности позволят вам соответствовать критериям BSI и обеспечат безопасность вашим пользователям.