Почему открытый HTTP — жёсткая ошибка
Что это такое
По открытому HTTP каждый байт между браузером и сервером виден и изменяем любому на пути. Это не гипотетическая деградация: сессионные cookie передаются открыто, формы читаемы, а JavaScript, который загружает страница, можно подменить в пути. Вопрос поэтому не в том, переводить ли сервис на HTTPS, а в том, как сделать это, не сломав ссылки и интеграции, которые всё ещё указывают на открытую схему.
Почему это важно
Конкретные отказы обыденны и серьёзны. Сессионная cookie, отправленная открыто, крадётся и воспроизводится. Форма входа, отправленная по открытой схеме, отдаёт учётные данные всякому в сети, включая общее офисное или гостиничное подключение. В страницу, загруженную по открытой схеме, сеть может внедрить скрипт, который затем выполняется в origin сайта: тот же доступ, что и у уязвимости межсайтового скриптинга, но без единого изменения кода на вашей стороне. Браузеры теперь прямо помечают такие страницы как небезопасные, а многие платформенные возможности вообще отказываются работать вне защищённого контекста.
Ключевые идеи
Три вещи ломаются, когда трафик открыт
Конфиденциальность (любой на пути читает), целостность (любой на пути меняет) и подлинность (никто не может доказать, что сервер — тот, что вы имели в виду). Одно шифрование без проверенного сертификата не даёт ни последней, ни второй, поэтому сертификат — несущая часть.
Одна сеть, открытая схема
запрос GET /login видно: какая страница, какие cookie
ответ Set-Cookie: ... перехвачен и воспроизведён в другом месте
страница script src=... подменена на кейлоггер в том же origin
Сначала перенаправляйте, потом перестаньте слушать
Бессрочно перенаправьте открытую схему на защищённую на том же имени хоста, сохранив путь и параметры запроса. Затем включите HSTS, чтобы браузер вообще отказывался пробовать открытую схему в течение срока, и добавляйте хост в список предзагрузки только когда все поддомены защищены.
301 на защищённую схему того же хоста, с тем же путём и запросом (бессрочно)
Strict-Transport-Security: max-age=31536000; includeSubDomains
Директива includeSubDomains — то, что делает раннее включение опасным: она покрывает поддомены, которые вы, возможно, не мигрировали.
Никогда не перенаправляйте тело POST
Перенаправление после отправки формы теряет тело, если клиент не отправит его заново. Исправьте действие формы так, чтобы оно указывало на защищённую схему напрямую, а не полагалось на перенаправление.
Обновите каждую интеграцию, а не только браузер
Вебхуки, колбэки, задачи по расписанию, мобильные клиенты, закреплённые за старым эндпоинтом, и сторонние сервисы — все вызывают открытые адреса. Миграция — это работа по их поиску, а не настройка сервера.
Смешанное содержимое — мягкий отказ с жёсткой ценой
Страница HTTPS, загружающая скрипт, стиль или изображение по открытой схеме, либо блокируется, либо понижается браузером, а небезопасный запрос утекает метаданными о сессии. Отдавайте каждый подресурс с защищённого origin.
Практика
Проверьте продукт на небезопасные запросы
Загрузите каждую страницу в браузере и посчитайте запросы не по HTTPS, затем проверьте серверные логи на открытые HTTP-запросы, которые были обслужены, а не перенаправлены.
Готово, когда: ни у одной страницы нет небезопасных подресурсов, а каждый открытый HTTP-запрос в логе — перенаправление с сохранённым путём.
Найдите машинных вызывающих
Перечислите каждый вебхук, задачу по расписанию и интеграцию, которые обращаются к продукту по адресу, и проверьте, использует ли каждый защищённую схему.
Готово, когда: список полон, каждая запись либо обновлена, либо имеет владельца и дату.
Частые ошибки
- Перенаправление без HSTS — первый запрос каждой сессии всё ещё открыт; исправить: отдайте заголовок и, когда все поддомены готовы, рассмотрите предзагрузку.
- Раннее включение
includeSubDomains— ещё не мигрированный поддомен заблокирован для возвращающихся посетителей; исправить: сначала мигрируйте поддомены. - Перенаправление POST формы — тело отправки теряется; исправить: укажите форме защищённый адрес.
- Забытые машинные вызывающие — вебхуки и задачи молча ломаются при миграции; исправить: проведите инвентаризацию каждой интеграции, обращающейся по адресу.
- Оставленное смешанное содержимое — страница понижается и утекают метаданные; исправить: отдавайте все подресурсы по HTTPS.
Что читать дальше
- Сертификаты и рукопожатие (07-security/02-https-tls/01-certificates-and-the-handshake) — что делает защищённый канал заслуживающим доверия.
- HTTPS и TLS (07-security/02-https-tls) — трек, который закрывает эта глава.
- Основы сетей (HTTP / DNS / TLS) (06-cloud-devops/10-networking-fundamentals-http-dns-tls) — перенаправления, DNS и поведение протокола подробно.
- Веб-безопасность (OWASP Top 10) (07-security/01-web-security-owasp-top-10) — недостатки приложений, которые остаются даже в защищённом канале.