Совершенная прямая секретность для сервера NGINX (SSL)

В этой статье рассмотрим процесс реализации NGINX сервера совершенно прямой секретности под операционными системами Debian и Ubuntu. Процесс установки подходит для всех систем GNU/Linux.

В криптографии термин «совершенная прямая секретность» (PFS) означает, что если третья сторона узнает какой-либо сеансовый ключ, то она сможет получить лишь доступ к данным, защищенным лишь этим ключом. Для сохранения совершенной прямой секретности ключ, используемый для шифрования передаваемых данных, не должен использоваться для получения каких-либо дополнительных ключей. Также, если ключ, используемый для шифрования передаваемых данных, был получен на базе какого-то еще ключевого материала, этот материал не должен использоваться для получения каких-либо других ключей.

Когда в openSSL была обнаружена ошибка переполнения буфера Hearbleed, стало ясно, что PFS является обязательной для любой системы, которая использует SSL/TLS.

Настроим NGINX для работы с PFS.

Внимание! Если в обычных случаях рекомендуется запускать количество процессов по желанию сервера nginx, то при реализации https число процессов рекомендуется принудительно увеличить, чтобы число процессов в 2-4 раза превышало количество ядер аппаратной платформы.

Зайдём в директорию конфигурации NGINX:

cd /etc/nginx/

Нам нужно установить протокол Ди́ффи-Хе́ллмана, который достаточно эффективeн. Считается, что 4096 бит является излишеством и вызовет чрезмерную нагрузку на ЦП системы, но с современной вычислительной мощностью это является стоящим компромиссом.

openssldhparam -out dh4096.pem 4096

Удобно, когда файл конфигурации, специальный для каждой отдельной задачи, разделен в файл с исходным текстом, что делает реализацию PFSна различных системах проще. Откроем в блокноте файл конфигурации/etc/nginx/perfect-forward-secrecy.conf

Вставим в файл следующее:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM
EECDH+ECDSA+SHA384 \
EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256
EECDH+aRSA+RC4 \
EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS
!MEDIUM";
ssl_dhparamdh4096.pem;

Затем изменим файл конфигурации NGINX, добавив следующую строку в файл конфигурации NGINX (стандартно, /etc/nginx/nginx.conf), в нижней части(и в пределах) блокаhttp {}:

# После строк, включающих:/sites-enabled/, необходимо добавить:
include perfect-forward-secrecy.conf;

Для того, чтобы подтвердить внесённые изменения, перезапустимNGINX:

service nginx restart

Если в тесте https://www.ssllabs.com/ssltest/analyze.html отображается красным цветом «Session resumption (caching) No (IDs assigned but not accepted)» и сервер использует SNI, добавим следующее на верхний уровень блока http {}:

ssl_session_cache shared:SSL:10m;

Снова перезапустим NGINX, чтобы изменения вступили в силу:

service nginx restart

Теперь тест больше не должен определять ошибку. (хотя ошибка не уменьшает общих баллов в тесте).

Реализация HTTP Strict Transport Security (HSTS) с большей длительностью

Этот пункт стоит выполнить при условии, что:

1.Вы хотите установить SSL для всех ресурсов любого хоста, для которого установлен заголовок (т.е. каждая страница на сайтe).

2.Вам необходима возможность принимать или игнорировать SSL предупреждения для любого запрошенного ресурса с любого хоста, для которого установлен заголовок, например "Domain Name Mismatch" и т.д. Смысл HSTSзаключается в том, что предупреждения и ошибки, относящиеся к сертификату SSLне могут быть отменены.

Добавим следующие строки в нижнюю часть файл конфигурации/etc/nginx/perfect-forward-secrecy.confи сохраним изменения:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
add_header X-Frame-Options SAMEORIGIN;

Только при перезагрузке в NGINX вступят в силу именно необходимые нам изменения:

service nginx reload

Теперь выясним, работает ли HSTS как положено, пройдя тестирование на сайте www.ssllabs.com/ssltest/analyze.html. Если HSTS реализован верно, мы увидим оценку в зелёном квадрате, со следующей надписью: "This server supports HTTP Strict Transport Security with long duration. Gradesetto A+."

Поздравляю, теперь у вас одна из самых безопасных реализаций SSL/TLSв Интернете. Ура!

Авторизуйтесь, чтобы получить возможность оставлять комментарии
Go to top