Можно ли объединить несколько промежуточных программ для заголовков? - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть несколько служб, которым требуется другой заголовок Content-Security-Policy . Первоначальной попыткой было создать промежуточное ПО по умолчанию, которое будет обрабатывать все общие заголовки, а затем я могу создать новое промежуточное ПО с уникальными настройками contentSecurityPolicy для каждого из маршрутизаторов.

Я был удивлен, когда выяснилось, что еслиу вас есть несколько промежуточных программ с заголовками, последний примененный перезаписывает предыдущий. Это означает, что я должен воссоздать все заголовки в промежуточном программном обеспечении для каждого сервиса. И если я внесу изменения в будущем, мне нужно убедиться, что это отражено во всех них.

В качестве обходного пути я попытался добавить customResponseHeaders с Content-Security-Policy заголовок, но это не перезаписало заголовок по умолчанию, даже если он показывался на приборной панели.

Выдержка из моих настроек:

...
[http.routers.service]
  rule = "Host(`example.com`)"
  entrypoints = ["https"]
  middlewares = ["default", "service"]
  service = "service"
...
[http.middlewares.default.headers]
  accessControlAllowOrigin = "origin-list-or-null"
  stsSeconds = 315360000
  stsIncludeSubdomains = true
  stsPreload = true
  customFrameOptionsValue = "SAMEORIGIN"
  contentTypeNosniff = true
  browserXssFilter = true
  referrerPolicy = "strict-origin"
  contentSecurityPolicy = "default-src 'none';form-action 'none';frame-ancestors 'none';base-uri 'none'"
  featurePolicy = "notifications 'none'; camera 'none'"
[http.middlewares.service.headers]
  contentSecurityPolicy = "default-src 'none';script-src 'self' 'unsafe-inline';style-src 'self';img-src 'self'"

1 Ответ

0 голосов
/ 30 сентября 2019

В моей дискуссии на форумах Traefik я указывал на тот факт, что это, похоже, ожидаемое поведение для используемой библиотеки . После некоторых экспериментов я пришел к следующему решению:

Пропустить заголовки безопасности по умолчанию и использовать только параметр customResponseHeaders. Кажется, что они обрабатываются отдельно от упомянутой библиотеки, и их можно объединить, поэтому сначала нужно начать с самых конкретных, а затем добавить общие, например: middlewares = ["service", "default"]

А вот и рефакторингЗаголовки из вопроса:

[http.middlewares.default.headers.customResponseHeaders]
  Access-Control-Allow-Origin = "null"
  Content-Security-Policy = "default-src 'none';form-action 'none';frame-ancestors 'none';base-uri 'none'"
  Feature-Policy = "notifications 'none'; camera 'none'"
  Referrer-Policy = "strict-origin"
  Server = "home.stoinov.com"
  Strict-Transport-Security = "max-age=315360000; includeSubDomains; preload"
  X-Content-Type-Options = "nosniff"
  X-Frame-Options = "SAMEORIGIN"
  X-Xss-Protection = "1; mode=block"
[http.middlewares.service.headers.customResponseHeaders]
  Content-Security-Policy = "default-src 'none';script-src 'self' 'unsafe-inline';style-src 'self';img-src 'self'"

Настройка по умолчанию фактически на одну строку короче, чем использование предопределенных заголовков для того же результата.

Один недостаток состоит в том, что на панели мониторинга вы увидитеваши заголовки сгруппированы в верхней части промежуточного программного обеспечения, но фактические заголовки безопасности останутся со своими значениями по умолчанию. Что, честно говоря, могло бы быть плюсом, если бы у нас было имя заголовка и значение.

...