Files
ros_control/docs/changes/025-trusted-proxies-port/summary.md
T
ayurishchevandClaude Opus 5.5 5367cb5e9c Доверенные прокси (реальный IP клиента) и параметризация порта
Пункты 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>
2026-09-28 21:19:10 +03:00

3.6 KiB
Raw Blame History

Итоги: 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, /login 200.
  • Подделка на стенде: 5 неверных входов с X-Forwarded-For: 9.9.9.9 → 401; далее без заголовка и с 8.8.8.8 → 429 (заблокирован реальный адрес); события auth.failed ×4, auth.locked ×1 с IP 172.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 пользователем на момент коммита не подтверждена.