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

60 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Отчет о результатах анализа проекта ipwhitelist-app перед деплоем в production
Данный анализ выполнен на основе инструкций из [prompt-review.txt](prompt-review.txt).
### 1. Общее заключение
**Вердикт: Можно отдавать в production (с оговорками).**
Приложение обладает зрелой архитектурой, разделенной на API-слой и SSR UI-слой. Реализованы критически важные механизмы: полноценная OIDC-интеграция с Keycloak, аудит действий, валидация CIDR и защита от гонок данных. Однако требуется устранение ряда Major-замечаний по безопасности (CSRF) и доработка конфигурации nginx.
---
### 2. Найденные проблемы
| Проблема | Критичность | Описание |
|:---|:---:|:---|
| **Отсутствие CSRF-защиты в UI** | **Critical** | Middleware `doubleCsrfProtection` инициализирован в [src/middleware/csrf.js](src/middleware/csrf.js), но **не подключен** к роутам в `server.js` или `ui/index.js`. Все POST-запросы UI (добавление/удаление IP) сейчас уязвимы. |
| **Публичное состояние /export** | **Major** | Роут `/export` в [server.js](server.js#L78) помечен как "ВРЕМЕННО без авторизации". В проде это приведет к утечке списка всех доверенных IP клиентов. Нужно включить `auth.bearerMiddleware`. |
| **Незавершенный OIDC-роутинг** | **Major** | В [src/routes/oidc.js](src/routes/oidc.js) используется функция `safeLocal`, тогда как в [src/auth.js](src/auth.js) экспортируется аналогичная `safeReturn`. В коде роутера есть риск ReferenceError, если не импортирована нужная функция. |
| **Конфигурация nginx** | **Major** | В [docs/devops-deploy.md](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](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](server.js#L78).
* Обновить документацию для систем фильтрации: экспорт теперь требует заголовок `Authorization: Bearer <token>`.
3. **Исправить OIDC Callback:**
* В [src/routes/oidc.js](src/routes/oidc.js) импортировать `safeReturn` из `auth` и использовать его вместо локальной заглушки.
4. **Уточнить nginx config:**
* Добавить `proxy_set_header X-Forwarded-Proto $scheme;` в [deploy-guide](docs/devops-deploy.md) для корректной работы `trust proxy`.
5. **Fail-fast проверки:**
* Добавить проверку наличия `IAM_API_URL` при старте в режиме `DEV_MODE=false`.
### Ответы на вопросы для анализа (из prompt-review.txt):
* **Fallback на JWT:** Реализован корректно в [src/routes/oidc.js](src/routes/oidc.js) через `try-catch` вокруг `fetchIamUser`.
* **Timeout IAM API:** Установлен (10 секунд) в [src/auth.js](src/auth.js#L236).
* **Open Redirect:** Защита реализована функцией `safeReturn` (проверка на старт с `/` и запрет `//`).
* **Хардкоженные секреты:** Не обнаружены, все критичные данные читаются из `process.env` с падением сервера при их отсутствии в `production`.