fix: убрать неиспользуемый импорт text из packages.py

This commit is contained in:
Marker689
2026-05-10 03:17:32 +03:00
parent 97b89d3fdf
commit 6c8e89c95e
2 changed files with 197 additions and 1 deletions

196
README.md Normal file
View File

@@ -0,0 +1,196 @@
# GuardDog Nexus
Интеграция [GuardDog](https://github.com/DataDog GuardDog) (сканер уязвимостей пакетов PyPI) с [Sonatype Nexus Repository Manager]. Автоматически сканирует Python-пакеты, хранящиеся в Nexus, на наличие уязвимостей, вредоносного кода и подозрительных паттернов при каждом обновлении или добавлении пакета.
## Возможности
- **Автоматическое сканирование** по вебхукам Nexus при создании/обновлении пакетов
- **Поддержка нескольких экосистем** — PyPI, Gem, и другие форматы через Nexus
- **REST API** для просмотра результатов сканирования, уязвимостей и статистики
- **Веб-интерфейс** с дашбордом, таблицами сканирований и фильтрацией по уязвимостям
- **Дедупликация** по URL и SHA256 — один и тот же пакет сканируется один раз
- **Структурированное логирование** в формате JSON с опциональной отправкой в syslog
- **Docker Compose** для развёртывания приложения, Nexus и настройки в одном стеке
## Архитектура
```
Nexus ──(webhook)──> GuardDog Nexus ──(REST API)──> Веб-интерфейс
├──> GuardDog CLI (сканирование)
├──> SQLite (хранилище результатов)
└──> REST API (данные для UI)
```
## Быстрый старт
### Требования
- Docker и Docker Compose
- Python 3.10+ (для локальной разработки)
### Развёртывание в Docker
```bash
# Скопируйте файл конфигурации
cp .env.example .env
# Отредактируйте .env при необходимости
# NEXUS_PASSWORD=<ваш_пароль_администратора_Nexus>
# Запустите стек
make docker-up
```
После запуска доступны:
| Сервис | URL | Порт |
|--------|-----|------|
| GuardDog Nexus | http://localhost:8080 | 8080 |
| Sonatype Nexus | http://localhost:8081 | 8081 |
### Локальная разработка
```bash
# Установите зависимости
make install dev
# Настройте переменные окружения
cp .env.example .env
export $(cat .env | xargs)
# Запустите приложение
python -m guarddog_nexus.main
```
## Переменные окружения
| Переменная | По умолчанию | Описание |
|------------|-------------|----------|
| `NEXUS_URL` | `http://localhost:8081` | URL Sonatype Nexus |
| `NEXUS_USERNAME` | `admin` | Имя пользователя Nexus |
| `NEXUS_PASSWORD` | _(обязательно)_ | Пароль пользователя Nexus |
| `NEXUS_REPOSITORIES` | _(пусто)_ | Список репозиториев через запятую |
| `DATABASE_PATH` | `data/guarddog.db` | Путь к SQLite-базе данных |
| `HOST` | `0.0.0.0` | Хост для прослушивания |
| `PORT` | `8080` | Порт для прослушивания |
| `LOG_LEVEL` | `INFO` | Уровень логирования |
| `LOG_SYSLOG_HOST` | _(пусто)_ | Хост syslog для отправки логов |
| `LOG_SYSLOG_PORT` | `514` | Порт syslog |
| `WEBHOOK_SECRET` | _(пусто)_ | Секрет для HMAC-подписи вебхуков |
| `SCAN_TIMEOUT_SECONDS` | `300` | Таймаут сканирования одного пакета |
| `TEMP_DIR` | `/tmp/guarddog-nexus` | Временная директория для загрузки пакетов |
## Настройка Nexus
### Создание репозитория
1. Убедитесь, что в Nexus создан репозиторий `pypi-proxy` (прокси на `https://pypi.org`)
2. Настройте вебхук Nexus для отправки событий на `http://<guarddog-nexus>:8080/webhooks/nexus`
3. Используйте `scripts/setup-nexus.sh` для автоматической настройки (требует `curl`)
### Вебхуки
Nexus отправляет вебхуки при событиях `ASSET` и `COMPONENT`. GuardDog Nexus поддерживает:
- **CREATED** — новое событие при создании пакета
- **UPDATED** — событие при обновлении пакета
Для валидации вебхуков установите `WEBHOOK_SECRET` — подпись проверяется через HMAC-SHA256.
> **Примечание:** Вебхуки доступны в Nexus Pro. В Nexus Repository Manager 3 Community Edition настройка вебхуков может потребовать дополнительных плагинов.
## REST API
### Сканирования
| Метод | Путь | Описание |
|-------|------|----------|
| GET | `/api/v1/scans` | Список сканирований (пагинация, фильтр `flagged`) |
| GET | `/api/v1/scans/stats` | Статистика: общее количество, уязвимые пакеты, топ правил |
| GET | `/api/v1/scans/{id}` | Детали конкретного сканирования с результатами |
### Пакеты
| Метод | Путь | Описание |
|-------|------|----------|
| GET | `/api/v1/packages` | Список уникальных пакетов (пагинация, фильтр по экосистеме) |
| GET | `/api/v1/packages/{name}/{version}` | Все сканирования и уязвимости для пакета |
### Уязвимости
| Метод | Путь | Описание |
|-------|------|----------|
| GET | `/api/v1/findings` | Список уязвимостей (фильтр по правилу, severity, scan_id) |
### Здоровье
| Метод | Путь | Описание |
|-------|------|----------|
| GET | `/health` | Проверка работоспособности |
## Веб-интерфейс
| Страница | URL | Описание |
|----------|-----|----------|
| Дашборд | `/` | Статистика, графики, топ уязвимых пакетов |
| Сканирования | `/scans` | Таблица всех сканирований с фильтрацией |
| Детали сканирования | `/scans/{id}` | Результаты одного сканирования |
| Пакеты | `/packages` | Таблица уникальных пакетов |
| Детали пакета | `/packages/{name}/{version}` | История сканирований и уязвимости пакета |
## Структура проекта
```
guarddog-nexus/
├── guarddog_nexus/ # Основной пакет
│ ├── main.py # Точка входа FastAPI
│ ├── config.py # Конфигурация из переменных окружения
│ ├── database.py # Async SQLAlchemy + aiosqlite
│ ├── models.py # ORM-модели (Scan, Finding)
│ ├── logging_setup.py # JSON-логирование + syslog
│ ├── harvester.py # Пайплайн: загрузка → сканирование → сохранение
│ ├── scanner.py # Интеграция с GuardDog CLI
│ ├── nexus_client.py # HTTP-клиент для Nexus REST API
│ ├── webhooks.py # Приём вебхуков Nexus
│ ├── api/ # REST API (JSON)
│ │ ├── scans.py
│ │ ├── packages.py
│ │ └── findings.py
│ └── web/ # Веб-интерфейс
│ ├── routes.py
│ ├── templates/ # Jinja2-шаблоны
│ └── static/ # CSS, JS
├── tests/ # Тесты pytest
├── scripts/ # Вспомогательные скрипты
├── docker-compose.yml # Стек Docker Compose
├── Dockerfile # Образ приложения
└── pyproject.toml # Зависимости и настройки
```
## Команды Makefile
| Команда | Описание |
|---------|----------|
| `make install` | Установка зависимостей проекта |
| `make dev` | Установка зависимостей для разработки |
| `make test` | Запуск тестов |
| `make lint` | Проверка кода через Ruff |
| `make format` | Форматирование кода через Ruff |
| `make typecheck` | Проверка типов через mypy |
| `make docker-build` | Сборка Docker-образа |
| `make docker-up` | Запуск стека Docker Compose |
| `make docker-down` | Остановка стека с удалением данных |
| `make docker-logs` | Просмотр логов стека |
| `make clean` | Очистка артефактов сборки |
## Безопасность
- Вебхуки поддерживают HMAC-SHA256 подпись через `WEBHOOK_SECRET`
- Nexus-клиент использует BasicAuth для аутентификации
- Результаты сканирования хранятся в локальной SQLite-базе
- Временные файлы пакетов удаляются после сканирования
## Лицензия
MIT

View File

@@ -4,7 +4,7 @@ import csv
import io import io
from fastapi import APIRouter, Depends, Query, Response from fastapi import APIRouter, Depends, Query, Response
from sqlalchemy import func, select, text from sqlalchemy import func, select
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from guarddog_nexus.database import get_session from guarddog_nexus.database import get_session