chore(caddy): security headers для meraocenka.ru + отключение browse в /preview
All checks were successful
CI Trade-In / changes (pull_request) Successful in 14s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 17s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
All checks were successful
CI Trade-In / changes (pull_request) Successful in 14s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 17s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
meraocenka.ru — публичный B2C-домен, не отдавал ни HSTS, ни защиту от встраивания во фрейм, ни X-Content-Type-Options/Referrer-Policy. Добавлен блок header: HSTS на 180 суток (без includeSubDomains/preload — оба флага практически необратимы, не все поддомены под контролем), X-Frame-Options: DENY + CSP frame-ancestors 'none' (старые клиенты + современный механизм), nosniff, strict-origin-when-cross-origin, плюс снятие Server/X-Powered-By. Полноценный CSP (default-src/script-src) — отдельная работа, здесь только периметр вокруг фрейма. Next.js (tradein-mvp/frontend) эти заголовки не выставляет — дублирования нет. handle_path /preview/* отдавал листинг каталога (file_server browse). Публичность самих макетов намеренная и задокументирована — убран только листинг, файлы по прямой ссылке продолжают отдаваться. Проверено: caddy validate --config apps.caddy --adapter caddyfile → Valid configuration (до и после правки, с учётом относительных import вида ../users.caddy.snippet — apps.caddy валиден только при монтировании родительского caddy/, не caddy/sites/ отдельно). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
This commit is contained in:
parent
3218190a89
commit
a29bf936e5
1 changed files with 35 additions and 2 deletions
|
|
@ -184,10 +184,13 @@ gendsgn.ru {
|
|||
}
|
||||
|
||||
# Static HTML mockups для review (audit alternatives).
|
||||
# Public access — без auth (по запросу 2026-05-17).
|
||||
# Public access — без auth (по запросу 2026-05-17) — это намеренно и
|
||||
# менять НЕ надо. Но каталог не должен листингом отдавать список
|
||||
# файлов случайному посетителю: без `browse` file_server продолжает
|
||||
# отдавать сами файлы по прямой ссылке, просто без index-листинга.
|
||||
handle_path /preview/* {
|
||||
root * /srv/preview
|
||||
file_server browse
|
||||
file_server
|
||||
}
|
||||
|
||||
# Trade-In UI preview — public CI surface (#801). Рендерит mock-фикстуру
|
||||
|
|
@ -400,6 +403,36 @@ www.gendsgn.ru {
|
|||
meraocenka.ru {
|
||||
encode zstd gzip
|
||||
|
||||
# #3471 (security-headers follow-up): публичный B2C-домен без базовых
|
||||
# security-заголовков. Позиция директивы в файле не важна — Caddyfile
|
||||
# применяет директивы в фиксированном порядке (`header` идёт раньше
|
||||
# `reverse_proxy`), не по строке в исходнике.
|
||||
#
|
||||
# Проверено: ни tradein-mvp/frontend (обслуживает этот домен, отдаёт
|
||||
# `/trade-in/mera-public*`), ни его next.config.ts/middleware не
|
||||
# выставляют ни один из этих заголовков — дублирования нет.
|
||||
header {
|
||||
# 180 суток (15552000s). НЕ ставить includeSubDomains и НЕ ставить
|
||||
# preload — оба флага практически необратимы (браузеры кэшируют
|
||||
# preload-список надолго, includeSubDomains ломает любой будущий
|
||||
# HTTP-поддомен), а не все поддомены meraocenka.ru гарантированно
|
||||
# под нашим контролем. Если это когда-нибудь понадобится — отдельное
|
||||
# осознанное решение, не «улучшение по умолчанию».
|
||||
Strict-Transport-Security "max-age=15552000"
|
||||
# Запрет встраивания во фрейм: X-Frame-Options — для старых
|
||||
# клиентов, которые не понимают CSP; frame-ancestors — современный
|
||||
# механизм. Оба вместе, не один вместо другого.
|
||||
X-Frame-Options "DENY"
|
||||
Content-Security-Policy "frame-ancestors 'none'"
|
||||
X-Content-Type-Options "nosniff"
|
||||
Referrer-Policy "strict-origin-when-cross-origin"
|
||||
# Не даём стеку светиться в ответе. Полноценный CSP
|
||||
# (default-src/script-src/...) сюда намеренно НЕ входит — отдельная
|
||||
# работа с риском сломать фронт, здесь только периметр вокруг фрейма.
|
||||
-Server
|
||||
-X-Powered-By
|
||||
}
|
||||
|
||||
log {
|
||||
output file /var/log/caddy/meraocenka.ru.log
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue