Настройка HSTS в Nginx: Улучшаем Безопасность Вашего Сайта

HSTS (HTTP Strict Transport Security) это механизм безопасности для веб-протоколов, который помогает защитить сайты от атак типа "человек посередине" (man-in-the-middle). HSTS позволяет веб-серверу сообщать веб-браузеру или другому клиенту, что он должен взаимодействовать с сервером исключительно через безопасные соединения HTTPS.

Важно помнить, что после включения HSTS все запросы к вашему сайту будут принудительно перенаправляться на HTTPS, что может привести к проблемам, если ваш сайт не полностью настроен для работы через HTTPS.

Внедрять HSTS нужно, так как это более безопасно, чем простая настройка перенаправления HTTP на HTTPS (301) на вашем сервере, где первоначальное HTTP-соединение все еще уязвимо для злоумышленника.

Когда веб-браузер впервые соединяется с сервером, который использует HSTS, сервер отправляет специальный заголовок, называемый Strict-Transport-Security. Этот заголовок указывает браузеру взаимодействовать с сайтом только по HTTPS на определённый период времени.

При вводе домена в адресной строке без протокола https либо в формате «example.com» в браузере сперва выводится незащищенная версия сайта. Даже если на нем установлен SSL-сертификат, перенаправление происходит уже после первого перехода. Этим моментом пользуются мошенники с целью перехвата данных пользователя и перенаправления его на подставную страницу.

HSTS — это алгоритм взаимодействия между браузером и сервером, при котором сайту присваивается статус защищенного на заданный период. Настроенный HSTS указывает браузеру на необходимость постоянной автоматической переадресации на версию сайта под протоколом https.

Первое соединение с сайтом не защищается, если оно произошло через протокол http. В большинстве случаев так и происходит: 301 редирект на защищенную версию выполняется уже после первого перехода на сайт. Для решения этой проблемы был создан список Preload List от Google. После обращения к сайту браузер проверяет наличие сайта в этом списке и лишь потом соединяет клиента с сервером по безопасному протоколу.

Список безопасных доменов для разработчиков и технологий, верхнего уровня, все включены в список предварительной загрузки Preload List HSTS. Безопасность встроена и является приоритетом для доменов Google Registry. Хотя Google Registry управляет этими TLDs, сама регистрация доменов обычно происходит через аккредитованных регистраторов, которые сотрудничают с Google.

Список доменов с HSTS растет, в настоящее время в него входят: .FOO, .ZIP, .MOV, .NEXUS, .DEV, .APP.

Список предварительной загрузки Preload List представляет собой список доменов, которые жестко закодированы в большинстве основных веб-браузеров (таких как Chrome, Firefox, Opera, Safari, IE 11 и Edge) для обязательного использования HTTPS-соединений. Когда домен включен в этот список, браузер автоматически принудительно использует HTTPS для всех запросов к этому домену, даже если пользователь ввел URL с HTTP или кликнул по ссылке, ведущей на HTTP-версию сайта.

  • Информация о списке предварительной загрузки HSTS в Chrome: https://www.chromium.org/hsts
  • Просмотр списка предварительной загрузки Firefox HSTS: nsSTSPreloadList.inc

При подключенной технологии в браузере пользователю будут высвечиваться сайты, работающие исключительно по протоколу https. Даже если он введет в адресную строку домен через http, браузер автоматически перенаправит его на версию сайта с https.

Чтобы включить свой сайт в Preload List, необходимо выполнить несколько условий:

  1. Включите HSTS.
  2. Подайте заявку на включение в список. После того как вы убедитесь, что ваш сайт корректно настроен, вы можете подать заявку на включение вашего домена в Preload List, посетив официальный сайт: https://hstspreload.org.
  3. Подождите подтверждения. Ваш запрос будет рассмотрен, и если все требования соблюдены, ваш домен будет добавлен в список. Это может занять некоторое время.

Включение домена в Preload List – серьезное решение, так как его отмена не является простой и быстрой. Если в будущем вы решите отключить HSTS, пользователи браузеров, которые уже загрузили обновленный список, по-прежнему будут принудительно использовать HTTPS для доступа к вашему сайту до тех пор, пока не истечет срок действия записи в Preload List и браузеры не обновят список.

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

Выйти из Preload List сложно. Чтобы это сделать, необходимо подать запрос на этом же ресурсе и ждать ответа. Для Chrome это происходит более трех месяцев, а для других браузеров — еще дольше. В этот период сайт может быть недоступен пользователям!

Часть хостинг-провайдеров в услуге управляемого или виртуального хостинга дают возможность опцию HSTS через личный кабинет пользователя. В случаях VPS необходимо добавить заголовок с нужными параметрами в настройках сервера. Варианты заголовков:

Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains; preload

где:

  • Обязательная директива max-age устанавливает временной промежуток действия HSTS для определенного сайта.
  • Необязательная директива includeSubDomains указывает, что технология HSTS распространяется на основной домен и его поддомены.
  • Необязательная директива preload указывает браузеру, что домен сайта включен в список Preload List. При использовании preload директива max-age должна быть не менее 31536000 (1 год), а директива includeSubDomains должна присутствовать.

Самый простой вариант заголовка, задающий действие заголовка сроком на 1 год (в секундах):

add_header Strict-Transport-Security "max-age=31536000;"

При тестировании HSTS устанавливайте минимальное значение после параметра «max-age». При возникновении багов за короткий промежуток времени ошибку увидят немногие пользователи.

Чтобы настроить HSTS в nginx, следуйте этим шагам:

  1. Откройте конфигурационный файл nginx для вашего сайта. Этот файл обычно находится в директории /etc/nginx/sites-enabled/.
  2. Добавьте заголовок Strict-Transport-Security. В разделе конфигурации сервера, который обрабатывает HTTPS, добавьте следующую директиву:
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;

    Значение max-age устанавливает время в секундах, в течение которого браузер должен обращаться к сайту только через HTTPS. max-age должно быть достаточно долгим (обычно рекомендуется минимум 1 год). includeSubDomains является необязательным и указывает, что политика должна применяться ко всем поддоменам. Необязательный параметр always только для Nginx, параметр Always гарантирует, что заголовок установлен для всех ответов, включая внутренние ответы об ошибках. Старые версии NGINX (до версии 1.7.5 или NGINX Plus R5) не поддерживают параметр Always и не устанавливают заголовок для внутренних ответов об ошибках.

    Не забывайте

    Блоки конфигурации NGINX наследуют директивы add_header от окружающих их блоков, поэтому вам просто нужно поместить директиву add_header на верхний уровень server блок. Есть одно важное исключение: если блок сам включает директиву add_header, он не наследует заголовки от включающих блоков, и вам необходимо переопределить все директивы add_header:

    server {
        listen 443 ssl;
     
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
     
        # Этот блок «местоположение» наследует заголовок STS.
        location / {
            root /usr/share/nginx/html;
        }
     
        # Поскольку этот блок location содержит еще одну директиву add_header, 
        # мы должны повторно объявить заголовок STS.
        location /servlet {
            add_header X-Served-By "My Servlet Handler";
            add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
            proxy_pass http://localhost:8080;
        }
    }
  3. Перезагрузите nginx для применения изменений. Это обычно делается командой:
    systemctl reload nginx
  4. Проверьте настройку. После внесения изменений убедитесь, что заголовок HSTS отправляется клиентам. Это можно сделать, используя:
  • инструменты разработчика в браузере,
  • https://www.ssllabs.com/ssltest/ оценка «А+» идентифицирует сайты с подключенной технологией HSTS (для удовлетворения требований безопасности продолжительность заголовка HSTS должна составлять не менее трех месяцев).
  • утилитой curl:
    curl --head https://dieg.info
     
    HTTP/2 200
    strict-transport-security: max-age=31536000; includeSubDomains; preload

Читайте также: Apache настройка редиректов (переадресация)

PQ VPS сервера в 28+ странах.