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

Установка AppSec.Track в Kubernetes

Предварительные условия

Учетные данные в реестре контейнеров

Docker-образы компонентов AppSec.Track и Helm Chart находятся в нашем частном реестре, для доступа в который требуется авторизация.

Получение Helm Chart AppSec.Track

Для получения Helm Chart AppSec.Track необходимо добавить OCI-совместимый Helm приватный реестр (docker.swordfishsecurity.com) с теми же учетными данными, что и для доступа к образам контейнеров.

  1. Войдите в реестр (с ручным вводом пароля).

    helm registry login -u myuser docker.swordfishsecurity.com
    Password:
    Login succeeded
    
  2. Скачайте последнюю/конкретную версию AppSec.Track Helm Chart.

    helm pull oci://docker.swordfishsecurity.com/appsec-track/track-helm/appsec-track --version 3.13.0 --untar
    Pulled: docker.swordfishsecurity.com/appsec-track/appsec-track-helm:3.13.0
    Digest: sha256:0be7ec9fb7b962b46d81e4bb74fdcdb7089d965d3baca9f85d64948b05b402ff
    

Сетевые доступы

Прежде чем приступить к установке, необходимо обеспечить следующие сетевые доступы:

  • к реестру образов;

  • к базе данных Track.Feed.

Предварительная конфигурация

Примечание

По умолчанию Helm Chart создает секрет на основе файла values.yaml.

  1. Создайте новое пространство имен appsec-track.

    kubectl create namespace appsec-track
    
    2. Создайте ImagePullSecret.

    kubectl --namespace appsec-track
        create secret docker-registry appsec-track-registry-secret \
            --docker-server="docker.swordfishsecurity.com" \
            --namespace appsec-track \
            --docker-username="user@example.com" \
            --docker-password="<Password>" \
            --docker-email="user@example.com"
    

    Примечание

    Если вы используете Helm Chart c уже заданным параметром images.registry.ImagePullSecret.jsonconfig, секрет будет создан автоматически.

  2. Отключите автоматическое создание секрета Helm Chart.

    values.yaml
    imageCredentials:
        create: false
    

Сервисная учетная запись

По умолчанию Helm Chart создаст сервисную учетную запись (Service Account, SA) с именем appsec-track-sa и будет разворачивать ресурсы с ее помощью.

Существует 3 сценария использования учетной записи:

  1. Учетная запись appsec-track-sa по умолчанию. В этом случае никаких дополнительных значений указывать не нужно.

  2. Учетная запись пользовательского имени — необходимо передать параметры frontend.serviceAccount.name и backend.serviceAccount.name, содержащие желаемое имя.

  3. Использование существующей или императивно созданной учетной записи.

    Например

    Учетная запись может быть добавлена с помощью следующих команд:

    # Создать учетную запись
    kubectl create serviceaccount appsec-track-custom-sa -n appsec-track
    # Сопоставление учетной записи с секретом извлечения образов
    kubectl patch serviceaccount appsec-track-custom-sa -n appsec-track -p '{"imagePullSecrets": [{"name": "appsec-track-registry-secret"}]}'
    

    В Helm Chart необходимо добавить следующие значения:

    • frontend.serviceAccount.create = false (не генерировать учетную запись);
    • frontend.serviceAccount.name = appsec-track-custom-sa;
    • backend.serviceAccount.create = false (не генерировать учетную запись);
    • backend.serviceAccount.name = appsec-track-custom-sa.

Persistence для track.backend контейнера для хранения SBOM

По умолчанию persistence включена: backend.persistence.enabled=true.

Для обеспечения совместного доступа для случаев, когда backend.replicaCount > 1 или backend.autoscaling.enabled=true, необходимо указать такой backend.persistence.storageClass, который может работать в режиме ReadWriteMany.

Для случаев, когда backend.replicaCount = 1 или backend.autoscaling.enabled=false, можно использовать любой backend.persistence.storageClass.

База данных PostgreSQL

Рекомендуется использовать высокодоступную базу данных PostgreSQL. По умолчанию Helm Chart разворачивает базу данных PostgreSQL и прикрепляет ее к постоянному хранилищу (Persistent Storage) для PoC-тестирования. Для производственного использования рекомендуется изменить это поведение и указать существующую базу данных PostgreSQL, задав следующие параметры в файле values.yaml:

values.yaml
postgresql:
  ## Установить false, если будет использована ваша PostgreSQL
  enabled: false
  ## Параметры аутентификации
  ...

  external:
    db:
      # -- Указание адреса существующей СУБД (если postgresql.enabled=false)
      dbHost: pg-postgresql
      # -- Указание порта существующей СУБД (если postgresql.enabled=false)
      dbPort: 5432

      auth:
        # -- Указание имя существующего секрета для подключения к БД (если postgresql.enabled=false)
        dbSecretName: appsec-track-db-creds
        # -- Создать секрет (dbSecretName) (`true`/`false`)
        dbSecretCreate: true
        # -- Указание имени Базы данных (если postgresql.enabled=false)
        dbName: appsectrack
        # -- Указание пользователя существующей БД (если postgresql.enabled=false)
        dbUser: appsec-track-user
        # -- Указание пароля пользователя в существующей БД (если postgresql.enabled=false)
        dbPassword: appsec-track-user-password

База данных Redis в качестве кэша запросов

Рекомендуется использовать высокодоступную базу данных Redis. По умолчанию Helm Chart разворачивает базу данных Redis для PoC-тестирования. Для производственного использования рекомендуется изменить это поведение и указать существующую базу данных Redis, задав следующие параметры в файле values.yaml:

values.yaml
redis:
  ## Использование Redis chart dependency.
  ## Установить false если будет использована ваш Redis.
  # -- Установить Redis (true/false)
  enabled: true
  ...
  ## -- Указать если используется ваш Redis
  # external:
  #   # -- Указание адреса существующего хоста redis (Если redis.enabled=false)
  #   host: redis-host
  #   # -- Указание порта существующего redis (Если redis.enabled=false)
  #   port: 6379

Установка с помощью Helm

  1. Сконфигурируйте параметры под свою среду (values.yaml), см. раздел «Параметры».

  2. Установите Helm Chart AppSec.Track.

    helm upgrade --install --create-namespace --namespace appsec-track <RELEASE_NAME> <PATH_TO_UNTAR_DOWLOADED_CHART>
    

Параметры

Параметры установки с помощью Helm приведены в таблице ниже.

Параметр Тип По умолчанию Описание
backend.baseurl string "http://track.example.com" Указать значение baseurl,
равное URL системы
backend.
container_securityContext
object {"allowPrivilegeEscalation":
false}
Security Context контейнера
backend.env.
timezone
string "Europe/Moscow" Указание TimeZone
backend.fullname string "appsec-track-backend" Имя контейнера Backend
backend.image.
name
string "docker.swordfishsecurity.com/
appsec-track/track-backend"
Полный путь к репозиторию
образа Backend
backend.image.
pullPolicy
string "Always" Политика вытягивания
образа Backend
backend.image.tag string "3.7.3" Тег версии образа
Backend
backend.ldaps object {"cert":null,
"createSecret":false,
"enabled":false,
"keystorepass":"password",
"secretName":"ldap"}
Включение LDAPS
backend.ldaps.
cert
string nil Сертификат для LDAPS,
закодированный в base64
backend.ldaps.
enabled
bool false По умолчанию выключен
backend.ldaps.
keystorepass
string "password" Пароль для Java keystore
backend.
livenessProbe
object {"enabled":true,
"failureThreshold":3,
"httpGet":
{"path":"/actuator/health/liveness"},
"initialDelaySeconds":120,
"periodSeconds":30,
"successThreshold":1,
"timeoutSeconds":1}
LivenessProbe и
ReadinessProbe,
если не нужны,
то изменить на "false"
backend.logging object {"level":{"root":"info"},
"pattern":{"console":
"%d{yyyy-MM-dd HH:mm:ss.SSS}
%-5p --- [%17.17t]
Class %-50.50C Method %-40.40M
Line %-5.5L : %m %n",
"file":"%d{yyyy-MM-dd HH:mm:ss.SSS}
%-5p --- [%17.17t]
Class %-50.50C Method %-40.40M
Line %-5.5L : %m %n",
"level":"%-5p",
"org":{"flywaydb":{"core":{"internal":
{"command":{"DbMigrate":"INFO"}}}}}}}
Общий уровень
логирования классов
backend.nodeSelector object {} nodeSelector для
компонента Backend
backend.readinessProbe.
enabled
bool true
backend.readinessProbe.
failureThreshold
int 3
backend.readinessProbe.
httpGet.path
string "/actuator/health/readiness"
backend.readinessProbe.
initialDelaySeconds
int 60
backend.readinessProbe.
periodSeconds
int 30
backend.readinessProbe.
successThreshold
int 1
backend.readinessProbe.
timeoutSeconds
int 1
backend.replicaCount int 1 Количество реплик
компонента Backend
backend.resources object {} Запросы и Лимиты для
контейнера Backend
backend.securityContext object {"fsGroup":2000,
"runAsGroup":2000,
"runAsNonRoot":true,
"runAsUser":2000}
Security Context
деплоймента
backend.service.
annotations
object {} Аннотации к объекту
Service Backend
backend.service.
enableIp
bool false IP aдрес LoadBalancer
для сервиса (если
backend.service.type=
LoadBalancer)
backend.service.
externalTrafficPolicy
string "Local"
backend.service.
loadBalancerIP
string nil
backend.service.port int 8080 Порт для Service
backend.service.
targetPort
int 8080 Порт контейнера,
на который ссылается Service
backend.service.
targetPortTls
int 8443 Порт контейнера, на который ссылается Service,
если tls.enabled: true.
Не менять
backend.service.type string "ClusterIP" Тип Service
(ClusterIP/LoadBalancer/
NodePort)
backend.serviceAccount.
annotations
object {} Аннотации к объекту
ServiceAccount
backend.serviceAccount.
automountService
AccountToken
bool false Монтировать учетные данные API
для Сервисного аккаунта
(true/false)
backend.serviceAccount.
create
bool true Создать Service Account
(true/false)
backend.serviceAccount.
name
string "track-back-sa" Имя ServiceAccount.
Если не установлено имя и
serviceAccount.create=true,
то оно сгенерируется
с использованием fullname template
backend.strategy object {"type":"Recreate"} Стратегия развертывания
новых pod'ов
frontend.
container_securityContext
object {"allowPrivilegeEscalation":
false}
Securtiy Context
Контейнера
frontend.env.timezone string "Europe/Moscow" Указание TimeZone
frontend.fullname string "appsec-track-frontend" Имя контейнера Frontend
frontend.image.name string "docker.swordfishsecurity.com/
appsec-track/track-frontend"
Полный путь к репозиторию
образа Frontend
frontend.image.
pullPolicy
string "Always" Политика вытягивания
образа Frontend
frontend.image.tag string "3.7.0" Тег версии образа Frontend
frontend.livenessProbe object {"enabled":true,
"failureThreshold":3,
"httpGet":{"path":"/","port":8080},
"initialDelaySeconds":60,
"periodSeconds":30,
"successThreshold":1,
"timeoutSeconds":1}
LivenessProbe и ReadinessProbe,
если не нужны, то изменить на "false"
frontend.nodeSelector object {} nodeSelector для
компонента Frontend
frontend.readinessProbe.
enabled
bool true
frontend.readinessProbe.
failureThreshold
int 3
frontend.readinessProbe.
httpGet.path
string "/"
frontend.readinessProbe.
httpGet.port
int 8080
frontend.readinessProbe.
initialDelaySeconds
int 30
frontend.readinessProbe.
periodSeconds
int 30
frontend.readinessProbe.
successThreshold
int 1
frontend.readinessProbe.
timeoutSeconds
int 1
frontend.replicaCount int 1 Количество реплик
компонента Frontend
frontend.resources object {} Запросы и Лимиты
для контейнера Frontend
frontend.
securityContext
object {"runAsNonRoot":true} Security Context деплоймента
frontend.
service.annotations
object {} Аннотации к объекту
Service Frontend
frontend.service.
enableIp
bool false IP aдрес LoadBalancer
для сервиса (если
frontend.service.type=
LoadBalancer)
frontend.service.
externalTrafficPolicy
string "Local"
frontend.service.
loadBalancerIP
string nil
frontend.service.port int 8080 Порт для Service
frontend.service.
targetPort
int 8080 Порт контейнера,
на который ссылается Service
frontend.service.type string "ClusterIP" Тип Service
(ClusterIP/LoadBalancer/
NodePort)
frontend.serviceAccount.
annotations
object {} Аннотации к объекту
ServiceAccount
frontend.serviceAccount.
automountService
AccountToken
bool false Монтировать учетные данные API
для Сервисного аккаунта
(true/false)
frontend.serviceAccount.
create
bool true Создать Service Account
(true/false)
frontend.serviceAccount.
name
string "track-front-sa" Имя ServiceAccount.
Если не установлено имя и
serviceAccount.create=true,
то оно сгенерируется
с использованием fullname template
frontend.strategy object {"type":"Recreate"} Стратегия развертывания
новых pod'ов
global.
networkPolicyGenerate
bool false Генерация сетевых политик
по умолчанию (true/false)
images.registry.
ImagePullSecret.create
bool true Создать ImagePullSecret
(true/false)
images.registry.
ImagePullSecret.
jsonconfig
string nil json_key или "user:password",
закодированные в base64
для досупа в реестр
(если create = true)
images.registry.
ImagePullSecret.name
string "appsec-track-registry-secret" Имя ImagePullSecret'а
images.registry.name string "docker.swordfishsecurity.com" Реестр образов
контейнеров AppSec Track
ingress.annotations object {} Аннотации к объекту Ingress
ingress.class_name string "nginx-internal" Указание Ingress Class
ingress.enabled bool true Создать Ingress (true/false)
ingress.hosts object {"host":"track.example.com",
"pathUI":"/"}
Ingress hosts
ingress.name string "appsec-track-ingress" Название Ingress
ingress.ssl.create bool false Создать секрет с
SSL-сертификатами (true/false)
ingress.ssl.enable bool false Использовать SSL (true/false)
ingress.ssl.tls.crt string nil Сертфикат,
закодированный в Base64
ingress.ssl.tls.key string nil Ключ сертифката,
закодированный в Base64
ingress.tls object {"hosts":"track.example.com",
"secretName":"ast-tls-certs"}
Ingress TLS
ingress.tls.hosts string "track.example.com" Указать домен AppSec Track
ingress.tls.secretName string "ast-tls-certs" Имя существующего
секрета TLS
postgresql.auth.
database
string "appsec-track"
postgresql.auth.
existingSecret
string nil Имя существующего секрета,
содержащего пароль postgres
postgresql.auth.
password
string "password"
postgresql.auth.
username
string "username"
postgresql.enabled bool true Установить PostgreSQL
(true/false)
postgresql.external.
db.auth.dbName
string "appsectrack" Указание имени Базы данных
(если postgresql.enabled=false)
postgresql.external.
db.auth.dbPassword
string "appsec-track-user-password" Указание пароля пользователя
в сущестующей БД
(если postgresql.enabled=false)
postgresql.external.
db.auth.dbSecretCreate
bool true Создать секрет (dbSecretName)
(true/false)
postgresql.external.
db.auth.dbSecretName
string "appsec-track-db-creds" Указание имени существующего
секрета для подключения к БД
(если postgresql.enabled=false)
postgresql.external.
db.auth.dbUser
string "appsec-track-user" Указание пользователя сущестующей БД
(если postgresql.enabled=false)
postgresql.external.
db.dbHost
string "pg-postgresql" Указание адреса существующей СУБД
(если postgresql.enabled=false)
postgresql.external.
db.dbPort
int 5432 Указание порта существующей СУБД
(если postgresql.enabled=false)
postgresql.primary.
initContainers[0].
command[0]
string "sysctl"
postgresql.primary.
initContainers[0].
command[1]
string "-w"
postgresql.primary.
initContainers[0].
command[2]
string "net.core.somaxconn=1024"
postgresql.primary.
initContainers[0].
image
string "busybox"
postgresql.primary.
initContainers[0].
imagePullPolicy
string "IfNotPresent"
postgresql.primary.
initContainers[0].
name
string "init-sysctl"
postgresql.primary.
initContainers[0].
securityContext.
privileged
bool true
postgresql.primary.
persistence.
enabled
bool true
postgresql.primary.
persistence.
storageClass
string "yc-network-ssd"
postgresql.primary.
resources
object {}
redis.architecture string "standalone"
redis.auth.enabled bool false
redis.auth.sentinel bool false
redis.enabled bool true Установить Redis (true/false)
redis.master.
configuration
string "maxmemory 20mb
\nmaxmemory-policy allkeys-lru \n"
redis.master.service.
ports.redis
int 6379
tls.createSecret bool false
tls.crt string "ZGVmYXVsdAo=" Сертфикат и ключ,
закодированныe в Base64
tls.enabled bool false
tls.ingress.annotations.
"nginx.ingress.
kubernetes.io/
backend-protocol"
string "HTTPS"
tls.ingress.annotations.
"nginx.ingress.
kubernetes.io/
ssl-passthrough"
string "true"
tls.key string "ZGVmYXVsdAo="
tls.keystorepass object {"jks":"passwordjks",
"pksc":"passwordpksc"}
Пароли для двух Java keystore
tls.secretName string "mtls"