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 встановлює 31 536 000 секунд (~1 рік).
  • includeSubDomains – (необов’язково) – поширює HSTS на всі субдомени (subdomain.example.com, www.example.com тощо), забезпечуючи їх захист.
  • preload – індикатор для додавання домену до спеціального списку HSTS у браузерах. Сам по собі не дає ефекту, але потрібен для подачі заявки на включення до HSTS Preload List (потребує завчасної реєстрації, про це нижче).
  • 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

Поширенні помилки та їх вирішення

Помилка: 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 + Кеш).