HTTP-заголовки безопасности: что это и при чём тут 152-ФЗ
HSTS, CSP, X-Frame-Options и ещё семь заголовков, защищающих сайт и данные пользователей. Связь со ст. 19 152-ФЗ и что прописать в настройках сервера.
Когда юристы говорят «меры защиты персональных данных» по ст. 19 152-ФЗ, большинство представляют сертифицированные средства защиты, журналы аудита и политику парольной безопасности. А HTTP-заголовки безопасности — это тот же самый слой защиты, только со стороны браузера: они не дают украсть сессию пользователя, подменить содержимое страницы или встроить ваш сайт в фишинговый iframe.
Причём тут 152-ФЗ
Прямой нормы «обязаны настраивать HSTS» в 152-ФЗ нет. Но есть:
- ст. 19 ч. 1 — оператор обязан принимать правовые, организационные и технические меры для защиты ПДн от неправомерного доступа, уничтожения, изменения, блокирования, копирования и распространения;
- Приказ ФСТЭК № 21 — определяет перечень мер защиты для информационных систем персональных данных. В нём прямо упоминаются защита каналов передачи и защита от XSS/CSRF-атак.
Отдельного штрафа «за отсутствие CSP» в КоАП нет. Но в случае утечки регулятор будет оценивать, принял ли оператор разумные и достаточные технические меры. Отсутствие базовых HTTP-заголовков в 2026 году — это уже аргумент для РКН в пользу того, что меры были недостаточными, а значит, к штрафу по ч. 1 ст. 13.11 (до 100 000 ₽) может добавиться квалифицирующий признак «по неосторожности» по ч. 7 (до 500 000 ₽).
Десять заголовков, которые мы проверяем
HSTS (Strict-Transport-Security)
Заставляет браузер всегда ходить на сайт по HTTPS, даже если пользователь вручную ввёл http://. Защищает от downgrade-атак и MITM на публичных Wi-Fi.
Strict-Transport-Security: max-age=31536000; includeSubDomains
Content-Security-Policy
Ограничивает, откуда браузер может загружать скрипты, стили и картинки. Это единственный способ реально защититься от XSS: даже если атакующий внедрит <script>, браузер откажется его выполнить.
Content-Security-Policy: default-src 'self'; script-src 'self' https://mc.yandex.ru; ...
Настройка CSP — самая сложная, но и самая ценная: по нашей статистике, это заголовок, который чаще всего отсутствует именно на сайтах, работающих с ПДн.
X-Frame-Options
Запрещает встраивать ваш сайт в iframe на стороннем домене. Защищает от clickjacking — когда пользователь думает, что кликает на безобидную кнопку, а на самом деле подтверждает действие на вашем сайте.
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options
Одна строчка, которая запрещает браузеру «угадывать» тип содержимого. Без неё JSON, загруженный как скрипт, может выполниться как скрипт.
X-Content-Type-Options: nosniff
Referrer-Policy
Контролирует, какую информацию о предыдущей странице браузер отправляет сторонним сайтам. Без этого заголовка URL с токенами авторизации или ID пользователя может утечь в логи рекламной сети.
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy
Ограничивает доступ страницы к API браузера: камере, микрофону, геолокации, датчикам. Даже если сторонний скрипт захочет включить камеру — браузер откажет.
Permissions-Policy: camera=(), microphone=(), geolocation=()
X-XSS-Protection
Устаревший, но всё ещё полезный заголовок для старых браузеров. Современные (Chrome 78+, Firefox) на него не реагируют — они полагаются на CSP. Но для совместимости держать стоит.
X-XSS-Protection: 1; mode=block
Cross-Origin-Opener-Policy
Изолирует ваш сайт от других вкладок. Защищает от side-channel атак вроде Spectre и от перехвата window.opener.
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Resource-Policy
Запрещает сторонним сайтам загружать ваши ресурсы (скрипты, картинки, JSON) через <img> или <script> как часть side-channel атаки.
Cross-Origin-Resource-Policy: same-origin
X-Permitted-Cross-Domain-Policies
Легаси из эпохи Flash, но до сих пор проверяется автоматическими сканерами. Установка none — это +1 очко безопасности, ничего не ломает.
X-Permitted-Cross-Domain-Policies: none
Как это связано со штрафами на практике
Сценарий, по которому чаще всего разворачивается история:
- У оператора происходит утечка — украли сессию через XSS, подменили форму через clickjacking, перехватили токен через утёкший referrer.
- РКН проводит проверку, в том числе запрашивает заключение о принятых мерах защиты.
- Эксперт смотрит заголовки — их нет. Делает вывод: «базовые общеизвестные технические меры по защите канала не реализованы».
- Штраф назначается не только по ч. 1 ст. 13.11 (непринятие мер — до 100 000 ₽), но и с учётом квалифицирующих признаков по ст. 13.11 ч. 7–10 (до 18 миллионов при утечке от 10 000 субъектов).
Сами по себе «нет CSP» штраф не вызовут. Но они работают как улика в пользу «меры были недостаточными», когда штраф уже назначается по другому основанию — а настройка заголовков занимает один день и в отличие от СЗИ стоит ноль.
Как настроить на российском хостинге
Большинство сайтов в РФ живут на связке Nginx + Bitrix/1С-Битрикс или Nginx перед PHP/Node в Yandex Cloud, VK Cloud, Selectel, Reg.ru, Timeweb, Beget. Разбираем типовые варианты.
Nginx
Самый частый случай. Добавьте в блок server {} или location /:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Cross-Origin-Opener-Policy "same-origin" always;
add_header Cross-Origin-Resource-Policy "same-origin" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
# CSP — подбирайте под свой сайт, начните с Report-Only
add_header Content-Security-Policy-Report-Only "default-src 'self'; script-src 'self' https://mc.yandex.ru;" always;
Флаг always обязателен: без него Nginx не отдаёт заголовки на ответах с кодами 4xx/5xx, а именно на них XSS чаще всего и срабатывает.
Apache / .htaccess
Для сайтов на shared-хостингах (Reg.ru, Beget, Timeweb) часто нет доступа к основному конфигу — работайте через .htaccess:
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
</IfModule>
Проверьте, что модуль mod_headers включён — у большинства российских хостеров он активен по умолчанию.
1С-Битрикс
В Битриксе заголовки проще всего добавить через .htaccess (если используется Apache) или через настройки Nginx у хостера. Если хостинг не даёт править конфиг — попросите техподдержку выставить заголовки на уровне сервера. Для shared-тарифов Битрикс24 настройка недоступна — это одна из причин переезжать на VPS при серьёзной обработке ПДн.
Yandex Cloud Application Load Balancer
В Yandex Cloud заголовки настраиваются на уровне backend-group в ALB через раздел HTTP-бэкенды → Изменение ответа → Заголовки. Это даёт единую точку настройки для всех микросервисов без изменения кода приложения.
VK Cloud / Selectel
Оба провайдера предоставляют managed Nginx с возможностью править конфиг. На выделенных серверах Selectel настройка — штатный Nginx, на managed-решениях — запрос в поддержку или панель управления.
Облачные CDN (Ngenix, DDoS-Guard, Qrator)
Российские CDN добавляют заголовки через панель управления правилами. Если CDN стоит перед вашим сервером — настраивайте заголовки там, а не на origin: иначе CDN может их срезать или переопределить.
Что не работать не будет
Российские сайты часто грузят Яндекс.Метрику, VK Pixel, виджеты Mail.ru, карты Яндекса и 2ГИС. Если выставить слишком строгий CSP без белого списка, они перестанут работать — и вы потеряете не только аналитику, но и потенциально форму согласия на cookies (если она зависит от внешнего скрипта). Поэтому CSP обязательно тестируйте неделю в Report-Only режиме и только потом включайте enforcing.
Пример совместимого с российским стеком CSP:
default-src 'self';
script-src 'self' 'unsafe-inline' https://mc.yandex.ru https://vk.com https://api-maps.yandex.ru;
img-src 'self' data: https://mc.yandex.ru https://vk.com;
connect-src 'self' https://mc.yandex.ru https://api.vk.com;
frame-src https://vk.com https://www.youtube.com;
style-src 'self' 'unsafe-inline';
Чеклист перед деплоем
- Настроены все 10 заголовков из списка выше
- CSP проверен в Report-Only режиме минимум неделю перед переключением в enforcing
- HSTS с
includeSubDomainsвключается только когда все поддомены на HTTPS - Permissions-Policy пуст или максимально ограничен — включайте API точечно
- Заголовки возвращаются и на HTML-страницах, и на API-эндпоинтах, в том числе на 4xx/5xx (
alwaysв Nginx) - Проверена работа Яндекс.Метрики, VK Pixel и прочих российских сервисов после включения CSP
Быструю оценку дают внешние сканеры — например, securityheaders.com, — но для ПДн-ориентированной проверки лучше использовать отечественные инструменты: базовый аудит по 152-ФЗ (reviizor.ru) проверит все 10 заголовков и свяжет результат с составом ч. 1 ст. 13.11.