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

MinIO

MinIO — S3-совместимое объектное хранилище. Хранит артефакты атак, веса AI/ML-моделей, аудио- и изображения для тестирования.

Назначение

Используется для хранения всех бинарных объектов: отчёты, adversarial-изображения, adversarial-аудио, веса моделей, presigned URL для загрузки в браузере.

S3 Buckets

При первом запуске bootstrap создаёт 10 бакетов:

Бакет Назначение
attack-artifacts Общие артефакты атак
scan-reports Отчёты сканирований
model-artifacts Артефакты моделей
model-weights Веса моделей (VGG19, ResNet50, Whisper)
cv-images Исходные изображения для CV-атак
cv-attack-artifacts Adversarial-изображения
audio-samples Исходные аудиофайлы для ASR-атак
asr-attack-artifacts Adversarial-аудиофайлы
results-artifacts Артефакты результатов
jailbreak-reports Отчёты jailbreak-сервиса

Зависимости

Входящие (кто подключается)

Сервис Бакеты S3-библиотека Формат endpoint
jailbreak jailbreak-reports boto3/aiobotocore host:port (без схемы)
results results-artifacts, cv-attack-artifacts, cv-images, asr-attack-artifacts, audio-samples boto3 host:port
scan-profile audio-samples, cv-images minio-python host:port
model-mgmt model-weights boto3 host:port
asr asr-attack-artifacts, audio-samples, model-weights appsec_genai_shared http://host:port
cv cv-attack-artifacts, cv-images, model-weights minio-python host:port
orchestrator scan-reports boto3 host:port

Три формата endpoint

asr ожидает endpoint со схемой (http://minio:9000), cv и остальные — без схемы (minio:9000). Детали — на странице каждого сервиса.

Исходящие

Нет.

Values

Параметр По умолчанию Обязателен Описание
persistence.enabled false нет Включить PVC
persistence.size "200Gi" нет Размер (учитывайте веса моделей)
persistence.storageClass "" нет StorageClass
global.image.tag да Версия образа
global.imagePullSecrets[0].name да imagePullSecret

Пример values.yaml

# values-minio.yaml
persistence:
  enabled: true          # ОБЯЗАТЕЛЬНО для production
  size: "200Gi"          # с учётом весов моделей (~15 ГБ для Whisper + CV)
  storageClass: ""

global:
  image:
    registry: registry.appsec.global
    repositoryPrefix: appsecgenai-release
    tag: "<VERSION>"
  imagePullSecrets:
    - name: harbor-cr

Установка

helm upgrade --install minio \
  oci://registry.appsec.global/appsecgenai-release/charts/minio \
  --version <VERSION> -n genai --create-namespace \
  --wait \
  -f values-minio.yaml

После установки чарт создаёт Secret minio-auth с ключами MINIO_ROOT_USER и MINIO_ROOT_PASSWORD.

Внешний MinIO

Если MinIO уже развёрнут отдельно (не через этот чарт) — установите minio.enabled: false и укажите координаты в global.deps.minio.

Wizard (values.yaml)

minio:
  enabled: false          # не ставить in-cluster MinIO

global:
  deps:
    minio:
      host: minio.example.com
      port: 9000
      existingSecret: minio-auth   # Secret с MINIO_ROOT_USER / MINIO_ROOT_PASSWORD
      scheme: https                # https если MinIO за TLS (default: http)
      # bootstrap: true            # создать бакеты в существующем MinIO

bootstrap: идемпотентность

Бакеты создаются с --ignore-existing (409 Conflict = пропуск). Оставить bootstrap: true на каждый update — безопасно. При встроенном MinIO (minio.enabled: true) bootstrap не нужен — Helm hook Job создаёт бакеты автоматически.

Что делает scheme: https

Wizard проставляет S3_ENDPOINT_URL / S3_ENDPOINT с нужной схемой во все продуктовые сервисы. Для cv дополнительно выставляется S3_SECURE=true (minio-python клиент не поддерживает схему в endpoint).

Ручная установка (k8s-manual)

При ручной установке каждого сервиса через helm install укажите endpoint как строку в global.url.s3Endpoint:

# values-<service>.yaml
global:
  url:
    # Внешний MinIO через HTTPS — строковый формат (передаётся as-is)
    s3Endpoint: "https://minio.example.com:9000"

Формат endpoint зависит от сервиса

  • asr ожидает URL со схемой: https://minio.example.com:9000
  • cv ожидает без схемы: minio.example.com:9000 — и отдельно S3_SECURE: "true" в env:
  • jailbreak, results, orchestrator, model-mgmt, scan-profile ожидают без схемы + S3_SECURE: "true" в env:

Детали — на странице каждого сервиса.

Bootstrap бакетов

При установке через Wizard бакеты создаются автоматически. При ручной установке — создайте после старта MinIO.

Реальные бакеты из bootstrap кода:

Бакет Назначение
cv-images Исходные изображения для CV-атак
model-weights Веса моделей (VGG19, ResNet50, Whisper)
scan-artifacts Артефакты сканирований
scan-results Результаты сканирований
asr-artifacts Артефакты ASR-атак
jailbreak-artifacts Артефакты jailbreak-атак
cv-artifacts Adversarial-изображения
reports Отчёты
thumbnails Превью артефактов
temp Временные файлы
# Port-forward к MinIO
kubectl port-forward svc/minio 9000:9000 -n genai &
sleep 2

# Получить credentials
MC_USER=$(kubectl get secret minio-auth -n genai \
  -o jsonpath='{.data.MINIO_ROOT_USER}' | base64 -d)
MC_PASS=$(kubectl get secret minio-auth -n genai \
  -o jsonpath='{.data.MINIO_ROOT_PASSWORD}' | base64 -d)

# Настроить mc
mc alias set genai http://localhost:9000 "$MC_USER" "$MC_PASS"

# Создать бакеты (идемпотентно)
for BUCKET in cv-images model-weights scan-artifacts scan-results \
              asr-artifacts jailbreak-artifacts cv-artifacts \
              reports thumbnails temp; do
  mc mb genai/${BUCKET} 2>/dev/null && echo "✓ ${BUCKET}" || echo "→ ${BUCKET} already exists"
done

mc CLI

# macOS
brew install minio/stable/mc

# или через Docker
docker run --rm --network host --entrypoint mc \
  minio/mc alias set genai http://localhost:9000 admin password