Установка AppSec.Track в Kubernetes¶
Предварительные условия¶
Учетные данные в реестре контейнеров¶
Docker-образы компонентов AppSec.Track и Helm Chart находятся в нашем частном реестре, для доступа в который требуется авторизация.
Получение Helm Chart AppSec.Track¶
Для получения Helm Chart AppSec.Track необходимо добавить OCI-совместимый Helm приватный реестр (docker.swordfishsecurity.com) с теми же учетными данными, что и для доступа к образам контейнеров.
-
Войдите в реестр (с ручным вводом пароля).
helm registry login -u myuser docker.swordfishsecurity.com Password: Login succeeded
-
Скачайте последнюю/конкретную версию 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.
-
Создайте новое пространство имен
appsec-track
.2. Создайте ImagePullSecret.kubectl create namespace appsec-track
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
, секрет будет создан автоматически. -
Отключите автоматическое создание секрета 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 | "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" |