PCI Compliance в NGINX

PCI Compliance в NGINX

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

Готовим NGINX к проверке PCI Compliance, поднимаем безопасность SSL соединений и устраняем уязвимости.

ssl_session_timeout

Разрешаем возобновление сессий при помощи TLS session tickets
Задаем тип и размер кэшей для хранения параметров сессии.
Кеш необходим для возможности повторного использования ключей сессии, таким образом при установлении нового соединения будут использоваться старые ключи, т.е. не будет повторно производиться хендшейк.

1
2
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;

ssl_prefer_server_ciphers

Указывает, чтобы при использовании протоколов SSLv3 и TLS серверные шифры были более приоритетны, чем клиентские. (nginx ©)

1
ssl_prefer_server_ciphers on;

Исключаем возможность BEAST-атаки CVE-2011-3389

ssl_ciphers

1
ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5;

Указывает используемые шифры. За счет изменения набора шифров настраивается Forward Secrecy. От стандартного набора, предлагаемого NGINX, отличается только параметром !kEDH,

Также рекомендую в nginx.conf в секцию http добавить параметр

1
ssl_ciphers RC4:HIGH:!aNULL:!MD5:!kEDH;

для того, что бы шифрам с CBC-режимом предпочитался RC4-SHA, так как они подвержены уязвимостям.

add_header Strict-Transport-Security max-age

Strict-Transport-Secutiry — заголовок, указывающий браузеру на то, что сайт доступен только по https. Это предотвращает возможность перехода обратно на http-версию для последующей атаки через незашифрованное соединение.

1
2
3
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

ssl_stapling

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

1
2
3
4
ssl_stapling on;
ssl_stapling_verify on;
resolver $DNS_1 $DNS_2 valid=300s;
resolver_timeout 5s;

Перезагружаем NGINX

1
systemctl restart nginx

Проверяем SSL соединение на SSL Labs