Заголовки безопасности Traefik: CSP, HSTS и полный стек middleware
Published: 2026-03-02
Заголовки безопасности — самое дешёвое усиление защиты веб-приложения: один ресурс Traefik Middleware, применённый ко всем IngressRoute, — и готово. Никаких изменений в приложении, никакого передеплоя.
Middleware
yamlapiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: security-headers
namespace: default
spec:
headers:
stsSeconds: 31536000
stsIncludeSubdomains: true
stsPreload: true
referrerPolicy: "strict-origin-when-cross-origin"
contentTypeNosniff: true
frameDeny: true
permissionsPolicy: "camera=(), microphone=(), geolocation=(), payment=()"
customResponseHeaders:
X-Powered-By: ""
Server: ""
contentSecurityPolicy: >-
default-src 'self';
script-src 'self' 'unsafe-inline';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
font-src 'self';
connect-src 'self';
frame-ancestors 'none';
base-uri 'self';
form-action 'self'
Применение middleware к IngressRoute
yamlapiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: my-app-https
spec:
entryPoints:
- websecure
routes:
- match: Host(`app.example.com`)
kind: Rule
middlewares:
- name: redirect-https
- name: security-headers
services:
- name: my-app
port: 80
tls:
secretName: my-app-tls
Порядок middleware важен: сначала выполняется redirect-https, затем выставляются заголовки безопасности.
Объяснение каждого заголовка
Strict-Transport-Security (HSTS)
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Указание браузеру: в течение года подключаться к этому домену и всем поддоменам только по HTTPS. Даже при вводе http:// браузер локально повышает соединение до HTTPS. preload — для добавления в HSTS preload list браузеров.
Не добавляйте preload, пока не уверены, что все поддомены работают на HTTPS. Отменить очень сложно.
X-Frame-Options / frame-ancestors
frameDeny: true выставляет X-Frame-Options: DENY. CSP frame-ancestors 'none' — современный аналог. Оба выставлены для максимальной совместимости.
Защита от clickjacking — встраивания сайта в iframe на другом домене.
Content-Type-Options
X-Content-Type-Options: nosniff
Запрещает браузеру угадывать MIME-тип ответа. Без этого браузер может выполнить JavaScript с Content-Type: text/plain.
Referrer-Policy
Referrer-Policy: strict-origin-when-cross-origin
В same-origin-запросах передаётся полный URL, в cross-origin — только origin, без пути и query string. Это предотвращает утечку путей вида /reset-password?token=abc123 в сторонние скрипты.
Permissions-Policy
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()
Явно блокирует API браузера, которые приложение не использует. Скомпрометированный сторонний скрипт не запросит камеру даже при участии пользователя.
Удаление заголовков Server
yamlcustomResponseHeaders:
X-Powered-By: ""
Server: ""
Пустая строка удаляет заголовок. Предотвращает фингерпринтинг — Server: uvicorn/0.30.1 раскрывает точный фреймворк для поиска CVE.
Content Security Policy
CSP — самый мощный, но и самый опасный заголовок. Настройте неправильно — сломаете приложение. Начните с разрешительной политики:
Разрешительная (начальная):
default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';
Жёсткая (после устранения inline-скриптов):
default-src 'self'; script-src 'self'; style-src 'self';
Если используете Google Analytics, внешние шрифты или Stripe — явно добавьте их origin-ы:
script-src 'self' https://www.googletagmanager.com;
font-src 'self' https://fonts.gstatic.com;
Используйте Content-Security-Policy-Report-Only с report-uri, чтобы выявить нарушения до перехода в enforce-режим.
Middleware для редиректа на HTTPS
yamlapiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: redirect-https
namespace: default
spec:
redirectScheme:
scheme: https
permanent: true
Тестирование
bashcurl -sI https://example.com | grep -iE "strict|frame|content-type|x-powered|csp|referrer|permissions"
Онлайн-валидаторы:
- https://securityheaders.com — оценка от A до F
- https://observatory.mozilla.org — более широкая проверка HTTP-безопасности