Пункты 14 и 16 ревью 2026-09-28 17:35 (docs/changes/025):
- TRUSTED_PROXIES (CIDR, по умолчанию пусто): X-Forwarded-For учитывается
только от доверенного peer, цепочка разбирается справа налево; иначе
заголовок игнорируется — подделать IP нельзя. Реальный IP — в блокировке
входа и событиях auth.*; неверный CIDR — отказ старта;
- docker-compose: "${APP_BIND:-0.0.0.0}:${APP_PORT:-8000}:8000"; стенд на
8001 через APP_PORT в .env, override-файл больше не нужен.
Тесты: 36 из 36. Стенд: поддельный X-Forwarded-For проигнорирован,
заблокирован реальный адрес; боевые данные не изменены. Ручная проверка
UI пользователем на момент коммита не подтверждена.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.6 KiB
3.6 KiB
Итоги: 025 — доверенные прокси (реальный IP клиента) и параметризация порта
Источник — ревью docs/reviews/2026-09-28-1735-codebase-review.md, пункты 14 и 16.
Сделано
- п. 16 — порт:
docker-compose.ymlпубликует"${APP_BIND:-0.0.0.0}:${APP_PORT:-8000}:8000"(как в ipam_control);.env.example—APP_PORT,APP_BIND. В.envстенда оркестратор добавилAPP_PORT=8001(секреты не менялись) — стенд поднимается обычнымdocker compose up -d, override-файл вне репозитория больше не нужен. - п. 14 —
TRUSTED_PROXIES(CIDR через запятую, по умолчанию пусто; на стенде пусто):app/security.py::client_ip— пустой список или peer не из доверенной сети →X-Forwarded-Forигнорируется; иначе цепочка (все заголовки) справа налево, доверенные адреса пропускаются, первый недоверенный — IP клиента; невалидная запись обрывает разбор (последний валидный адрес прокси или peer — клиентский адрес не подставить); все доверенные / нет заголовка — peer.app/config.py::trusted_networks(кэш), невалидный CIDR — проблема вinsecure_settings(отказ старта).loginиспользуетclient_ip: ключ блокировки иdata.ipвauth.*. uvicorn--proxy-headersне включён. - README: «Быстрый старт», «Конфигурация» (
APP_PORT,APP_BIND,TRUSTED_PROXIES), «Безопасность» (разбор XFF, предупреждение о доверии к сети Docker-моста), «Эксплуатация» (стенд на 8001 через.env), число тестов, строка 025.
Проверено
pytest: 36 из 36 (новые: алгоритмclient_ip— пустой список, недоверенный peer, цепочка с прокси, все доверенные, мусор, нет заголовка, IPv6; блокировка входа за доверенным прокси; невалидныйTRUSTED_PROXIES).docker compose config: опубликован 8001 из.env; стенд без override —0.0.0.0:8001->8000,/login200.- Подделка на стенде: 5 неверных входов с
X-Forwarded-For: 9.9.9.9→ 401; далее без заголовка и с8.8.8.8→ 429 (заблокирован реальный адрес); событияauth.failed×4,auth.locked×1 с IP172.28.0.1(шлюз Docker), не9.9.9.9. Блокировка снята перезапуском контейнера. - Боевые данные: группы и устройства совпадают по ID; добавлены 5 событий проверки (и 2 бэкапа, запущенные пользователем в UI в это время).
Оговорки
- С reverse-proxy реальный IP появится только после задания
TRUSTED_PROXIES;X-Forwarded-Proto(для Secure-cookie) не разбирается — флаг задаётсяSESSION_COOKIE_SECURE. - Ручная проверка UI пользователем на момент коммита не подтверждена.