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