Как мне включить идеальную прямую секретность по умолчанию на Apache?

65

Предупреждение: используйте только рекомендации для конфигурации Apache из приведенных ниже ответов. Для чего используется шифр - нормы безопасности меняются со временем, а некоторые из приведенных ниже рекомендаций по безопасности уже устарели.

Вслед за недавними событиями я пересматриваю настройку Apache. В настоящее время мой конфигуратор сайта apache выглядит примерно так:

 <IfModule mod_ssl.c>
    <VirtualHost *:80>
            ServerName example.com
            ServerAlias www.example.com
            Redirect permanent / https://example.com
    </VirtualHost>

    <VirtualHost *:443>
            ServerAdmin webmaster@localhost
            ServerName example.com

            DocumentRoot /var/www-wordpress
            <Directory />
                    Options FollowSymLinks
                    AllowOverride None
            </Directory>
            <Directory /var/www-wordpress>
                    Options Indexes FollowSymLinks MultiViews
                    AllowOverride FileInfo
                    Order allow,deny
                    allow from all
            </Directory>

            ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
            <Directory "/usr/lib/cgi-bin">
                    AllowOverride None
                    Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                    Order allow,deny
                    Allow from all
            </Directory>

            ErrorLog ${APACHE_LOG_DIR}/error.log
            LogLevel warn

            CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
            SSLCertificateFile    /etc/ssl/certs/example.com.crt
            SSLCertificateKeyFile /etc/ssl/private/example.com.key
            SSLCertificateChainFile /etc/ssl/certs/sub.class1.server.ca.pem
            <FilesMatch "\.(cgi|shtml|phtml|php)$">
                    SSLOptions +StdEnvVars
            </FilesMatch>
            <Directory /usr/lib/cgi-bin>
                    SSLOptions +StdEnvVars
            </Directory>

            BrowserMatch "MSIE [2-6]" \
                    nokeepalive ssl-unclean-shutdown \
                    downgrade-1.0 force-response-1.0
            BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
    </VirtualHost>

Что мне нужно сделать, чтобы поддержать прекрасную секретность? Как включить стандартную конфиденциальность SSL по умолчанию? Как я могу обеспечить его соблюдение?

  • 2
    +1. Я думаю, что трудно получить хорошую конфигурацию, потому что SSLv3 / TLS v1 уязвимы для BEAST, что означает, что вы должны выбрать слабый RC4 среди любых шифров на основе CBC, таких как AES. При использовании TLS v1.1 или v1.2, OTOH, лучше использовать более сильный шифр, такой как AES. AFAIK, Apache не позволяет вам условно выбирать шифры в зависимости от версии протокола. Браузерная поддержка TLS v1.1 + все еще слаба (у Firefox ее пока нет.) Бизнес шифров ортогонален наличию совершенной прямой секретности при обмене ключами (я думаю), но хотелось бы увидеть конфигурацию, которая его принимает все в счет.
  • 4
    Обмен ключами DHE и ECDH обеспечивает идеальную секретность пересылки. DHE поддерживается практически всеми браузерами, в то время как ECDH требует как минимум TLSv1.1 и довольно современный браузер. Однако обмен ключами DHE происходит примерно в три раза медленнее, чем простой обмен ключами RSA.
Показать ещё 2 комментария
Теги:
ssl
cryptography

8 ответов

94
Лучший ответ

Как насчет:

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite EECDH+AES:EDH+AES:-SHA1:EECDH+RC4:EDH+RC4:RC4-SHA:EECDH+AES256:EDH+AES256:AES256-SHA:!aNULL:!eNULL:!EXP:!LOW:!MD5

Обратите внимание на добавление флага -SSLv3 для отключения SSLv3. Это добавлено для защиты от атаки POODLE.

Это предпочтет совершенную прямую секретность, но не за счет уязвимости для атаки BEAST. Поскольку у Apache не существует способа настройки предпочтений шифрования на основе версии протокола, я подделываю его, ссылаясь на шифры, доступные только в более новых протоколах. В частности, AES был доступен только с хэшированием SHA1 до TLSv1.2. Таким образом, список начинается с эфемерных шифров Diffie-Hellman TLSv1.2, затем RC4 (сначала с эфемерным DH, а затем без) и, наконец, BEES-уязвимый вариант AES. Исключение отсутствия аутентификации/слабого шифрования/слабого хэширования в конце - это просто для хорошей гигиены и может быть опущено, поскольку такие шифры не были введены. Если производительность является проблемой, используйте только EECDH и опустите EDH.

В сочетании с Apache 2.2 (таким образом, нет EECDH, как говорит @Bruno), за https://www.ssllabs.com/ssltest/analyze.html, это обеспечивает только PFS для iOS Safari, IE и Firefox - TLSv1.0, поэтому они получают RC4, чтобы избежать BEAST. (Увы, нет такой вещи, как EDH RC4, поэтому без EECDH вы откажетесь от PFS). Это, я считаю, лучшее, на что можно надеяться, с этими браузерами на Apache 2.2. Chrome является единственным, кто плохо обслуживается, поскольку он поддерживает TLSv1.1 и может использовать EDH AES, не будучи уязвимым для BEAST. Вместо этого он получает RC4-RSA, как Firefox и IE. Обновление Apache для включения EECDH RC4 должно получить PFS для Firefox, IE и Chrome.

Обновление 2013-11-09:

Я нашел несколько альтернативных рекомендаций в Интернете. Они уделяют меньше внимания защите BEAST (возможно, мудрый, BEAST в основном смягчается на стороне клиента сейчас) и больше внимания уделяют безупречной секретности. В разной степени они также имеют более сильные предпочтения для GCM и большее нежелание принимать RC4.

Особо следует отметить следующие рекомендации:

Лично я собираюсь пойти с Mozilla OpSec. Их рассуждения хорошо объяснены на их странице. Следует отметить, что они предпочитают AES128 по сравнению с AES256. По их словам: "[AES128] обеспечивает хорошую защиту, очень быстро и, похоже, более устойчив к атакам с временными атаками".

Примечательно, что в рекомендации Ивана Ристича и Джеффруа Грамайза это означает, что SSLv3 отключен. Я думаю, что это в основном просто ломает IE6, хотя некоторые связанные с безопасностью различия между SSLv3 и TLS v1.0 упомянутые в Википедии.

Также до того, как я не говорил о CRIME и BREACH. Чтобы защитить от CRIME, отключите сжатие SSL. Это включено в приведенные примеры. Для защиты от BREACH вам необходимо отключить сжатие на уровне HTTP. Для Apache 2.4 просто сделайте это один раз в глобальном масштабе:

<Location />
  SetEnvIfExpr "%{HTTPS} == 'on'" no-gzip
</Location>

Для более старых версий Apache поместите это в каждый VirtualHost, где включен SSLEngine:

<Location />
    SetEnv no-gzip
</Location>

Обновление 2014-10-14: Руководство Mozilla OpSec теперь разделено на рекомендации по старой/промежуточной/современной совместимости. С настройками от промежуточного или современного вы в итоге отключите SSLv3. Это защитит от атаки POODLE.

  • 2
    Два вопроса, Лоррин. Почему не SSLProtocol all -SSLv2 -SSLv3 ? А почему не AESGCM ? TLS1.0, кажется, имеет почти 100% -ное принятие ( безопасность транспортного уровня ).
  • 1
    Привет noloader, хорошие вопросы. Добавление -SSLv3 - хорошая идея. Я не знаю какой-либо конкретной уязвимости, от которой можно было бы защититься, но лаборатории Qualys SSL дают вам немного более высокий балл протокола, если вы отключите SSLv3. (И они знают об этом гораздо больше, чем я!) AESGCM является избыточным: термин, подобный EECDH+AES что-либо с обменом ключами EECDH и шифром AES, а также варианты с режимом Galois / Counter и без него (GCM). Вы можете убедиться в этом сами в командной строке: openssl ciphers -v 'EECDH+AES:...<rest of cipher suite string>' будет включать варианты GCM.
Показать ещё 4 комментария
6

Из моего собственного понимания вам нужно активировать SSLHonorCipherOrder и добавить SSLCipherSuite с помощью ECDHE и DHE шифров из openssl ciphers -v

Из моего /etc/apache2/mods-available/ssl.conf:

SSLHonorCipherOrder on
SSLCipherSuite ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:DHE-RSA-CAMELLIA128-SHA:AES128-SHA:RC4-SHA:HIGH:!aNULL:!MD5:!ADH

Чтобы протестировать ваш сайт, вы можете использовать: https://www.ssllabs.com/ssltest

Примечание: Eliptic Curve DHE работает только с Apache 2.3.3 или выше (см. источник и комментарий Bruno).

  • 0
    Наборы шифров DHE не-EC прекрасно работают с Apache Httpd 2.2 (и, возможно, более низкими версиями).
3

Введите этот код шифрования в свой httpd.conf в директиве main/core conf:

SSLCipherSuite AES128+EECDH:AES128+EDH
SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder On
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off 
SSLUseStapling on 
SSLStaplingCache "shmcb:logs/stapling-cache(150000)" 

Вы даже можете проверить состояние безопасности, протестировав его по адресу: https://www.ssllabs.com/ssltest/analyze.html?

2

Эта статья поможет вам настроить передовую безопасность и обновить текущие стандарты - https://community.qualys.com/blogs/securitylabs/2013/08/05/configuring-apache-nginx-and-openssl-for-forward-secrecy

По состоянию на 09/16/2015, это даст вам результаты теста A на SSLLabs.

SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:EDH+aRSA:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4
2

Посмотрите https://cipherli.st

Здесь вы найдете фрагменты конфигурации копирования и вставки для нескольких служб, которые должны обеспечить сильные параметры безопасности ssl.

2

Попробуйте использовать этот код в ssl.conf:

SSLProtocol +TLSv1.2 +TLSv1.1 +TLSv1
SSLCompression off
SSLHonorCipherOrder on
SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:RC4-SHA:AES256-GCM-SHA384:AES256-SHA256:CAMELLIA256-SHA:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:CAMELLIA128-SHA

Кстати,

Экспертный совет: трюк с разделенной записью (1/n-1) реализован в Firefox через некоторое время. Таким образом, вы можете безопасно отключить RC4 в Firefox в расширенном меню конфигурации. Для этого введите "about: config" в свою адресную строку, затем выполните поиск "rc4" и переключите все найденные значения на "false". Если возникают проблемы с подключением, верните эти параметры в true.

https://cc.dcsec.uni-hannover.de/

Эти веб-сайты предоставляют вам информацию о наборах SSL-шифров, поддерживаемых вашим браузером для защиты соединений HTTPS.

2

Набор шифров, которые обеспечивают Perfect Forward Secrecy, - это те, которые используют эфемерную форму обмена ключами Диффи-Хеллмана. Их недостатком является их накладные расходы, которые могут быть улучшены за счет использования вариантов эллиптической кривой (см. Vincent Bernat blog.)

Набор шифров в Apache Httpd (если вы используете mod_ssl, скомпилированный с помощью OpenSSL), настраивается с помощью SSLCipherSuite, который принимает список, который вы увидите при использовании команды openssl ciphers. Если вы посмотрите на справочную страницу OpenSSL, вы найдете kEDH то, что вы ищете. (Вы также можете перечислить индивидуальные списки шифров.)

0

Я получил оценку A (сентябрь 2016 г.) на SSLLabs, которая по-прежнему поддерживает Windows XP/Internet Explorer 8, используя этот ssl.conf конфигурации на Apache:

SSLProtocol All -SSLv2 -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite EECDH+AESGCM:AES256+EECDH:DES-CBC3-SHA

Вкратце: разрешено только TLS: все версии поддерживаются для совместимости, и для совместимости также разрешен шифр DES-CBC3-SHA. Первые предпочтительные два шифра используют Эллиптическая кривая Diffie-Hellman, последняя была добавлена ​​в качестве резервной, потому что это хороший выбор среди доступных шифров XP/IE. Если вы установили последнюю версию OpenSSL, этого микса достаточно, чтобы получить A на момент написания.

Надеюсь, что это будет полезно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню