Усиление SSL для веб-сервера Nginx

Мы уже писали об усилении SSL для веб-сервера Apache. В этом материале мы рассмотрим аналогичные действия в отношении веб-сервера Nginx.

Debian 7

Обновим пакеты:

apt-get update
apt-get upgrade

Установим веб-сервер nginx:

apt-get install nginx

Пакет openssl уже был установлен по умолчанию.

Имеем версии nginx и openssl:

nginx -v
nginx version: nginx/1.2.1
openssl version
OpenSSL 1.0.1e 11 Feb 2013

Подключим домен ukrnames.idua.org к серверу и установим SSL. Выполним проверку SSL-соединения на сайте https://www.ssllabs.com/ssltest/analyze.html?d=ukrnames.idua.org

strongssl8

Получили оценку “F” – плохой результат.

Произведем настройку веб-сервера nginx для устранения уязвимостей.

Оставим активными протоколы TLS, заменив в файле, где мы подключали сертификат (/etc/nginx/sites-enabled/default), строку “ssl_protocols SSLv3 TLSv1;” на “ssl_protocols TLSv1 TLSv1.1 TLSv1.2;”

sed -i 's/ssl_protocols SSLv3 TLSv1/ssl_protocols TLSv1 TLSv1.1 TLSv1.2/g' /etc/nginx/sites-enabled/default

Теперь заменим алгоритмы шифрования с “ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;” на “ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;” :

sed -i 's/ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP/ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH/g' /etc/nginx/sites-enabled/default

Осталось решить уязвимость “This server supports weak Diffie-Hellman (DH) key exchange parameter”, более подробно о DH-key можно узнать здесь.

Перейдем в папку с нашим SSL-сертификатом (/etc/nginx/) и сгенерируем ключ не менее 2048 бит. В данном примере это будет ключ длиной 4096 бит:

cd /etc/nginx/
openssl dhparam -out dhparam.pem 4096

Процесс генерирования может занять много времени.

После завершения процесса генерирования создастся файл /etc/nginx/dhparam.pem

В конфигурационный файл веб-сервера добавим строку:

ssl_dhparam /etc/nginx/dhparam.pem;

Так же подключим возможность работы HSTS, добавив в конфигурационный файл nginx строку:

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

Так же добавим кеширование ssl-сессий и запрет на использование вашего сайта по протоколу https во фреймах:

add_header X-Frame-Options "DENY";
ssl_session_cache builtin:1000 shared:SSL:10m;

Перезагружаем веб-сервер и заново проверяем безопасное соединение сайта.

strongssl9

Теперь оценка “А+”, на этом конфигурация окончена.

Debian 8

Выполним все то же самое для Debian 8.

Версия OpenSSL и Nginx:

openssl version
OpenSSL 1.0.1k 8 Jan 2015
nginx -v
nginx version: nginx/1.6.2

Подключим домен ukrnames.idua.org к серверу, установим SSL и настроим конфигурацию веб-сервера относительно безопасности. Конфигурационный файл (в данном примере /etc/nginx/site-enabled/default) будет иметь вид:

server {
        listen 443;
        server_name ukrnames.idua.org;
        add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
        add_header X-Frame-Options "DENY";
        root /var/www/;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/nginx/cert.pem;
        ssl_certificate_key /etc/nginx/cert.key;
        ssl_session_cache builtin:1000 shared:SSL:10m;
        ssl_session_timeout 5m;

        ssl_prefer_server_ciphers on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
        ssl_dhparam /etc/nginx/dhparam.pem;
}

Перезагружаем веб-сервер и проверяем безопасное соединение.

strongssl10

Оценка “А+”, настройка веб-сервера закончена.