Перейти к содержанию

Конфигурация

Переменные окружения (.env)

Все общие параметры конфигурации задаются в файле .env в директории compose/. Этот файл используется Docker Compose для подстановки значений в docker-compose.yml.

Создание файла .env

cd compose
cp .env.example .env

Полный пример файла .env

# ============================================================
# AppSec.GenAI Infrastructure Configuration
# ============================================================

# PostgreSQL
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres_secure_password_change_me

# S3/MinIO admin credentials
S3_ADMIN_USER=minioadmin
S3_ADMIN_PASSWORD=minioadmin_change_me

# Keycloak
KEYCLOAK_ADMIN=admin
KEYCLOAK_ADMIN_PASSWORD=admin_change_me

# Grafana (если используется)
GRAFANA_ADMIN_USER=admin
GRAFANA_ADMIN_PASSWORD=admin_change_me

# Elasticsearch (если используется)
ELASTIC_PASSWORD=elastic_change_me

# General
COMPOSE_PROJECT_NAME=appsec-genai

Описание переменных

Переменная Описание Значение по умолчанию Обязательная
POSTGRES_USER Имя суперпользователя PostgreSQL postgres Да
POSTGRES_PASSWORD Пароль суперпользователя PostgreSQL postgres_secure_password_change_me Да
S3_ADMIN_USER Имя администратора MinIO (S3) minioadmin Да
S3_ADMIN_PASSWORD Пароль администратора MinIO (S3) minioadmin_change_me Да
KEYCLOAK_ADMIN Имя администратора Keycloak admin Да
KEYCLOAK_ADMIN_PASSWORD Пароль администратора Keycloak admin_change_me Да
GRAFANA_ADMIN_USER Имя администратора Grafana admin Нет
GRAFANA_ADMIN_PASSWORD Пароль администратора Grafana admin_change_me Нет
ELASTIC_PASSWORD Пароль Elasticsearch elastic_change_me Нет
COMPOSE_PROJECT_NAME Префикс имён контейнеров и сети appsec-genai Да
ENVIRONMENT Режим работы (dev, staging, production) dev Нет
DEBUG Режим отладки (true/false) false Нет
LOG_LEVEL Уровень логирования (DEBUG, INFO, WARNING, ERROR) INFO Нет
AUTH_ENABLED Включение аутентификации через Keycloak false Нет
S3_PUBLIC_ENDPOINT Публичный URL MinIO для presigned URLs http://localhost:9000 Нет

Смените пароли перед эксплуатацией

Все значения по умолчанию предназначены исключительно для разработки. Перед развёртыванием в боевой среде обязательно замените все пароли на надёжные значения длиной не менее 16 символов.


Конфигурация PostgreSQL

Конфигурационный файл: compose/postgres/postgres.conf

Текущая конфигурация

# Connection Settings
listen_addresses = '*'
port = 5432
max_connections = 200

# Memory Settings
shared_buffers = 256MB
effective_cache_size = 1GB
work_mem = 16MB
maintenance_work_mem = 64MB

# Write Ahead Log
wal_level = replica
max_wal_size = 1GB
min_wal_size = 80MB

# Logging
log_destination = 'stderr'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100MB
log_min_duration_statement = 1000
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
log_checkpoints = on
log_connections = on
log_disconnections = on
log_lock_waits = on

# Performance
random_page_cost = 1.1
effective_io_concurrency = 200

# Autovacuum
autovacuum = on
autovacuum_max_workers = 3

Описание параметров

Подключения

Параметр Значение Описание
listen_addresses * Приём подключений на всех интерфейсах
port 5432 Порт PostgreSQL
max_connections 200 Максимальное количество одновременных подключений. Каждый микросервис использует пул из 20 подключений + 10 overflow

Память

Параметр Значение Описание
shared_buffers 256MB Общий буфер данных в памяти. Рекомендуется 25% RAM, выделенной PostgreSQL
effective_cache_size 1GB Оценка доступной памяти для кеширования дисковых операций
work_mem 16MB Память для операций сортировки и хеширования на один запрос
maintenance_work_mem 64MB Память для операций обслуживания (VACUUM, CREATE INDEX)

WAL (Write-Ahead Log)

Параметр Значение Описание
wal_level replica Уровень WAL для поддержки репликации
max_wal_size 1GB Максимальный размер WAL до принудительного checkpoint
min_wal_size 80MB Минимальный размер WAL

Логирование

Параметр Значение Описание
log_min_duration_statement 1000 Логирование запросов длительностью более 1 секунды
log_checkpoints on Логирование контрольных точек
log_connections on Логирование новых подключений
log_lock_waits on Логирование ожидания блокировок

Рекомендации для production (64+ ГБ RAM)

При наличии 64 ГБ и более оперативной памяти рекомендуется обновить параметры:

# Memory Settings (for 64 GB RAM)
shared_buffers = 4GB
effective_cache_size = 16GB
work_mem = 64MB
maintenance_work_mem = 512MB

# Connection Settings
max_connections = 400

# WAL
max_wal_size = 4GB
min_wal_size = 512MB

# Checkpoints
checkpoint_completion_target = 0.9

# Performance
random_page_cost = 1.1
effective_io_concurrency = 200
default_statistics_target = 200

Конфигурация Redis

Конфигурационный файл: compose/redis/redis.conf

Текущая конфигурация

# Network
bind 0.0.0.0
protected-mode no
port 6379

# General
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""

# Persistence — RDB snapshots
save 900 1       # Каждые 15 мин если >= 1 изменение
save 300 10      # Каждые 5 мин если >= 10 изменений
save 60 10000    # Каждую минуту если >= 10000 изменений
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data

# Append-only file (AOF)
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# Memory Management
maxmemory 512mb
maxmemory-policy allkeys-lru

# Lazy freeing
lazyfree-lazy-eviction yes
lazyfree-lazy-expire yes
lazyfree-lazy-server-del yes

# Limits
maxclients 10000

Описание параметров

Параметр Значение Описание
bind 0.0.0.0 Приём подключений на всех интерфейсах
protected-mode no Отключён для работы внутри Docker-сети
maxmemory 512mb Максимальный объём памяти
maxmemory-policy allkeys-lru Стратегия вытеснения: удалять самые давно используемые ключи
appendonly yes Включена запись AOF-журнала
appendfsync everysec Синхронизация AOF на диск каждую секунду

Распределение баз данных по сервисам

Redis использует нумерованные базы данных для изоляции данных микросервисов:

База данных Сервисы Назначение
DB 0 Model Management, Jailbreak Service Кеш моделей, статусы задач Jailbreak
DB 1 Scan Orchestrator, Auth Service Статусы сканирований, сессии авторизации
DB 2 ASR Adversarial, License Service Статусы задач ASR, кеш лицензий
DB 3 CV Adversarial Статусы задач CV

Для production

В production-среде рекомендуется:

  • Установить requirepass <ПАРОЛЬ> для авторизации.
  • Увеличить maxmemory до 2gb или более.
  • Включить protected-mode yes и ограничить bind конкретными интерфейсами.

Конфигурация NATS JetStream

Кластер из 3 узлов

NATS развёрнут в виде кластера из 3 узлов для обеспечения отказоустойчивости и репликации данных.

Узел Client port Monitoring port Cluster port IP-адрес
nats-1 4222 8222 6222 172.28.0.20
nats-2 4223 8223 6223 172.28.0.21
nats-3 4224 8224 6224 172.28.0.22

Конфигурация узла (nats-1.conf)

Каждый узел имеет идентичную структуру конфигурации (различается только server_name):

# NATS Server Configuration - Node 1
server_name: "nats-1"

# Network
host: 0.0.0.0
port: 4222

# HTTP Monitoring
http_port: 8222

# JetStream
jetstream {
  store_dir: "/data"
  max_memory_store: 1GB
  max_file_store: 10GB
}

# Cluster Configuration
cluster {
  name: appsec-genai-cluster
  listen: 0.0.0.0:6222
  routes: [
    nats://nats-1:6222
    nats://nats-2:6222
    nats://nats-3:6222
  ]
}

# Logging
debug: false
trace: false
logtime: true
log_file: "/data/nats-server.log"

# Limits
max_payload: 10MB
max_pending: 64MB
max_connections: 1000

Описание параметров JetStream

Параметр Значение Описание
store_dir /data Директория хранения данных JetStream
max_memory_store 1GB Максимальный объём данных в памяти
max_file_store 10GB Максимальный объём данных на диске
max_payload 10MB Максимальный размер одного сообщения
max_connections 1000 Максимальное количество клиентских подключений

Подключение микросервисов

Все микросервисы подключаются к первому узлу кластера с автоматическим failover:

NATS_URL=nats://nats-1:4222

При недоступности nats-1 клиент автоматически переключается на nats-2 или nats-3.


Конфигурация MinIO (S3)

Параметры

Параметр Значение Описание
API endpoint http://minio:9000 Внутренний адрес S3 API
Console http://localhost:9001 Веб-консоль администрирования
Region us-east-1 Регион (обязательный параметр для S3-совместимости)
Режим Single-node Однонодовый режим

Бакеты

При инициализации создаётся 10 бакетов:

Бакет Назначение Типичный размер
attack-artifacts Общие артефакты атак До 10 ГБ
scan-reports Отчёты по сканированию До 5 ГБ
model-artifacts Артефакты моделей До 1 ГБ
model-weights Веса моделей (VGG19, ResNet50, Whisper) До 5 ГБ
cv-images Изображения для CV-атак До 10 ГБ
cv-attack-artifacts Результаты CV-атак (adversarial images) До 50 ГБ
audio-samples Аудиофайлы для ASR-атак До 10 ГБ
asr-attack-artifacts Результаты ASR-атак (adversarial audio) До 50 ГБ
results-artifacts Артефакты результатов До 10 ГБ
jailbreak-reports Отчёты Jailbreak-сервиса До 5 ГБ

Политика доступа

По умолчанию все бакеты создаются с политикой public (анонимный доступ на чтение). Это упрощает разработку, но недопустимо в production.

Для production-среды измените политику бакетов:

# Подключение к MinIO
docker exec -it minio mc alias set local http://localhost:9000 minioadmin <ПАРОЛЬ>

# Установка приватной политики
docker exec -it minio mc anonymous set private local/model-weights
docker exec -it minio mc anonymous set private local/cv-images
# ... и так для каждого бакета

После этого доступ к файлам будет осуществляться только через presigned URLs, генерируемые сервисами.


Безопасность

Обязательные действия перед production

Контрольный список безопасности

  • Сменить все пароли в файле .env на надёжные (минимум 16 символов).
  • Настроить firewall — открыть только порты 8080 и 3000 для внешнего доступа.
  • Установить requirepass в конфигурации Redis.
  • Изменить политику бакетов MinIO с public на private.
  • Включить аутентификацию: AUTH_ENABLED=true в ui-gateway.
  • Настроить TLS-терминирование через обратный прокси (nginx/Envoy).

Рекомендации по TLS

Для production-среды рекомендуется настроить TLS-терминирование с помощью обратного прокси-сервера (nginx, Traefik, Envoy):

# Пример конфигурации nginx
server {
    listen 443 ssl http2;
    server_name genai.example.com;

    ssl_certificate     /etc/ssl/certs/genai.crt;
    ssl_certificate_key /etc/ssl/private/genai.key;
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;

    # UI
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # API Gateway
    location /api/ {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    # WebSocket
    location /ws {
        proxy_pass http://localhost:3000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Безопасность NATS

Для production-среды рекомендуется включить TLS и аутентификацию в NATS:

# В файле nats-X.conf
tls {
  cert_file: "/etc/nats/certs/server.crt"
  key_file:  "/etc/nats/certs/server.key"
  ca_file:   "/etc/nats/certs/ca.crt"
  verify: true
}

authorization {
  users = [
    { user: "service", password: "$2a$11$..." }
  ]
}

Безопасность API-ключей

API-ключи LLM-провайдеров

API-ключи для LLM-провайдеров (OpenAI, GigaChat и др.) задаются пользователями через веб-интерфейс при регистрации моделей. Эти ключи хранятся в зашифрованном виде в базе данных. Никогда не размещайте API-ключи в файле .env или конфигурационных файлах.