Caddy: голый IP по HTTP больше не спрашивает пароль открытым текстом
All checks were successful
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m3s
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 18s
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
All checks were successful
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m3s
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 18s
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
Аудит 02.09: curl http://188.124.37.140/api/v1/me отвечал 401 с Www-Authenticate: Basic realm=GenDesign Pilot. Браузер, открывший голый IP, отправил бы пароль пилота plaintext-ом любому слушающему канал. Замысел блока был верный — «закрыть обход через голый IP тем же auth-гейтом». Исполнение дырявое: basic_auth на plain HTTP это и есть канал утечки пароля. Редирект на канонический HTTPS строже гейта: по HTTP не отдаётся ни контент, ни сам запрос пароля — обход закрыт тем, что отвечать нечему. /health остаётся публичным (liveness). Потребителей у IP:80 нет: все deploy-смоки ходят docker exec → localhost внутри контейнеров (grep по .forgejo/workflows и ops/). Конфиг провалидирован БОЕВЫМ бинарём: docker exec gendesign-caddy-1 caddy validate → Valid configuration. Гейт snippet-mounts зелёный.
This commit is contained in:
parent
4fe0538ea0
commit
8104be1695
1 changed files with 14 additions and 17 deletions
31
Caddyfile
31
Caddyfile
|
|
@ -50,30 +50,27 @@
|
||||||
# ничего не меняется. В окне: на Selectel CADDY_SITES=apps, на Beget=infra.
|
# ничего не меняется. В окне: на Selectel CADDY_SITES=apps, на Beget=infra.
|
||||||
import caddy/sites/{$CADDY_SITES:*}.caddy
|
import caddy/sites/{$CADDY_SITES:*}.caddy
|
||||||
|
|
||||||
# Plain HTTP by IP — closed by same auth gate (prevent bypass via direct IP / SSH tunnel).
|
# Plain HTTP by IP. /health остаётся публичным (liveness). Всё остальное —
|
||||||
# Caddy issues no TLS here (no hostname). /health remains public.
|
# РЕДИРЕКТ на канонический HTTPS, а не проксирование под basic_auth.
|
||||||
|
#
|
||||||
|
# ЗДЕСЬ СТОЯЛ auth-гейт с проксированием приложения — «закрыть обход через
|
||||||
|
# голый IP тем же гейтом». Замысел верный, исполнение — дыра: Basic-challenge
|
||||||
|
# на plain HTTP означает, что браузер отправит пароль пилота ОТКРЫТЫМ ТЕКСТОМ
|
||||||
|
# любому, кто слушает канал (аудит 02.09.2026: curl http://<IP>/api/v1/me →
|
||||||
|
# 401 + Www-Authenticate: Basic realm="GenDesign Pilot"). Редирект строже
|
||||||
|
# гейта: по HTTP не отдаётся ни контент, ни сам запрос пароля, обход через
|
||||||
|
# IP закрыт тем, что отвечать нечему. Потребителей у IP:80 нет: все
|
||||||
|
# deploy-смоки ходят docker exec → localhost внутри контейнеров (проверено
|
||||||
|
# grep-ом по .forgejo/workflows и ops/ 02.09.2026).
|
||||||
:80 {
|
:80 {
|
||||||
encode zstd gzip
|
|
||||||
|
|
||||||
route {
|
route {
|
||||||
# /health — public, без auth (GHA deploy smoke check, liveness probe).
|
# /health — public, без auth (liveness probe).
|
||||||
handle /health {
|
handle /health {
|
||||||
reverse_proxy backend:8000
|
reverse_proxy backend:8000
|
||||||
}
|
}
|
||||||
|
|
||||||
# Auth gate (same snippet as gendsgn.ru).
|
|
||||||
import caddy/users.caddy.snippet
|
|
||||||
|
|
||||||
handle /api/* {
|
|
||||||
reverse_proxy backend:8000 {
|
|
||||||
header_up X-Authenticated-User {http.auth.user.id}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
handle {
|
handle {
|
||||||
reverse_proxy frontend:3000 {
|
redir https://gendsgn.ru{uri} permanent
|
||||||
header_up X-Authenticated-User {http.auth.user.id}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue