Установка AppSec.Track в Kubernetes¶
Предварительные условия¶
Учетные данные в реестре контейнеров¶
Docker-образы компонентов AppSec.Track и Helm Chart находятся в нашем частном реестре, для доступа в который требуется авторизация.
Получение Helm Chart AppSec.Track¶
Для получения Helm Chart AppSec.Track необходимо добавить OCI-совместимый Helm приватный реестр (registry.appsec.global) с теми же учетными данными, что и для доступа к образам контейнеров.
-
Войдите в реестр (с ручным вводом пароля).
helm registry login -u myuser registry.appsec.global Password: Login succeeded -
Скачайте последнюю/конкретную версию AppSec.Track Helm Chart.
helm pull oci://registry.appsec.global/appsec-track/track-helm/appsec-track --version <version_number> --untar Pulled: registry.appsec.global/appsec-track/appsec-track-helm:<version_number> Digest: sha256:0be7ec9fb7b962b46d81e4bb74fdcdb7089d965d3baca9f85d64948b05b402ff
Сетевые доступы¶
Прежде чем приступить к установке, необходимо обеспечить следующие сетевые доступы:
-
к реестру образов;
-
к базе данных Track.Feed.
Предварительная конфигурация¶
Примечание
По умолчанию Helm Chart создает секрет на основе файла values.yaml.
-
Создайте новое пространство имен
appsec-track.2. Создайте ImagePullSecret.kubectl create namespace appsec-trackkubectl --namespace appsec-track create secret docker-registry appsec-track-registry-secret \ --docker-server="registry.appsec.global" \ --namespace appsec-track \ --docker-username="user@example.com" \ --docker-password="<Password>" \ --docker-email="user@example.com"Примечание
Если вы используете Helm Chart c уже заданным параметром
images.registry.ImagePullSecret.jsonconfig, секрет будет создан автоматически. -
Отключите автоматическое создание секрета Helm Chart.
values.yamlimageCredentials: create: false
Сервисная учетная запись¶
По умолчанию Helm Chart создаст сервисную учетную запись (Service Account, SA) с именем appsec-track-sa и будет разворачивать ресурсы с ее помощью.
Существует 3 сценария использования учетной записи:
-
Учетная запись
appsec-track-saпо умолчанию. В этом случае никаких дополнительных значений указывать не нужно. -
Учетная запись пользовательского имени — необходимо передать параметры
frontend.serviceAccount.nameиbackend.serviceAccount.name, содержащие желаемое имя. -
Использование существующей или императивно созданной учетной записи.
Например
Учетная запись может быть добавлена с помощью следующих команд:
# Создать учетную запись 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:
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:
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¶
-
Сконфигурируйте параметры под свою среду (
values.yaml), см. раздел «Параметры». -
Установите 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 | "registry.appsec.global/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.40MLine %-5.5L : %m %n","file":"%d{yyyy-MM-dd HH:mm:ss.SSS}%-5p --- [%17.17t]Class %-50.50C Method %-40.40MLine %-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 | "registry.appsec.global/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 | "registry.appsec.global" |
Реестр образов контейнеров 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" |