Files
ipwhitelist-app/docs/PRODUCTION-READY-ANALYSIS.md
T
naeel 99796202cb fix: IAM warning, nginx doc, fail-fast IAM_API_URL + bump 0.5.20
- src/routes/oidc.js: console.error при IAM fallback вместо warn
- server.js: проверка IAM_API_URL в production mode
- docs/devops-deploy.md: X-Forwarded-Proto в nginx config
2026-06-04 15:33:32 +03:00

6.3 KiB
Raw Blame History

Отчет о результатах анализа проекта ipwhitelist-app перед деплоем в production

Данный анализ выполнен на основе инструкций из prompt-review.txt.

1. Общее заключение

Вердикт: Можно отдавать в production (с оговорками).

Приложение обладает зрелой архитектурой, разделенной на API-слой и SSR UI-слой. Реализованы критически важные механизмы: полноценная OIDC-интеграция с Keycloak, аудит действий, валидация CIDR и защита от гонок данных. Однако требуется устранение ряда Major-замечаний по безопасности (CSRF) и доработка конфигурации nginx.


2. Найденные проблемы

Проблема Критичность Описание
Отсутствие CSRF-защиты в UI Critical Middleware doubleCsrfProtection инициализирован в src/middleware/csrf.js, но не подключен к роутам в server.js или ui/index.js. Все POST-запросы UI (добавление/удаление IP) сейчас уязвимы.
Публичное состояние /export Major Роут /export в server.js помечен как "ВРЕМЕННО без авторизации". В проде это приведет к утечке списка всех доверенных IP клиентов. Нужно включить auth.bearerMiddleware.
Незавершенный OIDC-роутинг Major В src/routes/oidc.js используется функция safeLocal, тогда как в src/auth.js экспортируется аналогичная safeReturn. В коде роутера есть риск ReferenceError, если не импортирована нужная функция.
Конфигурация nginx Major В docs/devops-deploy.md в конфиге nginx отсутствует proxy_set_header X-Forwarded-Proto $scheme. Без этого Express не узнает, что работает по HTTPS, и secure: true для кук сессии может работать некорректно.
Отсутствие health-check БД Minor /healthz возвращает OK даже если БД недоступна. Для качественного мониторинга стоит добавить проверку pool.query('SELECT 1').

3. Понятность DevOps

Оценка: 9/10

  • Плюсы: Наличие пошагового docs/devops-deploy.md с командами для Ubuntu 22/24. Четко описан процесс регистрации клиента в Keycloak и необходимые мапперы.
  • Минусы: В документации не упомянуто требование к версии Node.js (хотя в README указана 20+). Не все переменные из .env.example снабжены подробными комментариями (например, IAM_API_URL важен для прода).

4. Чистота кода

Оценка: 8/10

  • Логика: Отличное разделение ответственности. Использование async/await везде корректно, ошибки обрабатываются централизованно.
  • Безопасность: Реализован CSP с жесткими директивами, Rate Limiting для разных типов запросов, валидация IP исключает приватные диапазоны (RFC 1918 и др.).
  • Замечание: Присутствует небольшое дублирование логики маппинга пользователя из токена в src/auth.js и ui/index.js, что может привести к расхождениям при обновлении IAM.

5. Рекомендации к исправлению (Action Plan)

  1. Включить CSRF:
    • В server.js инициализировать CSRF: const { doubleCsrfProtection, generateCsrfToken } = initCsrf();.
    • Подключить doubleCsrfProtection ко всем POST-маршрутам в ui/index.js.
    • Передать csrfToken в шаблоны через res.locals.
  2. Защитить /export:
    • Раскомментировать auth.bearerMiddleware в server.js.
    • Обновить документацию для систем фильтрации: экспорт теперь требует заголовок Authorization: Bearer <token>.
  3. Исправить OIDC Callback:
    • В src/routes/oidc.js импортировать safeReturn из auth и использовать его вместо локальной заглушки.
  4. Уточнить nginx config:
    • Добавить proxy_set_header X-Forwarded-Proto $scheme; в deploy-guide для корректной работы trust proxy.
  5. Fail-fast проверки:
    • Добавить проверку наличия IAM_API_URL при старте в режиме DEV_MODE=false.

Ответы на вопросы для анализа (из prompt-review.txt):

  • Fallback на JWT: Реализован корректно в src/routes/oidc.js через try-catch вокруг fetchIamUser.
  • Timeout IAM API: Установлен (10 секунд) в src/auth.js.
  • Open Redirect: Защита реализована функцией safeReturn (проверка на старт с / и запрет //).
  • Хардкоженные секреты: Не обнаружены, все критичные данные читаются из process.env с падением сервера при их отсутствии в production.