fix: аудит — 19 фиксов безопасности, надёжности, UI и 16 новых тестов
- S4: bump jinja2>=3.1.4, python-multipart>=0.0.18, httpx>=0.28.0
- S5: _detect_ecosystem — DEFAULT_ECOSYSTEM для неизвестных форматов
- S6: harvester — log.exception() вместо log.error()
- S8: _scan_component — urlencode параметров
- P1: scanner — proc.kill() при таймауте
- P3: api_packages — selectinload(Scan.findings), убран N+1
- P4+P5: утечка _url_locks и _llm_locks при early return
- P6: DB reaper — сброс {'status':'analyzing'} при старте
- UI: htmx-пагинация, фильтры не теряют flagged, 404 с layout
- UI: мобильные таблицы overflow-x, полная стата на дашборде
- UI: i18n статусов в _status_badge, urlencode package_name
- 16 новых тестов: analyze endpoint (6), scanner errors (4),
webhook signature (2), llm client (4)
This commit is contained in:
32
README.md
32
README.md
@@ -87,6 +87,7 @@ python -m guarddog_nexus.main
|
||||
| `MAX_CONCURRENT_SCANS` | `4` | Максимум одновременных сканирований GuardDog |
|
||||
| `LOG_SYSLOG_FACILITY` | `local0` | Syslog facility (local0–local7) |
|
||||
| `LLM_ENABLED` | `0` | `1` — включить LLM-анализ уязвимостей |
|
||||
| `LLM_AUTO_ANALYZE` | `0` | `1` — автоанализ после скана; `0` = ручной режим через кнопку в UI |
|
||||
| `LLM_API_KEY` | _(пусто)_ | API-ключ (OpenAI / Groq / Ollama / etc.) |
|
||||
| `LLM_API_BASE` | `https://api.openai.com/v1` | Базовый URL OpenAI-совместимого API |
|
||||
| `LLM_MODEL` | `gpt-4o-mini` | Название модели |
|
||||
@@ -149,13 +150,14 @@ GuardDog Nexus принимает вебхуки от Nexus при событи
|
||||
| Метод | Путь | Описание |
|
||||
|-------|------|----------|
|
||||
| GET | `/api/v1/findings` | Список уязвимостей (фильтр по правилу, severity, scan_id) |
|
||||
| POST | `/api/v1/findings/{id}/analyze` | Запустить LLM-анализ уязвимости |
|
||||
| POST | `/api/v1/findings/{id}/analyze` | Запустить LLM-анализ уязвимости (возвращает HTMX-фрагмент при вызове из веб-интерфейса) |
|
||||
|
||||
### Здоровье
|
||||
### Здоровье и метрики
|
||||
|
||||
| Метод | Путь | Описание |
|
||||
|-------|------|----------|
|
||||
| GET | `/health` | Проверка работоспособности |
|
||||
| GET | `/metrics` | Метрики в формате Prometheus |
|
||||
|
||||
## Веб-интерфейс
|
||||
|
||||
@@ -227,26 +229,40 @@ guarddog-nexus/
|
||||
|
||||
## LLM-анализ
|
||||
|
||||
GuardDog Nexus может автоматически анализировать каждую найденную уязвимость через LLM (языковую модель). При включении (`LLM_ENABLED=1`) каждый flagged скан получает AI-разбор: насколько угроза реальна, что делает подозрительный код, рекомендации.
|
||||
GuardDog Nexus может анализировать найденные уязвимости через LLM (языковую модель). При включении (`LLM_ENABLED=1`) уязвимые находки получают AI-разбор: насколько угроза реальна, что делает подозрительный код, рекомендации.
|
||||
|
||||
### Как работает
|
||||
### Режимы работы
|
||||
|
||||
1. **Автоматический режим:** после завершения скана с уязвимостями GuardDog Nexus отправляет каждую находку в LLM, сохраняет отчёт в БД и включает его в syslog-событие
|
||||
2. **Ручной режим:** в веб-интерфейсе на странице сканирования у каждой уязвимости есть кнопка «Analyze with LLM» — нажатие отправляет запрос и показывает вердикт inline
|
||||
Переменная `LLM_AUTO_ANALYZE` управляет режимом анализа:
|
||||
|
||||
- **`LLM_AUTO_ANALYZE=1` (автоматический):** после завершения скана каждая находка автоматически отправляется в LLM. Отчёт сохраняется в БД и включается в syslog-событие. Кнопка анализа в UI не отображается.
|
||||
- **`LLM_AUTO_ANALYZE=0` (ручной, по умолчанию):** в веб-интерфейсе рядом с каждой уязвимостью отображается кнопка «Analyze with LLM». Пользователь нажимает кнопку — запускается анализ, результат показывается inline.
|
||||
|
||||
### Состояния finding.report
|
||||
|
||||
Поле `finding.report` проходит через конечный автомат:
|
||||
|
||||
| Значение | UI |
|
||||
|----------|----|
|
||||
| `None` | Кнопка «Analyze with LLM» (только в ручном режиме) |
|
||||
| `{"status": "analyzing"}` | Спиннер |
|
||||
| `{verdict:, summary:, ...}` | Отчёт + ссылка «Retry» |
|
||||
|
||||
### Поддерживаемые провайдеры
|
||||
|
||||
Любой OpenAI-совместимый API. Примеры конфигурации:
|
||||
|
||||
```bash
|
||||
# OpenAI
|
||||
# OpenAI (ручной режим)
|
||||
LLM_ENABLED=1
|
||||
LLM_AUTO_ANALYZE=0
|
||||
LLM_API_KEY=sk-...
|
||||
LLM_API_BASE=https://api.openai.com/v1
|
||||
LLM_MODEL=gpt-4o-mini
|
||||
|
||||
# Groq (быстрее, бесплатный тир)
|
||||
# Groq с автоанализом (быстрее, бесплатный тир)
|
||||
LLM_ENABLED=1
|
||||
LLM_AUTO_ANALYZE=1
|
||||
LLM_API_KEY=gsk_...
|
||||
LLM_API_BASE=https://api.groq.com/openai/v1
|
||||
LLM_MODEL=llama-3.3-70b-versatile
|
||||
|
||||
Reference in New Issue
Block a user