[SECURITY] Caddy: голый IP по HTTP спрашивал пароль пилота открытым текстом #3318

Merged
lekss361 merged 2 commits from fix/caddy-bare-ip-plaintext-auth into main 2026-09-09 21:49:10 +00:00
Collaborator

Из армейского аудита 01-02.09, линза ptica-api. Воспроизведено живьём: curl http://188.124.37.140/api/v1/me401 + Www-Authenticate: Basic realm="GenDesign Pilot". Браузер, открывший голый IP, отправил бы пароль plaintext-ом любому слушающему канал.

Почему так вышло

Замысел блока :80 был верный — «закрыть обход через голый IP тем же auth-гейтом». Исполнение дырявое: basic_auth на plain HTTP — это и есть канал утечки пароля.

Правка

/health остаётся публичным (liveness). Всё остальное — redir https://gendsgn.ru{uri} permanent. Редирект строже гейта: по HTTP не отдаётся ни контент, ни сам запрос пароля — обход закрыт тем, что отвечать нечему.

Проверено до мержа

  • Потребителей у IP:80 нет: все deploy-смоки ходят docker execlocalhost внутри контейнеров (grep по .forgejo/workflows и ops/).
  • Конфиг провалидирован боевым бинарём: docker exec gendesign-caddy-1 caddy validateValid configuration.
  • Гейт snippet-mounts зелёный (6 конфигов, 7 маунтов).

После деплоя

curl -sI http://188.124.37.140/api/v1/me обязан отдать 301 Location: https://gendsgn.ru/api/v1/me и ни одного Www-Authenticate. curl http://IP/health — по-прежнему 200.

Из армейского аудита 01-02.09, линза ptica-api. Воспроизведено живьём: `curl http://188.124.37.140/api/v1/me` → `401` + `Www-Authenticate: Basic realm="GenDesign Pilot"`. Браузер, открывший голый IP, отправил бы пароль **plaintext-ом** любому слушающему канал. ## Почему так вышло Замысел блока `:80` был верный — «закрыть обход через голый IP тем же auth-гейтом». Исполнение дырявое: **basic_auth на plain HTTP — это и есть канал утечки пароля**. ## Правка `/health` остаётся публичным (liveness). Всё остальное — `redir https://gendsgn.ru{uri} permanent`. Редирект **строже** гейта: по HTTP не отдаётся ни контент, ни сам запрос пароля — обход закрыт тем, что отвечать нечему. ## Проверено до мержа - Потребителей у `IP:80` нет: все deploy-смоки ходят `docker exec` → `localhost` внутри контейнеров (grep по `.forgejo/workflows` и `ops/`). - Конфиг провалидирован **боевым бинарём**: `docker exec gendesign-caddy-1 caddy validate` → `Valid configuration`. - Гейт snippet-mounts зелёный (6 конфигов, 7 маунтов). ## После деплоя `curl -sI http://188.124.37.140/api/v1/me` обязан отдать `301 Location: https://gendsgn.ru/api/v1/me` и **ни одного** `Www-Authenticate`. `curl http://IP/health` — по-прежнему 200.
bot-backend added 1 commit 2026-09-02 06:55:29 +00:00
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
8104be1695
Аудит 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 зелёный.
bot-backend added 1 commit 2026-09-09 21:47:11 +00:00
Merge branch 'main' into fix/caddy-bare-ip-plaintext-auth
All checks were successful
CI Trade-In / changes (pull_request) Successful in 10s
CI / changes (pull_request) Successful in 13s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (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
CI Trade-In / frontend-checks (pull_request) Successful in 1m18s
ff9ee721a7
lekss361 merged commit 60bb7cf54e into main 2026-09-09 21:49:10 +00:00
lekss361 deleted branch fix/caddy-bare-ip-plaintext-auth 2026-09-09 21:49:11 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3318
No description provided.