6.1.8 Настройка HSTS для сайта

TheHost HSTS Banner

HSTS (HTTP Strict Transport Security) — это механизм веб-безопасности, который позволяет веб-сайту заявить, что он должен посещаться только через защищённое соединение HTTPS. Другими словами, после включения HSTS браузер, который посетил сайт, в дальнейшем будет подключаться к нему только через HTTPS и автоматически переводить все попытки доступа через незащищённый HTTP на HTTPS. Это помогает защитить пользователей и сайт от атак типа “SSL stripping” и “downgrade attack”, в частности от понижения уровня безопасности (перевод с HTTPS на HTTP) и перехвата сеансовых cookie. В этой инструкции мы рассмотрим, как включить HSTS в конфигурации Nginx. HSTS определён как стандарт IETF (RFC 6797).

Преимущества HSTS
  • Защита от атак. После первого посещения через HTTPS браузер блокирует любые HTTP-запросы, предотвращая понижение уровня безопасности;
  • Гарантия безопасного соединения. Пользователь не сможет проигнорировать ошибки сертификата, что исключает возможность подмены сайта;
  • Автоматический переход на HTTPS. Даже если пользователь вводит адрес без протокола или с http://, браузер автоматически изменяет его на https://;
  • Ускорение загрузки. Исключает необходимость дополнительного 301-редиректа с HTTP на HTTPS, что экономит время;
  • Повышение уровня безопасности. Многие аналитические сервисы оценивают наличие HSTS как показатель надёжности сайта.
Ограничения и риски HSTS

Важно: при добавлении HSTS-заголовка ваш сайт будет кэшироваться на стороне клиента. И в случае, если вы захотите удалить его до истечения max-age, ваш сайт будет недоступен для тех же клиентов. До момента, пока в браузере не выполнится сброс HSTS-политики (об этом ниже).

  • Не защищает первый визит. Пока пользователь не открыл сайт через HTTPS, первый запрос может быть уязвим для атак. Решение – HSTS Preload List, который добавляет сайт в списки защищённых доменов браузеров, об этом далее.
  • Ошибки конфигурации могут заблокировать доступ. Если включён includeSubDomains, а какие-то поддомены не поддерживают HTTPS, они станут недоступными.
  • Зависимость от SSL-сертификата. Если сертификат истечёт или будет настроен неправильно, сайт станет полностью недоступным.
  • Возможность использования для слежки (supercookies). Злоумышленники могут создать уникальный отпечаток браузера на основе HSTS.
  • Не защищает от атак на HTTPS/TLS. HSTS гарантирует только принудительное использование HTTPS, но не устраняет уязвимости самого SSL/TLS.

Подготовка сервера

Важно: перед настройкой HSTS необходимо убедиться, что:

  • SSL-сертификат установлен и сайт работает по HTTPS протоколу;
  • Веб-сервер Nginx установлен и корректно настроен;
  • Наличие root-доступа. Если Вы клиент нашего shared-хостинга и у Вас отсутствует доступ root, тогда активировать HSTS Вы можете с помощью обращения в Службу поддержки.

Перед выполнением любых подобных операций рекомендуется обновить Вашу систему. Выполнить это можно одной из следующих команд (зависит от ОС):

Пример для Debian/Ubuntu
sudo apt update
sudo apt upgrade -y
Пример для CentOS/AlmaLinux/RockyLinux
sudo dnf update -y

Настройка HSTS в конфигурации Nginx

HSTS является политикой веб-сервера и ее активация требует изменения конфигурационного файла Nginx. Перед выполнениям подобных действий рекомендуется сделать бекап конфигурации или всей системы.

1. Откройте конфигурационный файл Nginx:

sudo nano /etc/nginx/sites-available/default
# Или
# Замените `example.com` на Ваш домен
sudo nano /etc/nginx/sites-available/example.com

Совет: если Вы пользуетесь виртуальным или выделенным сервером с панелью управления ISPManager4, тогда Вы также можете отредактировать конфигурацию Nginx Вашего домена следующим образом:

ISPManager4, Конфиг Nginx

2. В блоке server {} добавляем:

/etc/nginx/sites-available/example.com
 server {
   listen 443 ssl;
   server_name www.example.com;
   # Этот заголовок и указывает браузеру, что на протяжении указанного времени max-age=31536000 необходимо открывать сайт исключительно по протоколу HTTPS.
   add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
   }

Разбор параметров HSTS:

  • max-age=31536000 – задает время действия заголовка HSTS в секундах. Например, max-age=31536000 задаёт 31536000 секунд (~1 год).
  • includeSubDomains – (необязательно) – распространяет HSTS на все поддомены (subdomain.example.com, www.example.com и т. д.), обеспечивая их защиту.
  • preload – индикатор для добавления домена в специальный список HSTS в браузерах. Сам по себе он не даёт эффекта, но нужен для подачи заявки на включение в preload-список браузеров.
  • always – гарантирует добавление заголовка во всех ответах.

Проверка и тестирование

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

Проверка конфигурации Nginx:

  1. sudo nginx -t

Если ошибок нет, перезапустите сервер:

  1. sudo systemctl restart nginx

Проверка заголовков HSTS:

Запустите команду curl:

  1. curl -I https://example.com | grep strict-transport-security

Ожидаемый ответ с используемыми в примере переменными:

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload"always;

Частые ошибки и их решения:

Ошибка: nginx: [emerg] unknown directive "add_header"

Решение:

  • Убедитесь, что Nginx установлен с модулем headers (--with-http_headers_module).
  • Проверьте конфигурацию на синтаксические ошибки (nginx -t).
Заголовок HSTS отсутствует в ответе

Решение:

  • Проверьте, что HTTPS работает корректно.
  • Убедитесь, что заголовок Strict-Transport-Security добавлен в server { listen 443 ssl; }.
Сайт больше не работает по HTTPS

Решение: Это нормальное поведение HSTS. Используйте команду в браузере для сброса HSTS-политики, например:

  • В Chrome: chrome://net-internals/#hsts
  • В Firefox: about:support → “Очистить недавнюю историю” (Cookies + Кэш).