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

Минимальный путь до работающего продукта (через Kubernetes / Helm)

В этой статье описан минимальный путь до работающего продукта AppSec.Track, при использовании Helm Chart для его развёртывания в Kubernetes (backend, frontend, PostgreSQL, Redis, scanner).

Путь включает три этапа:

  1. Развёртывание AppSec.Track.
  2. Подключение Track.Feed — база уязвимостей (обязательно).
  3. Интеграция с Nexus — Track.Plugin или OSA Firewall.

Требования

  • Kubernetes 1.24+.
  • Helm 3.8+ с поддержкой OCI.
  • kubectl, настроенный на целевой кластер.
  • Ingress Controller (например, nginx-ingress).
  • StorageClass для PersistentVolume PostgreSQL (при postgresql.enabled: true).
  • Учётные данные registry.appsec.global для helm registry login и pull образов (выдаются при получении лицензии).
  • Токен Track.Feed из комплекта поставки.
  • Сетевой доступ к https://feed.appsec.global.
  • Nexus Repository Manager (см. раздел «Этап 3. Интеграция с менеджером репозиториев»).

Этап 1. Развёртывание AppSec.Track

Шаг 1. Скачайте Helm Chart

export REGISTRY_USER="<login>"
export REGISTRY_PASS="<password>"
export VERSION="4.5.0"

helm registry login registry.appsec.global -u "${REGISTRY_USER}" -p "${REGISTRY_PASS}"

helm pull oci://registry.appsec.global/appsec-track/track-helm/appsec-track \
  --version "${VERSION}" --untar

Шаг 2. Подготовьте зависимости Chart

Chart использует subcharts PostgreSQL и Redis из Bitnami:

cd appsec-track
helm dependency update

Шаг 3. Создайте namespace

kubectl create namespace appsec-track

Шаг 4. Настройте values

Скопируйте файл values.yaml и отредактируйте под вашу среду:

cp values.yaml my-values.yaml
nano my-values.yaml

Минимально необходимые параметры:

Параметр Описание
images.registry.ImagePullSecret.jsonconfig Base64 от login:password для доступа к registry
ingress.hosts.host DNS-имя приложения
ingress.class_name IngressClass вашего кластера
backend.baseurl Публичный URL приложения (совпадает с ingress)
backend.image.tag Версия образа backend
frontend.image.tag Версия образа frontend
postgresql.auth.password Пароль пользователя БД
postgresql.auth.postgresPassword Пароль суперпользователя PostgreSQL
postgresql.primary.persistence.storageClass StorageClass кластера

Для nginx-ingress укажите аннотации — без них загрузка файлов и длительные операции могут завершаться ошибкой:

ingress:
  enabled: true
  class_name: nginx
  hosts:
    host: track.example.com
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 10240m
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "2400"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "2400"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "2400"
    nginx.ingress.kubernetes.io/proxy-buffer-size: 256k
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    nginx.ingress.kubernetes.io/proxy-buffers-number: "4"

Секрет для pull образов — base64 от строки login:password:

echo -n "${REGISTRY_USER}:${REGISTRY_PASS}" | base64

Пример фрагмента my-values.yaml:

images:
  registry:
    name: registry.appsec.global
    ImagePullSecret:
      create: true
      jsonconfig: "<base64-login-password>"

ingress:
  enabled: true
  class_name: nginx
  hosts:
    host: track.example.com
  annotations:
    nginx.ingress.kubernetes.io/proxy-body-size: 10240m
    nginx.ingress.kubernetes.io/proxy-connect-timeout: "2400"
    nginx.ingress.kubernetes.io/proxy-read-timeout: "2400"
    nginx.ingress.kubernetes.io/proxy-send-timeout: "2400"
    nginx.ingress.kubernetes.io/proxy-buffer-size: 256k
    nginx.ingress.kubernetes.io/proxy-buffering: "on"
    nginx.ingress.kubernetes.io/proxy-buffers-number: "4"

backend:
  baseurl: http://track.example.com
  image:
    tag: "4.5.0"

frontend:
  image:
    tag: "4.5.0"

postgresql:
  enabled: true
  auth:
    username: trackadm
    password: "<db-password>"
    postgresPassword: "<postgres-password>"
    database: appsec_track
  primary:
    persistence:
      storageClass: "<your-storage-class>"

Шаг 5. Установите Chart

helm upgrade --install appsec-track . \
  -f my-values.yaml \
  -n appsec-track \
  --create-namespace

Шаг 6. Дождитесь готовности подов

kubectl get pods -n appsec-track -w

Все поды должны перейти в состояние Running. Backend может стартовать дольше остальных — выполняются миграции Flyway.

kubectl logs -n appsec-track -l track.component=backend --tail=50

Шаг 7. Откройте приложение

Перейдите в браузере по адресу из ingress.hosts.host:

http://track.example.com

Учётная запись администратора создана по умолчанию:

Логин admin@localhost
Пароль admin

После первого входа смените пароль.

Этап 2. Подключение Track.Feed

Track.Feed — база данных уязвимостей. Без неё проверка компонентов и политики OSA работать не будут.

Шаг 8. Настройте сервис данных

  1. В AppSec.Track откройте НастройкиСостояние системыСервис данных.
  2. Заполните поля:

    Поле Значение
    Адрес https://feed.appsec.global
    Токен Токен из комплекта поставки
  3. Нажмите Проверить подключение — должно появиться сообщение об успехе.

  4. Нажмите Сохранить.

Резервный адрес (опционально): https://feed2.appsec.global.

Этап 3. Интеграция с менеджером репозиториев

Для полноценной работы OSA свяжите AppSec.Track с менеджером репозиториев (Nexus). Выполняйте шаги после подключения Track.Feed.

Доступны два варианта интеграции:

Вариант A:
Track.Plugin в Nexus
Вариант B:
OSA Firewall (Helm)
Суть Плагин внутри Nexus Прокси-шлюз перед менеджером репозиториев
Трафик разработчиков Напрямую в Nexus Через URL OSA Firewall (Nexus — upstream)
Когда выбирать Nexus/Artifactory без возможности поставить прокси Kubernetes, нужен единый шлюз без плагина в Nexus

Шаг 9. Создайте менеджер репозиториев в AppSec.Track

Общий шаг для обоих вариантов:

  1. Откройте приложение по адресу ingress и войдите под учётной записью администратора.
  2. Выберите РепозиторииДобавить.
  3. Укажите имя менеджера репозиториев и нажмите Создать.
  4. Выберите созданный менеджер → вкладка НастройкиТокенСгенерировать токен.
  5. Скопируйте и сохраните токен — он понадобится при настройке плагина или прокси.

Далее выберите вариант A или вариант B.


Вариант A: Track.Plugin в Nexus

Установка KAR-плагина непосредственно в Nexus Repository Manager.

Шаг A.1. Скачайте Track.Plugin

Используйте те же учётные данные registry.appsec.global. Выберите сборку под версию Nexus:

Версия Nexus Файл
3.20 – 3.69 nexus-osa-track-firewall-plugin-bundle-<version>.kar
3.70 – 3.77 nexus-osa-track-firewall-plugin-bundle-<version>-70.kar

Nexus 3.20 – 3.69:

export REGISTRY_USER="<login>"
export REGISTRY_PASS="<password>"
export VERSION="4.5.0"

curl -u "${REGISTRY_USER}:${REGISTRY_PASS}" -fLO \
  "https://registry.appsec.global/repository/appsec.track-maven-release/osa-track-firewall/nexus-osa-track-firewall-plugin-bundle/${VERSION}/nexus-osa-track-firewall-plugin-bundle-${VERSION}.kar"

Nexus 3.70 – 3.77:

export REGISTRY_USER="<login>"
export REGISTRY_PASS="<password>"
export VERSION="4.5.0"

curl -u "${REGISTRY_USER}:${REGISTRY_PASS}" -fLO \
  "https://registry.appsec.global/repository/appsec.track-maven-release/osa-track-firewall/nexus-osa-track-firewall-plugin-bundle/${VERSION}-70/nexus-osa-track-firewall-plugin-bundle-${VERSION}-70.kar"

Шаг A.2. Установите плагин в Nexus

# Nexus 3.20 – 3.69, установленный на хосте
sudo cp nexus-osa-track-firewall-plugin-bundle-${VERSION}.kar /opt/sonatype/nexus/deploy/

# Nexus 3.70 – 3.77, установленный на хосте
sudo cp nexus-osa-track-firewall-plugin-bundle-${VERSION}-70.kar /opt/sonatype/nexus/deploy/

Nexus подхватит плагин автоматически. Дождитесь перезапуска или выполните restart контейнера/сервиса Nexus при необходимости.

Шаг A.3. Настройте OSA Firewall Configuration

  1. В Nexus откройте SettingsSystemCapabilitiesCreate capability.
  2. Выберите OSA Firewall Configuration.
  3. Заполните параметры:

    Параметр Значение
    Track API endpoint http://track.example.com/api/ (URL из ingress)
    Track access token Токен из шага 9

    Рекомендуемые дополнительные параметры:

    Параметр Рекомендация
    Quarantine mode Включить — блокировка загрузки при нарушении политик
    Is fail on API errors По необходимости — блокировать загрузку при недоступности Track
    Do not validate SSL certificates Выключить в production
    Ignore proxy settings Включить, если Nexus обращается к Track напрямую, минуя прокси
    Delete quarantined components По необходимости — удалять заблокированные компоненты
  4. Нажмите Save.

Шаг A.4. Активируйте менеджер репозиториев в AppSec.Track

  1. Загрузите тестовый пакет через Nexus — репозиторий появится в AppSec.Track автоматически.
  2. В AppSec.Track откройте Репозитории и выберите созданный менеджер.
  3. На вкладке Настройки:

    • включите переключатель Активен;
    • в поле Статус новых репозиториев выберите Активен;
    • нажмите Сохранить.

Шаг A.5. Проверьте интеграцию

  1. Загрузите ещё один пакет через Nexus.
  2. В AppSec.Track откройте менеджер репозиториев → вкладка История запросов — запросы должны появиться в логе.

При блокировке компонента Nexus покажет страницу 403 Компонент заблокирован.


Вариант B: OSA Firewall (Helm)

OSA Firewall — альтернативная (не заменяющая) реализация интеграции с менеджером репозиториев. Прокси принимает запросы, при скачивании пакета обращается в AppSec.Track за вердиктом и проксирует трафик в upstream (Nexus, Artifactory или другой репозиторий). Плагин в Nexus устанавливать не нужно.

Как это работает:

  • По адресу https://<osa-firewall>/ отображается интерфейс upstream-менеджера (например, Nexus).
  • OSA-логика включается только при скачивании пакета — до этого момента трафик просто проксируется.
  • Настройки и кэш проверок хранятся в Redis.
  • Веб-интерфейс OSA Firewall: https://<osa-firewall>/osa-firewall-proxy/settings.

OSA Firewall не повторяет полностью функциональность Track.Plugin. Сканирование всего репозитория в текущей версии недоступно. Поддерживаются форматы: maven, npm, pypi, docker, apt, yum, raw, go и другие (полный список — в разделе «OSA Firewall»).

Шаг B.1. Скачайте Helm Chart

export REGISTRY_USER="<login>"
export REGISTRY_PASS="<password>"
export VERSION="4.5.0"

helm registry login registry.appsec.global -u "${REGISTRY_USER}" -p "${REGISTRY_PASS}"

helm pull oci://registry.appsec.global/appsec-track/osa-firewall-proxy-helm/osa-firewall-proxy \
  --version "${VERSION}" --untar

Шаг B.2. Подготовьте зависимости Chart

Chart использует subchart Redis из Bitnami (кэш проверок и настройки OSA Firewall):

cd osa-firewall-proxy
helm dependency update

Шаг B.3. Создайте namespace

kubectl create namespace osa-firewall-proxy

Шаг B.4. Настройте values

cp values.yaml my-proxy-values.yaml
nano my-proxy-values.yaml

Минимально необходимые параметры:

Параметр Описание
images.registry.ImagePullSecret.jsonconfig Base64 от login:password для registry
ingress.hosts.host DNS-имя прокси (его будут использовать клиенты)
ingress.class_name IngressClass кластера
osaFirewallProxy.repository.url URL Nexus/Artifactory (upstream). Можно задать позже в UI
osaFirewallProxy.track.apiUrl URL API AppSec.Track
osaFirewallProxy.track.apiToken Токен из шага 9
osaFirewallProxy.track.quarantine true — блокировка; false — только аудит
osaFirewallProxy.admin.username / password Логин/пароль веб-интерфейса OSA Firewall
osaFirewallProxy.image.tag Версия образа
redis.auth.password Пароль Redis (если redis.enabled: true)

Пример фрагмента my-proxy-values.yaml:

images:
  registry:
    name: registry.appsec.global
    ImagePullSecret:
      create: true
      jsonconfig: "<base64-login-password>"

ingress:
  enabled: true
  class_name: nginx
  hosts:
    host: nexus-proxy.example.com
  tls:
    enable: false

osaFirewallProxy:
  admin:
    username: admin
    password: "<change-me>"
  repository:
    url: "https://nexus.example.com"
  track:
    apiUrl: "http://track.example.com/api"
    apiToken: "<token-from-step-1>"
    quarantine: true
    failOnApiErrors: true
    insecureSsl: false
  image:
    tag: "4.5.0"

redis:
  auth:
    enabled: true
    password: "<redis-password>"

Для production рекомендуется внешний Redis:

redis:
  enabled: false
  external:
    host: redis.example.com
    port: 6379
    auth:
      enabled: true
      secretName: redis-secret
      createSecret: true
      password: "<redis-password>"

Шаг B.5. Установите Chart

helm upgrade --install osa-firewall-proxy . \
  -f my-proxy-values.yaml \
  -n osa-firewall-proxy \
  --create-namespace

Шаг B.6. Дождитесь готовности подов

kubectl get pods -n osa-firewall-proxy -w
kubectl logs -n osa-firewall-proxy -l app.kubernetes.io/name=osa-firewall-proxy --tail=50

Шаг B.7. Настройте OSA Firewall через веб-интерфейс

Откройте:

https://nexus-proxy.example.com/osa-firewall-proxy/settings

Учётные данные по умолчанию (если не меняли в values):

Логин admin
Пароль admin123

На вкладке Конфигурация Track API проверьте или задайте:

Параметр Описание
URL Track API Адрес API AppSec.Track
API токен Токен из шага 9
Режим карантина Блокировка при нарушении политик (quarantine)
Блокировать при ошибках API Блокировать загрузку при недоступности Track
Разрешить небезопасный SSL Отключить проверку TLS к Track (только для тестов)
URL менеджера репозиториев Базовый URL Nexus/Artifactory (upstream)

Нажмите Сохранить настройки. Статус подключения должен стать Connected.

Добавьте репозитории одним из способов:

  1. Импорт из менеджера — укажите URL Nexus в поле URL менеджера репозиториев и нажмите Импорт репозиториев.
  2. Вручную — на вкладке Репозитории укажите имя, URL и тип репозитория, нажмите Добавить.

Если repository.url не задан в values, при открытии корневого URL (https://nexus-proxy.example.com/) выполняется редирект на страницу настроек.

Шаг B.8. Настройте клиентов

Направьте запросы к артефактам через URL OSA Firewall:

# Было (напрямую в Nexus):
https://nexus.example.com/repository/maven-central/...

# Стало (через прокси):
https://nexus-proxy.example.com/repository/maven-central/...

В settings.xml, .npmrc, pip.conf, Docker registry и других клиентах замените базовый URL Nexus на URL OSA Firewall.

Интерфейс Nexus по-прежнему доступен через корневой URL OSA Firewall (https://nexus-proxy.example.com/), но скачивание пакетов проходит через проверку AppSec.Track.

Шаг B.9. Активируйте менеджер репозиториев в AppSec.Track

  1. Загрузите тестовый пакет через прокси — репозиторий появится в AppSec.Track автоматически.
  2. В AppSec.Track откройте Репозитории и выберите созданный менеджер.
  3. На вкладке Настройки:

    • включите переключатель Активен;
    • в поле Статус новых репозиториев выберите Активен;
    • нажмите Сохранить.

Шаг B.10. Проверьте интеграцию

  1. Загрузите пакет через OSA Firewall.
  2. В AppSec.Track откройте менеджер репозиториев → вкладка История запросов — запросы должны появиться в логе.
  3. В OSA Firewall откройте Статистика запросов — должны отображаться обработанные и заблокированные компоненты.

При блокировке компонента OSA Firewall вернёт страницу 403 Компонент заблокирован.

Самоподписанные сертификаты upstream

Если Nexus или upstream использует самоподписанные CA, добавьте сертификаты в values:

osaFirewallProxy:
  additionalCerts:
    - name: nexus-ca
      filename: nexus-ca.crt
      data: "<base64-cert>"