HSTS и список предзагрузки: полное руководство по внедрению
HTTP Strict Transport Security (HSTS) и предзагрузка
HTTP Strict Transport Security — это механизм безопасности, который заставляет браузеры взаимодействовать с вашим сайтом исключительно по SSL/TLS проверку. После получения заголовка HSTS браузер откажется подключаться по обычному HTTP на указанный срок, устраняя целый класс атак. Список предзагрузки HSTS идет дальше, встраивая ваш домен в код браузеров, обеспечивая принудительный HTTPS с самого первого посещения.
Почему HSTS важен
Даже если ваш сервер перенаправляет HTTP на HTTPS, начальный запрос все равно уязвим. Без HSTS злоумышленники могут использовать это окно через несколько векторов атак:
- SSL stripping: Посредник перехватывает начальный HTTP-запрос и показывает пользователю HTTP-версию сайта, проксируя запросы к настоящему HTTPS-серверу. Пользователь не видит предупреждения браузера.
- Перехват cookies: Cookies, установленные без флага Secure, могут быть перехвачены по начальному HTTP-соединению, даже если пользователь быстро перенаправлен на HTTPS.
- Понижение смешанного контента: Без HSTS ресурсы, загруженные по HTTP на HTTPS-странице, могут быть перехвачены и изменены.
- Атаки через публичный WiFi: В публичных сетях злоумышленники могут перехватить первый HTTP-запрос и перенаправить пользователей на фишинговые страницы.
HSTS закрывает эти бреши, сообщая браузеру: «Никогда не подключайся к этому домену по HTTP. Всегда используй HTTPS. Если сертификат недействителен, не позволяй пользователю обойти предупреждение.»
Заголовок HSTS
HSTS реализуется как заголовок ответа на HTTPS-соединениях:
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Директивы заголовка
| Директива | Обязательна | Описание |
|---|---|---|
| max-age | Да | Время в секундах, в течение которого браузер должен помнить политику HSTS. 63072000 = 2 года. |
| includeSubDomains | Для preload | Применяет политику ко всем поддоменам текущего домена. |
| preload | Для preload | Сигнализирует о готовности к включению в списки предзагрузки браузеров. |
Этапы внедрения
Внедрение HSTS требует осторожного, поэтапного подхода. Поспешный переход к длительному max-age или включение includeSubDomains без подготовки может заблокировать доступ к вашим собственным сервисам.
Фаза 1: Аудит и подготовка
Перед включением HSTS убедитесь, что вся ваша инфраструктура поддерживает HTTPS:
- Проверьте все поддомены: Каждый поддомен (www, API документацию, cdn, mail, staging, внутренние инструменты) должен иметь действительный HTTPS-сертификат, если будет использоваться includeSubDomains.
- Проверьте смешанный контент: Убедитесь, что ни одна страница не загружает ресурсы по HTTP.
- Проверьте автоматизацию сертификатов: Подтвердите, что обновление сертификатов автоматизировано и контролируется. Истекший сертификат при включенном HSTS означает полную недоступность сайта.
- Проверьте сторонние интеграции: Убедитесь, что платежные системы, аналитика и другие интеграции корректно работают через HTTPS.
Фаза 2: Начните с короткого max-age
Начните с max-age в 5 минут для безопасного тестирования:
# nginx
add_header Strict-Transport-Security "max-age=300" always;
# Apache
Header always set Strict-Transport-Security "max-age=300"
Мониторьте проблемы минимум одну неделю. Проверяйте логи ошибок, обращения пользователей и аналитику на предмет аномалий.
Фаза 3: Постепенное увеличение max-age
Прогрессивно увеличивайте длительность:
# Неделя 2: 1 час
add_header Strict-Transport-Security "max-age=3600" always;
# Неделя 3: 1 день
add_header Strict-Transport-Security "max-age=86400" always;
# Неделя 4: 1 неделя
add_header Strict-Transport-Security "max-age=604800" always;
# Неделя 6: 1 месяц
add_header Strict-Transport-Security "max-age=2592000" always;
Фаза 4: Добавление includeSubDomains
Только после подтверждения корректной работы всех поддоменов через HTTPS:
add_header Strict-Transport-Security "max-age=2592000; includeSubDomains" always;
Фаза 5: Финальный max-age и preload
Установите max-age на 2 года (минимум для preload) и добавьте директиву preload:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
Список предзагрузки HSTS
Список предзагрузки HSTS поддерживается проектом Chromium и используется всеми основными браузерами (Chrome, Firefox, Safari, Edge, Opera). Домены в этом списке имеют принудительный HSTS до того, как браузер когда-либо отправит запрос к домену — устраняя даже уязвимость первого посещения.
Требования для подачи
Для включения в список предзагрузки ваш домен должен соответствовать всем следующим критериям:
- Иметь действительный HTTPS-сертификат на корневом домене.
- Перенаправлять весь HTTP-трафик на HTTPS на том же хосте (если слушает проверку портов 80).
- Отдавать заголовок HSTS на корневом домене через HTTPS с: max-age не менее 63072000 (2 года), директивой includeSubDomains и директивой preload.
- Все поддомены должны поддерживать HTTPS, включая www-поддомен, если для него существует DNS Lookup.
Подайте заявку на hstspreload.org после выполнения всех требований.
Важные предупреждения о preload
- Удаление медленное: Удаление из списка предзагрузки может занять месяцы. Браузеры выпускают обновления по разным расписаниям, а кэшированные версии могут никогда не получить обновление.
- Включает ВСЕ поддомены: Если какой-либо поддомен не может обслуживать HTTPS, он станет недоступным. Это касается внутренних инструментов, сред разработки и устаревших сервисов.
- Нет простого отката: В отличие от заголовка с коротким max-age, preload нельзя быстро отменить. Тщательно планируйте перед подачей.
Риски и их снижение
| Риск | Последствие | Снижение |
|---|---|---|
| Истечение сертификата | Полная недоступность сайта | Автоматизация обновления, мониторинг сайтов срока, оповещения за 30/14/7 дней |
| Поддомен без HTTPS | Поддомен недоступен | Аудит всех поддоменов перед включением includeSubDomains |
| Смешанный контент | Сломанные ресурсы страницы | Сканирование всех страниц на HTTP-ресурсы перед включением HSTS |
| Неправильная конфигурация | Пользователи заблокированы на нерабочем HTTPS | Начать с короткого max-age, увеличивать постепенно |
| Сожаление о preload | Невозможность простого возврата к HTTP | Подавать preload только после месяцев успешной работы HSTS |
Тестирование конфигурации HSTS
Проверьте правильность настройки заголовка HSTS:
# Проверка заголовка HSTS
curl -sI https://example.com | grep -i strict
# Тестирование через SSL Labs
# Перейдите: https://www.ssllabs.com/ssltest/
# Проверка готовности к preload
# Перейдите: https://hstspreload.org/
# Проверка в Chrome
# Откройте: chrome://net-internals/#hsts
# Запросите ваш домен для просмотра текущего состояния HSTS
Частые ошибки
- Установка HSTS на HTTP: Заголовок должен отправляться только через HTTPS. Браузеры игнорируют заголовки HSTS, полученные по HTTP.
- Отсутствие директивы always в nginx: Без
alwaysnginx добавляет заголовок только к успешным ответам (2xx), но не к перенаправлениям (3xx) или ошибкам. - Забыть про www-поддомен: Если пользователи заходят на www.example.com, он тоже должен поддерживать HTTPS и HSTS.
- Резкий переход к максимальному max-age: Переход от 0 к 63072000 секундам сразу создает 2-летнее обязательство без тестирования.
- Отсутствие мониторинга обновления сертификатов: Самая частая катастрофа с HSTS — истекший сертификат без возможности для пользователей обойти предупреждение.
Итоги
HSTS — один из важнейших заголовков безопасности, который вы можете внедрить. Он устраняет атаки SSL stripping, предотвращает перехват cookies и обеспечивает принудительный HTTPS на уровне браузера. Список предзагрузки расширяет эту защиту на первое посещение, но требует тщательной подготовки и несет значительные обязательства. Следуйте поэтапному подходу: сначала аудит, затем короткий max-age, включение includeSubDomains только после проверки поддоменов, и подача в список предзагрузки только после месяцев успешной работы HSTS. Преимущества безопасности существенны, но только при правильном внедрении.
Проверьте ваш сайт прямо сейчас
Проверить →