- shared-secret Caddy↔tradein-backend: X-Internal-Auth-Secret
(secrets.compare_digest, constant-time), fail-open до провижининга
TRADEIN_INTERNAL_AUTH_SECRET (WARNING на старте); при заданном секрете
подделка X-Authenticated-User изнутри docker-сети даёт 401
- rate-limiter: per-user/per-IP ключ вместо освобождения всех authenticated;
client IP из rightmost XFF (один доверенный прокси Caddy, который
аппендит real IP); leftmost XFF клиент-контролируем и игнорируется
- Caddyfile: убран глобальный log_credentials (писал обратимые base64
basic-auth пароли в логи; glitchtip-forwarder деградирует gracefully)
- тесты: secret-gate (401/200/backward-compat/wrong/no-user) + per-user
rate-limit + XFF-spoof нейтрализован
Провижининг (human, порядок критичен): значение секрета СНАЧАЛА в
окружение Caddy-стека (+recreate caddy), ПОТОМ в рантайм-окружение
tradein-backend (+restart). Обратный порядок = fail-closed 401 на всё
приложение. Значение секрета в репо не попадает.
Refs #2213