Заголовки безопасности 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-безопасности