fix(mera/b2c): ужесточить периметр по итогам ревью — _next/static вместо _next, скраб X-Authenticated-User
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 7s
CI Trade-In / backend-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 7s
CI / changes (pull_request) Successful in 7s
CI Trade-In / backend-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
1. Матчер статики сужен с /trade-in/_next/* до /trade-in/_next/static/* — тот же, что у @uipreview (Caddyfile:78), проверенный в проде. Широкий вариант открывал анонимам /_next/image (оптимизатор картинок, CPU по запросу), который лэндингу не нужен: next/image, <img> и url() в mera-public не встречаются вообще, картинок нет, шрифты — next/font/google self-hosted в _next/static/media. 2. Во все три reverse_proxy блока добавлен header_up -X-Authenticated-User — единообразие с остальным периметром (:87, :129, :169). Блок не под basic_auth, т.е. анонимный клиент тем более может прислать свой заголовок. Сейчас инертно (лэндинг статичен), но станет дырой на этапе 5, когда откроется публичный /estimate. 3. Регресс-тест на сужение: /trade-in/_next/image должен отдавать 404.
This commit is contained in:
parent
537b0ac06e
commit
c8ff201345
2 changed files with 29 additions and 4 deletions
27
Caddyfile
27
Caddyfile
|
|
@ -239,7 +239,16 @@ meraocenka.ru {
|
||||||
# Caddy→backend хопа, пользователь /trade-in никогда не видит.
|
# Caddy→backend хопа, пользователь /trade-in никогда не видит.
|
||||||
handle / {
|
handle / {
|
||||||
rewrite * /trade-in/mera-public
|
rewrite * /trade-in/mera-public
|
||||||
reverse_proxy tradein-frontend:3000
|
reverse_proxy tradein-frontend:3000 {
|
||||||
|
# Тот же периметр-скраб, что у @uipreview (:87) и @tradein ниже.
|
||||||
|
# Этот блок вообще не под basic_auth, поэтому анонимный клиент
|
||||||
|
# тем более может прислать свой X-Authenticated-User. Сейчас
|
||||||
|
# инертно (лэндинг статичен, backend-вызовов нет), но снимаем
|
||||||
|
# ради единообразия периметра, а не полагаясь на то, что
|
||||||
|
# downstream ничего не делает с заголовком — иначе на этапе 5,
|
||||||
|
# когда откроется публичный /estimate, это станет дырой.
|
||||||
|
header_up -X-Authenticated-User
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Подстраницы САМОГО лэндинга. Нужны с момента мержа #2615: футер ссылается
|
# Подстраницы САМОГО лэндинга. Нужны с момента мержа #2615: футер ссылается
|
||||||
|
|
@ -253,14 +262,24 @@ meraocenka.ru {
|
||||||
# под него не подпадает и по-прежнему отдаёт 404. Регресс-тест на это —
|
# под него не подпадает и по-прежнему отдаёт 404. Регресс-тест на это —
|
||||||
# в scripts/smoke-mera-perimeter.sh.
|
# в scripts/smoke-mera-perimeter.sh.
|
||||||
handle /trade-in/mera-public/* {
|
handle /trade-in/mera-public/* {
|
||||||
reverse_proxy tradein-frontend:3000
|
reverse_proxy tradein-frontend:3000 {
|
||||||
|
header_up -X-Authenticated-User
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Next.js уже эмитит ссылки на статику с /trade-in-префиксом (тот же
|
# Next.js уже эмитит ссылки на статику с /trade-in-префиксом (тот же
|
||||||
# basePath) — passthrough без rewrite. Нужны для рендера страницы (JS/CSS
|
# basePath) — passthrough без rewrite. Нужны для рендера страницы (JS/CSS
|
||||||
# чанки), сами по себе не содержат ни B2B-данных, ни секретов.
|
# чанки), сами по себе не содержат ни B2B-данных, ни секретов.
|
||||||
handle /trade-in/_next/* {
|
#
|
||||||
reverse_proxy tradein-frontend:3000
|
# Именно `static/*`, а не весь `_next/*` — тот же матчер, что у @uipreview
|
||||||
|
# (:78), который в проде доказал, что этого хватает для рендера. Широкий
|
||||||
|
# `_next/*` открыл бы анонимам ещё и `/_next/image` (оптимизация картинок,
|
||||||
|
# CPU-нагрузка по запросу), который на лэндинге не используется вообще:
|
||||||
|
# next/image в tradein-mvp/frontend/src/app/mera-public/ не импортируется.
|
||||||
|
handle /trade-in/_next/static/* {
|
||||||
|
reverse_proxy tradein-frontend:3000 {
|
||||||
|
header_up -X-Authenticated-User
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Allowlist-by-default: любой другой путь (включая B2B — /v2, /admin,
|
# Allowlist-by-default: любой другой путь (включая B2B — /v2, /admin,
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,12 @@ check "meraocenka.ru/v2 — B2B path must 404" "$BASE_MERA/v2" 404
|
||||||
check "meraocenka.ru/trade-in/v2 — B2B path must 404" "$BASE_MERA/trade-in/v2" 404
|
check "meraocenka.ru/trade-in/v2 — B2B path must 404" "$BASE_MERA/trade-in/v2" 404
|
||||||
check "meraocenka.ru/trade-in/api/* — must 404 (не проксируем API)" "$BASE_MERA/trade-in/api/v1/me" 404
|
check "meraocenka.ru/trade-in/api/* — must 404 (не проксируем API)" "$BASE_MERA/trade-in/api/v1/me" 404
|
||||||
|
|
||||||
|
# 2c. Статика проксируется ТОЛЬКО из _next/static/*. Оптимизатор картинок
|
||||||
|
# /_next/image на лэндинге не нужен (next/image там не импортируется) и
|
||||||
|
# наружу не открыт — иначе аноним получил бы CPU-нагрузку по запросу.
|
||||||
|
# Ловит расширение матчера обратно до `/trade-in/_next/*`.
|
||||||
|
check "meraocenka.ru/_next/image — must 404 (не открываем оптимизатор)" "$BASE_MERA/trade-in/_next/image?url=%2Ftest.png&w=64&q=75" 404
|
||||||
|
|
||||||
# 3. B2B-данные trade-in по-прежнему закрыты анониму.
|
# 3. B2B-данные trade-in по-прежнему закрыты анониму.
|
||||||
#
|
#
|
||||||
# ВНИМАНИЕ: проверять СТРАНИЦУ (/trade-in/v2) больше нельзя — она отдаёт 200.
|
# ВНИМАНИЕ: проверять СТРАНИЦУ (/trade-in/v2) больше нельзя — она отдаёт 200.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue