Минимальный путь до работающего продукта (через Kubernetes / Helm)¶
В этой статье описан минимальный путь до работающего продукта AppSec.Track, при использовании Helm Chart для его развёртывания в Kubernetes (backend, frontend, PostgreSQL, Redis, scanner).
Путь включает три этапа:
- Развёртывание AppSec.Track.
- Подключение Track.Feed — база уязвимостей (обязательно).
- Интеграция с 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. Настройте сервис данных¶
- В AppSec.Track откройте Настройки → Состояние системы → Сервис данных.
-
Заполните поля:
Поле Значение Адрес https://feed.appsec.globalТокен Токен из комплекта поставки -
Нажмите Проверить подключение — должно появиться сообщение об успехе.
- Нажмите Сохранить.
Резервный адрес (опционально): 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¶
Общий шаг для обоих вариантов:
- Откройте приложение по адресу ingress и войдите под учётной записью администратора.
- Выберите Репозитории → Добавить.
- Укажите имя менеджера репозиториев и нажмите Создать.
- Выберите созданный менеджер → вкладка Настройки → Токен → Сгенерировать токен.
- Скопируйте и сохраните токен — он понадобится при настройке плагина или прокси.
Далее выберите вариант 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¶
- В Nexus откройте Settings → System → Capabilities → Create capability.
- Выберите OSA Firewall Configuration.
-
Заполните параметры:
Параметр Значение 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 По необходимости — удалять заблокированные компоненты -
Нажмите Save.
Шаг A.4. Активируйте менеджер репозиториев в AppSec.Track¶
- Загрузите тестовый пакет через Nexus — репозиторий появится в AppSec.Track автоматически.
- В AppSec.Track откройте Репозитории и выберите созданный менеджер.
-
На вкладке Настройки:
- включите переключатель Активен;
- в поле Статус новых репозиториев выберите Активен;
- нажмите Сохранить.
Шаг A.5. Проверьте интеграцию¶
- Загрузите ещё один пакет через Nexus.
- В 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.
Добавьте репозитории одним из способов:
- Импорт из менеджера — укажите URL Nexus в поле URL менеджера репозиториев и нажмите Импорт репозиториев.
- Вручную — на вкладке Репозитории укажите имя, 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¶
- Загрузите тестовый пакет через прокси — репозиторий появится в AppSec.Track автоматически.
- В AppSec.Track откройте Репозитории и выберите созданный менеджер.
-
На вкладке Настройки:
- включите переключатель Активен;
- в поле Статус новых репозиториев выберите Активен;
- нажмите Сохранить.
Шаг B.10. Проверьте интеграцию¶
- Загрузите пакет через OSA Firewall.
- В AppSec.Track откройте менеджер репозиториев → вкладка История запросов — запросы должны появиться в логе.
- В OSA Firewall откройте Статистика запросов — должны отображаться обработанные и заблокированные компоненты.
При блокировке компонента OSA Firewall вернёт страницу 403 Компонент заблокирован.
Самоподписанные сертификаты upstream¶
Если Nexus или upstream использует самоподписанные CA, добавьте сертификаты в values:
osaFirewallProxy:
additionalCerts:
- name: nexus-ca
filename: nexus-ca.crt
data: "<base64-cert>"