Инфраструктурные сервисы¶
PostgreSQL¶
Общая информация¶
| Параметр | Значение |
|---|---|
| Версия | PostgreSQL 16 (Alpine) |
| Контейнер | postgres |
| IP-адрес | 172.28.0.10 |
| Порт | 5432 |
| База данных | genai (основная), keycloak (отдельная) |
| Строка подключения | postgresql://postgres:${POSTGRES_PASSWORD}@postgres:5432/genai |
Архитектура: одна БД — несколько схем¶
Вместо отдельных баз данных для каждого микросервиса используется подход одна база данных (genai) с раздельными схемами. Это упрощает управление и снижает потребление ресурсов.
graph TB
subgraph PG["PostgreSQL"]
subgraph DB1["База данных: genai"]
S1[model_management]
S2[scan_profile]
S3[results]
S4[scan_orchestrator]
S5[jailbreak_service]
S6[user_management]
S7[notification]
S8[auth]
S9[licensing]
S10[asr_adversarial]
S11[cv_adversarial]
end
subgraph DB2["База данных: keycloak"]
KC[Keycloak data]
end
end
classDef cluster fill:transparent,stroke:#888,stroke-width:1px
class PG,DB1,DB2 cluster
Схемы базы данных¶
| Схема | Сервис | Описание |
|---|---|---|
model_management |
Model Management | Каталог AI/ML-моделей, контракты, мониторинг, probe |
scan_profile |
Scan Profile | Профили сканирования, определения атак, совместимость |
results |
Results | Результаты сканирования, уязвимости, артефакты |
scan_orchestrator |
Scan Orchestrator | Оркестрация сканирования, задания, состояния |
jailbreak_service |
Jailbreak Service | Промпты, шаблоны, библиотека Jailbreak-техник |
asr_adversarial |
ASR Adversarial | Данные ASR-атак |
cv_adversarial |
CV Adversarial | Данные CV-атак |
auth |
Auth Service | Авторизация, роли, сессии |
licensing |
License Service | Лицензии, ключи, ограничения |
user_management |
(зарезервирована) | Управление пользователями (обёртка над Keycloak) |
notification |
(зарезервирована) | Уведомления, предпочтения, история доставки |
Расширения PostgreSQL¶
В базе genai установлены следующие расширения:
| Расширение | Описание |
|---|---|
uuid-ossp |
Генерация UUID (функции uuid_generate_v4() и др.) |
pg_trgm |
Триграммный поиск по тексту (используется для fuzzy-поиска моделей) |
Миграции¶
Каждый микросервис управляет миграциями своей схемы через Alembic. Миграции выполняются автоматически при запуске платформы через one-shot контейнеры:
Для ручного управления миграциями:
# Проверка текущей версии миграции
docker exec -it model-management alembic current
# Откат последней миграции
docker exec -it model-management alembic downgrade -1
# Применение всех миграций
docker exec -it model-management alembic upgrade head
Резервное копирование¶
# Полный дамп базы данных
docker exec postgres pg_dump -U postgres genai > backup_genai_$(date +%Y%m%d_%H%M%S).sql
# Дамп конкретной схемы
docker exec postgres pg_dump -U postgres -n model_management genai > backup_model_management.sql
# Восстановление из дампа
docker exec -i postgres psql -U postgres genai < backup_genai_YYYYMMDD_HHMMSS.sql
Рекомендация
Настройте регулярное автоматическое резервное копирование (например, через cron) с хранением последних N копий.
NATS JetStream¶
Общая информация¶
| Параметр | Значение |
|---|---|
| Версия | NATS 2.10 (Alpine) |
| Тип развёртывания | Кластер из 3 узлов |
| Имя кластера | appsec-genai-cluster |
| Репликация | 3 реплики для каждого потока |
Узлы кластера¶
| Узел | Контейнер | IP-адрес | Client | Monitoring | Cluster |
|---|---|---|---|---|---|
| Node 1 | nats-1 |
172.28.0.20 | 4222 | 8222 | 6222 |
| Node 2 | nats-2 |
172.28.0.21 | 4223 | 8223 | 6223 |
| Node 3 | nats-3 |
172.28.0.22 | 4224 | 8224 | 6224 |
Потоки JetStream¶
Все потоки создаются автоматически контейнером nats-init с replicas=3:
| Поток | Subjects | Retention | Max Age | Max Msg Size | Описание |
|---|---|---|---|---|---|
ATTACKS |
attacks.*.* |
limits | 7 дней | 10 МБ | Распределение заданий атак между воркерами |
SCANS |
scans.* |
limits | 30 дней | 1 МБ | Жизненный цикл сканирований (создание, обновление, завершение) |
RESULTS |
results.*.* |
limits | 90 дней | 10 МБ | Результаты атак и уязвимости |
ARTIFACTS |
artifacts.*.* |
limits | 30 дней | 10 МБ | Артефакты атак (ссылки на S3) |
VULNERABILITIES |
vulnerabilities.*.* |
limits | 90 дней | 5 МБ | Детальные данные уязвимостей |
NOTIFICATIONS |
notifications.* |
workq | 7 дней | 1 МБ | Очередь уведомлений |
Подписки (Consumer Groups)¶
Каждый микросервис подписывается на соответствующие subjects:
| Сервис | Подписка | Тип | Описание |
|---|---|---|---|
| Scan Orchestrator | attacks.*.* |
Publisher | Публикует задания атак |
| Scan Orchestrator | scans.* |
Publisher | Публикует события сканирований |
| Jailbreak workers | attacks.jailbreak.* |
Consumer | Получают задания Jailbreak-атак |
| ASR workers | attacks.asr.* |
Consumer | Получают задания ASR-атак |
| CV workers | attacks.cv.* |
Consumer | Получают задания CV-атак |
| Results | results.*.* |
Consumer | Получает результаты от всех атакующих сервисов |
| Jailbreak reporter | results.jailbreak.* |
Publisher | Публикует результаты Jailbreak |
| ASR reporter | results.asr.* |
Publisher | Публикует результаты ASR |
| CV reporter | results.cv.* |
Publisher | Публикует результаты CV |
Мониторинг NATS¶
Состояние кластера доступно через HTTP monitoring:
# Healthcheck
curl -s http://localhost:8222/healthz
# Информация о сервере
curl -s http://localhost:8222/varz | jq .
# Информация о JetStream
curl -s http://localhost:8222/jsz | jq .
# Список потоков
curl -s http://localhost:8222/jsz?streams=true | jq '.streams[]'
# Информация о подключениях
curl -s http://localhost:8222/connz | jq .
Ручное управление потоками¶
При необходимости потоки можно создать/пересоздать вручную:
# Подключение к NATS Box
docker run --rm -it --network appsec-genai natsio/nats-box
# Список потоков
nats stream list --server=nats://nats-1:4222
# Информация о потоке
nats stream info ATTACKS --server=nats://nats-1:4222
# Удаление и пересоздание потока
nats stream delete ATTACKS --server=nats://nats-1:4222 --force
nats stream add ATTACKS --subjects='attacks.*.*' --storage=file \
--retention=limits --max-age=7d --max-msg-size=10MB \
--replicas=3 --server=nats://nats-1:4222 --defaults
Redis¶
Общая информация¶
| Параметр | Значение |
|---|---|
| Версия | Redis 7 (Alpine) |
| Контейнер | redis |
| IP-адрес | 172.28.0.30 |
| Порт | 6379 |
| Максимальная память | 512 МБ |
| Политика вытеснения | allkeys-lru |
| Персистентность | RDB + AOF |
Распределение баз данных¶
| DB | Сервис | Хранимые данные |
|---|---|---|
| 0 | Model Management, Jailbreak | Кеш моделей, статусы задач Jailbreak |
| 1 | Scan Orchestrator, Auth Service | Статусы сканирований, блокировки, сессии |
| 2 | ASR Adversarial, License Service | Статусы задач ASR, кеш лицензий |
| 3 | CV Adversarial | Статусы задач CV, кеш весов моделей |
Мониторинг Redis¶
# Статус сервера
docker exec redis redis-cli info
# Количество ключей по базам
docker exec redis redis-cli info keyspace
# Использование памяти
docker exec redis redis-cli info memory
# Мониторинг команд в реальном времени
docker exec redis redis-cli monitor
# Количество подключённых клиентов
docker exec redis redis-cli info clients
MinIO (S3-совместимое хранилище)¶
Общая информация¶
| Параметр | Значение |
|---|---|
| Контейнер | minio |
| IP-адрес | 172.28.0.40 |
| API порт | 9000 |
| Console порт | 9001 |
| Режим | Single-node |
Бакеты и файлы по умолчанию¶
При инициализации в бакеты загружаются файлы по умолчанию из контейнера simples-defaults:
| Бакет | Файл | Описание |
|---|---|---|
cv-images |
defaults/panda.jpg |
Тестовое изображение для CV-атак |
audio-samples |
defaults/daba_sample.wav |
Тестовый аудиофайл для ASR-атак |
model-weights |
defaults/vgg19_imagenet.pt |
Веса модели VGG19 (ImageNet) |
model-weights |
defaults/resnet50_imagenet.pt |
Веса модели ResNet50 (ImageNet) |
model-weights |
defaults/openai_whisper_base.zip |
Веса модели Whisper Base |
Presigned URLs¶
Для безопасного доступа к файлам из браузера используются presigned URLs — временные подписанные ссылки:
Параметр expiration_seconds задаёт время жизни ссылки (по умолчанию 3600 секунд = 1 час).
Доступ к MinIO Console¶
Веб-консоль MinIO доступна по адресу http://localhost:9001:
- Логин: значение
S3_ADMIN_USERиз.env(по умолчаниюminioadmin). - Пароль: значение
S3_ADMIN_PASSWORDиз.env.
Через консоль можно:
- Просматривать содержимое бакетов.
- Загружать и скачивать файлы.
- Управлять политиками доступа.
- Мониторить использование дискового пространства.
Keycloak¶
Общая информация¶
| Параметр | Значение |
|---|---|
| Версия | Keycloak 23.0 |
| Контейнер | keycloak |
| IP-адрес | 172.28.0.50 |
| Порт (внешний) | 8180 |
| Порт (внутренний) | 8080 |
| Realm | appsec-genai |
Конфигурация¶
Keycloak использует собственную базу данных keycloak в PostgreSQL. При первом запуске автоматически импортируется realm из файла auth-service/keycloak/realm-export.json.
Доступ к консоли администратора¶
- Логин: значение
KEYCLOAK_ADMINиз.env(по умолчаниюadmin). - Пароль: значение
KEYCLOAK_ADMIN_PASSWORDиз.env.
Роли пользователей¶
| Группа Keycloak | Роль в системе | Описание |
|---|---|---|
asg-viewer |
viewer |
Просмотр результатов |
asg-user |
user |
Запуск сканирований |
asg-power-user |
power_user |
Управление моделями и профилями |
asg-admin |
admin |
Полный доступ |
Аутентификация
По умолчанию аутентификация отключена (AUTH_ENABLED=false). Для включения установите AUTH_ENABLED=true в переменных UI Gateway и убедитесь, что Keycloak настроен корректно.