Установка, запуск и резервное копирование
Требования к инфраструктуре
Установленные для эксплуатации AppSec.Hub технические средства должны быть совместимы между собой и поддерживать сетевой протокол TCP/IP.
Рекомендуемые технические характеристики серверного оборудования:
- Процессор: 4×CPU 2 ГГц.
- Оперативная память: 16 Гб.
- Свободное дисковое пространство: 150 Гб для размещения прикладных систем и баз данных AppSec.Hub.
Поддерживаются следующие операционные системы.
Операционная система | Архитектура | Платформа |
---|---|---|
Linux | 64-bit | Ubuntu Server 18.04.6 x64 и выше |
Linux | 64-bit | CentOS/RHEL 7 и выше |
Для установки системы необходимо предварительно установить из стандартных репозиториев Docker и Docker-compose.
Пакет | Версия |
---|---|
Docker | 19.03.0 и выше |
Docker-compose | 1.27.0 и выше |
Установка Docker и Docker-compose
Предлагаются следующие способы установки Docker и Docker-compose:
Ubuntu/CentOS/RHEL (root Docker)
-
Обновите на сервере пакеты окружения и выполните подготовительные операции.
sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
-
Установите последнюю версию Docker.
-
Запустите Docker.
sudo systemctl start docker
-
Убедитесь, что Docker успешно запущен.
sudo systemctl status docker
В командной строке должно отобразиться:
Active: active (running)
. -
Для запуска Docker после перезагрузки сервера используйте следующую команду.
sudo systemctl enable docker
-
Проверьте версию Docker.
sudo docker --version
-
Установите Docker-compose версии 2.2.3.
export VERSION="v2.2.3" # выпущена до 2022.02.24 (6 января 2022) export DESTINATION=/usr/local/bin/docker-compose sudo curl -L https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m) -o $DESTINATION sudo chmod 755 $DESTINATION
Или более свежую.
sudo curl -SL https://github.com/docker/compose/releases/download/v2.19.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
-
Проверьте версию Docker-compose.
sudo /usr/local/bin/docker-compose --version
Ubuntu/CentOS/RHEL (rootless Docker)
-
Обновите на сервере пакеты окружения.
-
Установите последнюю версию Docker.
curl -fsSL https://get.docker.com/ | sudo sh
-
Выполните подготовку для установки rootless Docker.
sudo apt install -y uidmap sudo sh -eux <<EOF echo "$USER:100000:65536" >> /etc/subuid echo "$USER:100000:65536" >> /etc/subgid EOF
-
Установите rootless Docker.
dockerd-rootless-setuptool.sh install
-
Проверьте версию Docker.
docker --version
-
Установите Docker-compose.
export VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*\d') export DESTINATION=/usr/local/bin/docker-compose sudo curl -L https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m) -o $DESTINATION sudo chmod 755 $DESTINATION
-
Проверьте версию Docker-compose.
/usr/local/bin/docker-compose --version
Настройка локального firewall
Если БД устанавливается отдельно от AppSec.Hub, на инстансе с БД откройте порт 5432
(PostgreSQL).
Установка AppSec.Hub с помощью Docker
Установка AppSec.Hub (root/rootless)
-
Создайте папки.
sudo mkdir -p /opt/apphub/config/hub-core sudo mkdir -p /opt/apphub/config/hub-ui sudo mkdir -p /opt/apphub/config/postgresql sudo mkdir -p /opt/apphub/config/consul sudo mkdir -p /opt/apphub/logs/hub-air sudo mkdir -p /opt/apphub/logs/hub-core sudo mkdir -p /opt/apphub/logs/hub-ui sudo mkdir -p /opt/apphub/ml/local sudo mkdir -p /opt/apphub/logs/postgresql sudo mkdir -p /opt/apphub/postgresql/data sudo mkdir -p /opt/apphub/ssl sudo mkdir -p /opt/apphub/consul-data sudo mkdir -p /opt/apphub/zapfiles sudo mkdir -p /opt/apphub/db-data/ sudo mkdir -p /opt/apphub/docker/pythonpath_dev
-
Создайте конфигурационные файлы.
/opt/apphub/.env /opt/apphub/docker-compose.yml /opt/apphub/config/hub-core/app.properties /opt/apphub/config/hub-core/auth.properties /opt/apphub/config/hub-ui/hub.conf /opt/apphub/config/postgresql/postgresql.conf /opt/apphub/config/consul/server.json /opt/apphub/docker/docker-bootstrap.sh /opt/apphub/docker/docker-init.sh /opt/apphub/docker/.env /opt/apphub/docker/pythonpath_dev/superset_config.py
Примеры конфигурационных файлов приведены в следующих приложениях.
Примечание
При rootless-установке в файле docker-compose.yml необходимо заменить строку
user: "root"
на строкуuser: "superset"
в секцияхmetrics
иmetrics-init
. -
Выполните настройку конфигурационного файла /opt/apphub/.env. Укажите следующие параметры:
pgsql_admin_password
— пароль пользователя с административным доступом к основной схеме БД;hub_app_password
— пароль пользователя БД для работы AppSec.Hub;hub_auth_password
— пароль пользователя для сервиса аутентификации AppSec.Hub;hub_adm_password
— пароль пользователя с правами администратора на БД AppSec.Hub;-
hub_bi_password
— пароль пользователя с правами работы с AppSec.Hub DWH; -
MODEL_SECRET_KEY
— ключ шифрования моделей AVC;Примечание
Ключ шифрования моделей AVC необходимо получить у сотрудников компании Swordfish Security.
-
gateway_jwt_token
— ключ подписи jwt-токена для сервиса gateway; -
CONSUL_TOKEN
— токен для доступа к сервису consul.Примечание
Для генерации токена необходимо выполнить следующие команды и скопировать значение
SecretID
в переменнуюCONSUL_TOKEN
в .env-файле: -
SSO_ENC_KEY
— ключ шифрования SSO; -
HUB_URL
— URL AppSec.Hub, например, https://hub.your.domain.local; metrics_pg_password
— пароль пользователя с административным доступом БД метрик;metrics_db_password
— пароль пользователя БД;metrics_password
— пароль пользователя метрик;metrics_scheduler_db_password
— пароль пользователя scheduler БД метрик;RABBITMQ_HOST
- этот параметр зависит оттого, как установленhub-engine
- он может быть установлен либо на одном хосте с AppSec.Hub, либо на разных;RABBITMQ_PASSWORD
— пароль пользователя RabbitMQ;CONSUL_HOST
- этот параметр зависит оттого, как установленhub-engine
- он может быть установлен либо на одном хосте с AppSec.Hub, либо на разных;GRPC_ADDRESS
- адресhub-pipeline-agent
- этот параметр зависит оттого, как установленhub-engine
- он может быть установлен либо на одном хосте с AppSec.Hub, либо на разных;ENC_KEY
— ключ шифрования. Значение должно совпадать со значением параметраencrypt.key
в файле /opt/apphub/config/hub-core/app.properties, см. шаг 5.
-
Выполните настройку конфигурационного файла /opt/apphub/config/hub-ui/hub.conf. В «Приложении 13. Конфигурационный файл hub.conf» приведен пример конфигурации для HTTPS-соединения, если планируется использовать HTTP, удалите из файла следующий раздел.
listen 4443 ssl; ssl_certificate /etc/ssl/certs/ssl-cert/fullchain1.pem; ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey1.pem; if ($scheme != "https") { return 301 https://$host$request_uri; }
Укажите параметр
server_name
— доменное имя сервера/сервиса, на котором будет развернут AppSec.Hub. -
Выполните настройку конфигурационного файла /opt/apphub/config/hub-core/app.properties.
-
db.hub.url
иdb.presentation.url
— замените значения<pgsql_url>
,<pgsql_port>
и<hub_db_name>
на значения соответствующих переменных из файла .env; -
db.hub.password
иdb.presentation.password
— замените<hub_app_password>
на значение соответствующей переменной из файла .env; -
encrypt.key
— замените<HUBAPP-ENC-KEY>
на значение ключа шифрования паролей, используемых для доступа к инструментам ИБ. Размер ключа — 24 символа. -
hub.app.url
— замените на URL, который будет использоваться для доступа к AppSec.Hub. -
hub.consul.token
— замените значение параметра на токен для сервиса consul, см. пункт 3.
-
-
Выполните настройку конфигурационного файла /opt/apphub/config/hub-core/auth.properties.
-
db.auth.url
— замените значения<pgsql_url>
,<pgsql_port>
и<hub_db_name>
на значения соответствующих переменных из файла .env. -
db.auth.password
— замените<hub_auth_password>
на значение переменнойhub_auth_password
из файла .env. -
jwt.token.signing.key
— замените<HUBAPP-SIGN-KEY>
на значение, полученное в результате выполнения следующей команды.
-
-
Выполните настройку конфигурационного файла /opt/apphub/docker/docker-init.sh, см. «Приложение 19. Конфигурационный файл metrics docker-init.sh». В скрипте инициализации базы данных metrics, в секции, определяющей администратора БД metrics:
superset fab create-admin \ --username admin \ --firstname Superset \ --lastname Admin \ --email admin@superset.com \
укажите следующие параметры:
--username
— логин пользователя с правами администратора БД metrics;--firstname
— имя пользователя с правами администратора БД metrics;--lastname
— фамилия пользователя с правами администратора БД metrics;--email
— электронная почта пользователя с правами администратора БД metrics.
-
Выполните настройку конфигурационного файла /opt/apphub/docker/.env, см. «Приложение 20. Конфигурационный файл metrics .env». Укажите следующие параметры:
DATABASE_PASSWORD
,POSTGRES_PASSWORD
— пароль пользователя с административным доступом к основной схеме БДmetrics
, пароли должны совпадать сmetrics_pg_password
;ADMIN_PASSWORD
— пароль пользователя администратораmetrics
, по умолчанию будет иметь значениеadmin
;SUPERSET_SECRET_KEY
— установите для этого параметра значение, полученное в результате выполнения следующей команды:openssl rand -base64 42
.
-
Для добавления возможности использования внутренних агентов сканирований на одном хосте или на разных хостах с AppSec.Hub, выполните шаги, описанные в разделах:
-
Если в качестве доверенных необходимо добавить самоподписанные сертификаты, см. раздел «Добавление самоподписанных сертификатов в качестве доверенных».
-
Назначьте группу и владельца локальных папок.
sudo chown 2000:2000 -R /opt/apphub/config/hub-core sudo chown 101:101 -R /opt/apphub/config/hub-ui sudo chown 70:70 -R /opt/apphub/config/postgresql sudo chown 2000:2000 -R /opt/apphub/logs/hub-air sudo chown 2000:2000 -R /opt/apphub/logs/hub-core sudo chown 101:101 -R /opt/apphub/logs/hub-ui sudo chown 2000:2000 -R /opt/apphub/ml/local sudo chown 70:70 -R /opt/apphub/logs/postgresql sudo chown 70:70 -R /opt/apphub/postgresql/data sudo chown 101:101 -R /opt/apphub/ssl sudo chown 100:1000 -R /opt/apphub/consul-data sudo chown 100:1000 -R /opt/apphub/config/consul sudo chown 2000:2000 -R /opt/apphub/zapfiles sudo chown 70:70 -R /opt/apphub/db-data sudo chown 100:1000 -R /opt/apphub/docker/ sudo chmod u+x /opt/apphub/docker/docker-bootstrap.sh sudo chmod u+x /opt/apphub/docker/docker-init.sh
export REMAP_UID=$(cat /etc/subuid | grep -i $USER | awk -F : '{print $2}') export UID_2000=$((${REMAP_UID}+1999)) export UID_101=$((${REMAP_UID}+100)) export UID_70=$((${REMAP_UID}+69)) export UID_100=$((${REMAP_UID}+99)) export UID_1000=$((${REMAP_UID}+999)) sudo chown ${UID_2000}:${UID_2000} -R /opt/apphub/config/hub-core sudo chown ${UID_101}:${UID_101} -R /opt/apphub/config/hub-ui sudo chown ${UID_70}:${UID_70} -R /opt/apphub/config/postgresql sudo chown ${UID_2000}:${UID_2000} -R /opt/apphub/logs/hub-air sudo chown ${UID_2000}:${UID_2000} -R /opt/apphub/logs/hub-core sudo chown ${UID_101}:${UID_101} -R /opt/apphub/logs/hub-ui sudo chown ${UID_2000}:${UID_2000} -R /opt/apphub/ml/local sudo chown ${UID_70}:${UID_70} -R /opt/apphub/logs/postgresql sudo chown ${UID_70}:${UID_70} -R /opt/apphub/postgresql/data sudo chown ${UID_101}:${UID_101} -R /opt/apphub/ssl sudo chown ${UID_100}:${UID_1000} -R /opt/apphub/consul-data sudo chown ${UID_100}:${UID_1000} -R /opt/apphub/config/consul sudo chown ${UID_2000}:${UID_2000} -R /opt/apphub/zapfiles sudo chown ${UID_70}:${UID_70} -R /opt/apphub/db-data sudo chown ${UID_1000}:${UID_1000} -R /opt/apphub/docker/ sudo chmod u+x /opt/apphub/docker/docker-bootstrap.sh sudo chmod u+x /opt/apphub/docker/docker-init.sh
Установите разрешение на прослушивание привилегированных портов от непривилегированного пользователя.
Установка AppSec.Hub с использованием Kubernetes Helm 3
Для получения Helm-чарт AppSec.Hub необходимо добавить OCI-совместимый Helm приватный реестр (registry.appsec.global) с теми же учетными данными, что и для доступа к образам контейнеров.
-
Войдите в реестр (с ручным вводом пароля).
helm registry login -u myuser registry.appsec.global Password: Login succeeded
-
Скачайте последнюю/конкретную версию AppSec.Hub Helm-чарт.
helm pull oci://registry.appsec.global/appsechub/hub-helm/appsechub --version 0.2.7
-
Сконфигурируйте параметры в файле values.yaml.
Внимание!
При обновлении продукта через Helm, пожалуйста, обратите внимание, что структура файла values.yaml существенно изменилась.
Убедитесь, что все настройки из текущего values.yaml перенесены в новый файл корректно.
3.1. Скачайте новый файл values.yaml, соответствующий обновленной версии продукта.
3.2. Настройте параметры файла values.yaml в соответствии с требованиями вашей среды.
Сконфигурируйте следующие разделы и модули:
3.3. images.registry:
Для доступа к приватному реестру образов вам понадобится секрет (
ImagePullSecret
), который хранит учетные данные для аутентификации.create
- определяет создание секрета:true
: секрет будет создан.false
: необходимо вручную указать существующий секрет в параметреname
. Укажите имя существующего секрета Kubernetes, если вы хотите использовать его для аутентификации.
username
иpassword
- если вы хотите создать секрет, укажите значения дляusername
иpassword
.
Пример модуля
3.4. hub-air:
- Укажите настройки шифрования моделей AVC через секцию
env
, дляMODEL_USE_ENCRYPTION
установите значение1
,MODEL_SECRET_KEY
- ключ шифрования моделей AVC - необходимо получить у сотрудников компании - поставщика AppSec.Hub. - При необходимости настройте запросы и лимиты ресурсов.
3.5. hubdbmigration:
- Задайте необходимые пароли:
PGPASSWORD
— пароль пользователя с административным доступом к основной схеме БД.hubadmPassword
— пароль пользователя с правами администратора на БД AppSec.Hub.hubappPassword
— пароль пользователя БД для работы AppSec.Hub.hubauthPassword
— пароль пользователя для сервиса аутентификации AppSec.Hub.hubbiPassword
— пароль пользователя с правами работы с AppSec.Hub DWH.
3.6. hub-core:
- Укажите необходимые параметры
app_properties
:db_hub_password
- пароль пользователя с доступом к основной схеме БД, должен соответствовать паролюhubapp
секцииhubdbmigration
.encrypt_key
- ключ шифрования паролей, используемых для доступа к инструментам ИБ. Размер ключа — 24 символа (для генерации ключа можно использовать следующую команду:dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2-25 | rev
).hub_app_url
- замените значение параметра на URL, который будет использоваться для доступа к AppSec.Hub.hub_consul_token
- замените значение параметра на токен для сервисаconsul
.
- Укажите необходимые параметры
auth_properties
:db_auth_password
- пароль пользователя для сервиса аутентификации AppSec.Hub.jwt_token_signing_key
- замените<HUBAPP-SIGN-KEY>
на значение, полученное в результате выполнения следующей команды:dd if=/dev/urandom bs=1 count=64 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev
.metrics_password
- замените пароль по умолчанию пользователя администратора metrics.
- Для использования ZAP необходимо создать постоянный том для хранения, указав в секции
pvc
'enable: true'
,storageClassName
, и размерstorage
.
3.6. hub-ui:
- Для включения использования метрик замените значение
selectedNginxConf
на "metrics" - метрики включены. В случае если метрики не требуются, можно оставить значение по умолчанию.
3.7. hub-engine - настройка CI-инструмента:
- Включите сервис
docker-in-docker
, указав в разделеenable: true
. - Включите CI инструмент
hub-engine-manager
, указав в разделеenable: true
.- Укажите
base_url
, который будет использоваться для доступа кhub-engine-manager
.
- Укажите
- Включите slave ноду
hub-Engine
, указав в разделеenable: true
- Укажите приватный ключ
authorized_keys
- приватный ключ создается в секретах через web-интерфейсhub-engine-manager
. - Раскомментируйте раздел
nodes
.
- Укажите приватный ключ
Пример модуля
# -- Запуск CI инструмента hub-engine-manager (true/false) enable: true # для подключения ноды к hub-engine-manager - указать публичный ssh-ключ # например так: # helm upgrade --install \ # --set-file hubEngine.authorized_keys=./id_rsa.pub \ # hub sfs/appsechub -f values.yaml # -- Приватный ключ создается в секретах через web интерфейс hub-engine-manager (см. документацию) hubEngine: enable: true authorized_keys: env: LOG_CONSOLE: "1" LOG_FILE: "0" LOG_BASE_PATH: AUTH_USE: "0" AUTH_EXPIRED: "365" AUTH_SECRET_KEY: AUTH_SCHEME: MODEL_USE_ENCRYPTION: "0" MODEL_SECRET_KEY: MODEL_DEFAULT_PRACTICE: MODEL_LOWER_LIMIT: "0.8" MODEL_MIN_FREE_DISK_SPACE: "100" LOG_LEVEL: INFO ENCRYPTION_KEY: "" PIPELINE_SERVICE_NAME: grpc-pipeline-50053 SCANS_FOLDER: /app/scans_folder ARCHIVE_FOLDER: /app/archive_folder RABBITMQ_EXCHANGE: "" RABBITMQ_ROUTING_KEY: super nodes: - fullname: hub-pipline-agent image: name: appsechub/hub-pipline-agent pullPolicy: Always repository: registry.appsec.global tag: 2025.1.3 # replicaCount: 1 service: enableIp: null externalTrafficPolicy: Local ip: null port: 50052 targetPort: 50052 portName: port50052 type: ClusterIP annotations: {} pvc: enable: false storageClassName: yc-network-ssd storage: 10Gi accessModes: - ReadWriteOnce path: /home/ubuntu nodeSelector: disk: ssd strategy: type: Recreate env: timezone: Europe/Moscow - fullname: hub-engine-17 image: name: appsechub/hub-engine pullPolicy: Always repository: registry.appsec.global tag: 2025.1.3 # replicaCount: 1 service: enableIp: null externalTrafficPolicy: Local ip: null port: 2022 targetPort: 2022 portName: port2022 type: ClusterIP annotations: {} pvc: enable: false storageClassName: yc-network-ssd storage: 5Gi accessModes: - ReadWriteOnce path: /home/ubuntu/jenkins_slave nodeSelector: {} strategy: type: Recreate env: timezone: Europe/Moscow
3.8. ingress:
- Укажите домены AppSec.Hub и
hub-engine-manager
в полях соответствующих секций. Параметрenabled:
определяет, нужно ли создавать Ingress для конкретного сервиса. - Создайте секрет с SSL-сертификатами, установив
create: true
и указав необходимые сертификаты. - Включите использование SSL, установив опцию
ssl: true
. - Для задания специфичных параметров укажите их в секции
annotations
. - Укажите класс Ingress-контроллера.
Пример модуля
ingress: # Название Ingress AppSec.Hub - name: hub # Аннотации к объекту Ingress AppSec.Hub annotations: nginx.ingress.kubernetes.io/proxy-body-size: "0" #kubernetes.io/ingress.class: nginx-internal # Указание Ingress Class, nginx-internal class_name: nginx-internal # Создать Ingress для AppSec.Hub (true/false) enabled: true # Ingress hosts AppSec.Hub hosts: # Указать домен AppSec.Hub - host: appsec-hub.example.com paths: - path: / pathType: Prefix backend: service: name: hub-ui port: number: 80 # Ingress TLS AppSec.Hub tls: - hosts: # Указать домен AppSec.Hub - appsec-hub.example.com # -- При `ingress.hub.ssl.enable: true` не менять значение, при использовании существующих секретов - поменять имя секрета на актуальное secretName: secret-tls-hub # Для создания секрета при старте `create: true` # Указать сертификат и ключ ssl # Создать секрет с SSL сертификатами (true/false) create: true # Сертфикат, закодированный в Base64 crt: Сертфикат, закодированный в Base64 # Сертфикат, закодированный в Base64 key: Сертфикат, закодированный в Base64 ssl: # Использовать SSL (true/false) enable: true # Название Ingress Hub engine manager - name: hub-engine-manager # Создать Ingress для Hub engine manager (true/false) enabled: true # name: hub-engine-manager # Аннотации к объекту Ingress Hub engine manager annotations: nginx.ingress.kubernetes.io/proxy-body-size: "0" # Указание Ingress Class, nginx-internal class_name: nginx-internal # Ingress hosts для Hub engine manager hosts: # Указать домен для Hub engine manager - host: hub-engine-manager.example.com paths: - path: / pathType: Prefix backend: service: name: hub-engine-manager port: number: 8080 tls: - hosts: # Указать домен Hub engine manager - hub-engine-manager.example.com # При `ingress.hubEngineManager.ssl.enable: true` не менять значение, при использовании существующих секретов - поменять имя секрета на актуальное secretName: secret-tls-hub-engine-manager ## Для создания секрета при старте `create: true` # Указать сертификат и ключ ssl # Создать секрет с SSL сертификатами (true/false) create: true # Сертфикат, закодированный в Base64 crt: Сертфикат, закодированный в Base64 # Сертфикат, закодированный в Base64 key: Сертфикат, закодированный в Base64 ssl: # Использовать SSL (true/false) enable: true
3.9. postgresql:
Основные настройки PostgreSQL:
- Включите PostgreSQL, укажите
enable: true
для активации PostgreSQL. - Остальные параметры привести в соответствие с
hubdbmigration
(POSTGRES_PASSWORD)
, вне зависимости от использования или нет, образ используется для проверки доступности БД, то есть данные должны быть актуальны. - Включите PVC:
- Установите
enable: true
для создания постоянного тома. - Укажите класс хранилища
storageClassName
(оставьте пустым, чтобы использовать значение по умолчанию). - Укажите размер тома
storage
.
- Установите
3.10. consul:
- Добавьте
consulToken
. - Добавьте секрет
imagePullSecrets
для доступа к реестру, если требуется. - Включите UI (пользовательский интерфейс Consul), если требуется.
Пример модуля
consul: enabled: true fullnameOverride: consul hubConnect: consulHost: "http://consul-expose-servers" consulPort: "8500" consulToken: "<consul token>" connectInject: enabled: false global: datacenter: appsechub logJSON: true image: registry.appsec.global/public/sfs-consul:1.14.4 imagePullSecrets: - name: regcred acls: manageSystemACLs: false enabled: true default_policy: "deny" enable_token_persistence: true bootstrapToken: secretName: consul-secret secretKey: consul-token client: enabled: false server: replicas: 1 bootstrapExpect: 1 disruptionBudget: maxUnavailable: 0 exposeService: enabled: true type: ClusterIP extraConfig: | { "addresses": { "http": "0.0.0.0" }, "acl": { "enabled": true, "default_policy": "deny", "down_policy": "extend-cache", "enable_token_persistence": true } } ui: ingress: enabled: true ingressClassName: nginx pathType: Prefix hosts: - host: hub-engine-manager.example.com paths: - / tls: [] annotations: nginx.ingress.kubernetes.io/rewrite-target: /
3.11. gateway:
- Укажите ключ подписи -
jwtToken
(для генерации токена можно использовать следующую команду:dd if=/dev/urandom bs=1 count=64 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev
).
3.12. hub-sso:
- Укажите ключ шифрования -
encKey
(для генерации токена можно использовать следующую команду:dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2-17 | rev
). - Укажите опцию
url
AppSec.Hub.
3.13. hub-pipeline:
Пример модуля
hubpipeline: enable: true # -- Имя контейнера hub-pipeline fullname: hub-pipeline image: # -- Путь к репозиторию образа hub-pipeline name: appsechub/hub-pipeline # -- Реестр образов контейнеров repository: registry.appsec.global # -- Тег версии образа tag: 2024.4.1 # -- Политика загрузки образа pullPolicy: Always # -- Стратегия развертывания новых pod's strategy: type: Recreate # -- Аннотации к объекту hub-pipeline annotations: {} db_name: pipeline_db # Установка лимитов для контейнера #resources: # requests: # memory: "1024Mi" # cpu: "200m" # limits: # memory: "8192Mi" # cpu: "4000m" service: # -- При использовании service.type=LoadBalancer необходимо поставить true # и указать статический ip адрес enableIp: false # -- Политика Service externalTrafficPolicy: local # -- IP aдрес LoadBalancer для Service (Если frontend.service.type=LoadBalancer) ip: null # -- Тип Service, LoadBalancer или ClusterIP type: ClusterIP # -- Аннотации к объекту Service annotations: {} # -- nodeSelector для компонента hub-pipeline nodeSelector: {} #label: value env: # -- Указание TimeZone Europe/Moscow timezone: Europe/Moscow # -- Дополнительные лейблы для Pods hub-pipeline podLabels: {}
3.14. rabbitmq:
Пример модуля
rabbitmq: enable: true fullname: rabbitmq image: # -- Путь к репозиторию образа name: public/sfs-rabbitmq # -- Политика загрузки образа pullPolicy: IfNotPresent # -- Реестр образов контейнеров repository: registry.appsec.global # -- Тег версии образа tag: 3.13-management-alpine auth: username: user password: "" podLabels: {} # Порты для Service ports: - name: amqp port: 5672 targetPort: 5672 protocol: TCP - name: management port: 15672 targetPort: 15672 protocol: TCP annotations: {} # -- NodeSelector для компонента rabbitmq nodeSelector: {} # -- Стратегия развертывания strategy: type: Recreate # -- Установка лимитов для контейнера rabbitmq # resources: # requests: # memory: "512Mi" # cpu: "500m" # limits: # memory: "1Gi" # cpu: "1" pvc: # -- Создать постоянный том для хранения rabbitmq enable: true # -- Указание storageClassName для тома сервиса storageClassName: yc-network-ssd # -- Указание размера тома для хранения данных сервиса storage: 10Gi # -- Указание параметров доступа к тому с данными сервиса accessModes: - ReadWriteOnce
3.15. Включение метрик в AppSec.Hub:
- Убедитесь, что модуль Superset включен, установив параметр
enabled: true
. - Установите пользователя, от имени которого будет запускаться контейнер:
runAsUser: 1000
. - В разделе
configOverrides
модуля Superset, раскомментируйтеsecret
и укажитеSECRET_KEY
(для генерации можно использовать следующую команду:openssl rand -base64 42
). - Укажите пароль для подключения Superset к базе данных метрик в разделе
supersetNode
,db_pass: 'пароль_для_подключения_BD'
. - Замените пароль по умолчанию в опции
init.adminUser.password
. Этот пароль должен совпадать сMETRICS_PASSWORD
из модуляhubmetricsbridge
. - Укажите пароль для пользователя
metrics
в разделеpostgresql
. Пароль должен совпадать сdb_pass
, указанным вsupersetNode
. - Включите использование PVC, указав
storageClass
,accessModes
,size
- размер тома. - В разделе
hubmetricsbridge
укажите следующие параметры:PGPASSWORD
- пароль пользователя с административным доступом БД метрик, должен совпадать с паролем указанным в модулеpostgresql
.SCHEDULER_DB_PASSWORD
- пароль пользователяscheduler
БД метрик.METRICS_DB_PASSWORD
- пароль пользователя метрик.REMOTE_PASSWORD_DB
- пароль пользователя с правами администратора на БД AppSec.Hub.METRICS_PASSWORD
- имя пользователя метрик, должно совпадать с паролем, указанным в модулеinit
.
Пример модуля
superset: enabled: true fullnameOverride: hub-superset runAsUser: 1000 secretEnv: create: true serviceAccountName: superset serviceAccount: create: true configOverrides: secret: | SECRET_KEY = 'Ваш_сгенерированный_SECRET_KEY' supersetNode: connections: db_pass: 'пароль_для_подключения_BD' init: adminUser: password: 'пароль_для_admin_metrics' postgresql: auth: username: metrics password: 'пароль_администратора_БД_метрик' primary: persistence: enabled: true # Включить использование PVC storageClass: <имя_вашего_StorageClass> # Укажите StorageClass accessModes: - ReadWriteOnce # Задайте тип доступа (например, "ReadWriteOnce") size: 10Gi # Укажите размер тома imagePullSecrets: - name: regcred hubmetricsbridge: PG_USER: metrics PGPASSWORD: 'пароль_администратора_БД_метрик' PG_URL: hub-postgresql SCHEDULER_DB_PASSWORD: 'пароль_scheduler' METRICS_DB_PASSWORD: 'пароль_пользователя_метрик' REMOTE_HOST_DB: postgresql REMOTE_PORT_DB: 5432 REMOTE_DB: hubdb REMOTE_USER_DB: hubadm REMOTE_PASSWORD_DB: 'пароль_администратора_БД_AppSec.Hub' METRICS_HOST: http://hub-superset METRICS_PORT: 8088 METRICS_USERNAME: admin METRICS_PASSWORD: 'пароль_admin_metrics' METRICS_DATABASE_URL: "postgresql+psycopg2://metrics_user:%s@hub-postgresql:5432/metrics_data" CHRON: "0 0 * * * *" nodeSelector: {}
3.16. Для более гибкой настройки смотрите файл values.yaml.
-
Установите AppSec.Hub.
helm upgrade --install hub sfs/appsechub -f values.yaml
Установка и использование AppSec.Hub Installer
В этом разделе приведена инструкция по установке и использованию AppSec.Hub Installer версии 2025.1.3.
Важно!
Установка с помощью AppSec.Hub Installer может быть произведена на Ubuntu/CentOS/RHEL для root-конфигурации.
Возможности установщика
AppSec.Hub Installer предоставляет следующие возможности:
- Устанавливает AppSec.Hub указанной версии (при наличии соответствующего образа установщика). На текущий момент поддерживается версия 2025.1.3.
- Автоматически генерирует пароли и ключи в конфигурационных файлах.
- Обеспечивает безопасную установку, исключающую нарушение работоспособности уже развернутого AppSec.Hub (при условии отсутствия ручных изменений в конфигурационных файлах).
- Исправляет ошибки в конфигурационных файлах (например, добавление пропущенных строк в app.properties).
- Автоматизирует правки конфигурации при обновлении AppSec.Hub.
- Обеспечивает настройку по протоколам HTTP и HTTPS.
- Импортирует CA-сертификаты без необходимости ручного копирования файла cacerts из контейнера hub-core.
Требования к серверу
Перед запуском необходимо убедиться, что:
-
На сервере, куда будет производиться установка, установлены:
- Docker (рекомендуется использовать версию, совместимую с docker-compose).
- docker-compose версии не ниже 2.24.0.
-
Есть доступ к репозиторию
registry.appsec.global
. - Пользователь имеет права повышать привилегии до
root
(черезsudo
).
Для локального запуска (опционально):
- Убедитесь, что Docker авторизован в
registry.appsec.global
. - Обеспечьте сетевой доступ до целевой машины через SSH.
Установка и запуск AppSec.Hub
-
Подготовка к запуску.
Запуск установки может осуществляться как локально, для установки на сервер, так и с сервера, на который необходимо установить AppSec.Hub. Основное различие между этими вариантами заключается в значении параметра
hub_host
:- При запуске с локального устройства в
hub_host
указывается IP-адрес сервера. - При запуске установки не посредственно на сервере в
hub_host
указывается локальный адрес (127.0.0.1
).
- При запуске с локального устройства в
-
Авторизация в Docker Registry.
На целевом сервере выполните команду для авторизации в Docker Registry:
docker login registry.appsec.global
Эта команда необходима для получения доступа к образам Docker.
-
Запуск контейнера.
Для запуска контейнера используйте один из следующих вариантов в зависимости от метода аутентификации:
1. С использованием логина и пароля.
``` docker run --network host -it --rm registry.appsec.global/appsechub/appsechub-installer:2025.1.3 \ -e hub_url="http://PLACE_ADDRESS" \ -e hub_host="127.0.0.1" \ -k --user YOUR_USERNAME ```
Параметры:
hub_url
— адрес, по которому будет доступен AppSec.Hub в браузере.hub_host
— адрес машины для подключения по SSH (это может быть127.0.0.1
или адрес удалённого сервера).--user
— логин пользователя, от имени которого будут выполняться команды. Пользователь должен иметь права на выполнение команд с использованиемsudo
.
2. С использованием логина и SSH-ключа.
docker run -v /home/username/.ssh/id_rsa:/key/key --network host -it --rm \ registry.appsec.global/appsechub/appsechub-installer:2025.1.3 \ -e hub_url="http://PLACE_ADDRESS" \ -e hub_host="PLACE_ADDRESS" \ --user YOUR_USERNAME \ --private-key /key/key
Параметры:
-v
— путь к файлу приватного SSH-ключа для подключения.hub_url
— адрес, по которому будет доступен AppSec.Hub в браузере.hub_host
— адрес машины для подключения по SSH (рекомендуется использовать удалённый адрес при работе с SSH-ключом).--user
— логин пользователя, от имени которого будут выполняться команды. Пользователь должен иметь права на выполнение команд с использованиемsudo
.
Примечание
Если для выполнения команд с использованием
sudo
требуется ввод пароля, добавьте ключ-K
в конец команды. В этом случае Ansible запросит пароль для выполнения операций. -
Настройка HTTPS.
Для настройки HTTPS необходимо подключить volume с файлами сертификата и ключа.
Требования:
- Монтировать папку нужно в директорию
/ssl
в контейнере. - В папке должны находиться два файла: сертификат (с расширением
.crt
) и ключ (с расширением.key
).
- Монтировать папку нужно в директорию
-
Добавление самоподписанных сертификатов (при необходимости использования).
Для импорта корневых сертификатов необходимо подключить volume с файлами сертификатов.
Требования:
- Монтировать папку нужно в директорию
/ca
в контейнере. - В папке должны находиться файлы с расширениями
.crt
,.cert
или.pem
.
Примечание
На первом запуске создаётся чистый
cacerts
. При последующих запусках используются уже импортированные сертификаты.Для удаления устаревших или ошибочно импортированных сертификатов удалите файл
cacerts
из папки с корневыми сертификатами.Пример команды (с SSL и CA сертификатами):
- Монтировать папку нужно в директорию
-
Запуск Appsec.Hub на сервере.
После выполнения вышеуказанных шагов перейдите в директорию
/opt/apphub
на сервере, куда производилась установка и выполните команды:
Запуск AppSec.Hub
Выполните следующие команды:
cd /opt/apphub
sudo docker-compose up -d
После запуска AppSec.Hub будет доступен по URL, указанном в файле /opt/apphub/config/hub-core/app.properties (см. параметр hub_url
).
Имя предустановленного пользователя — hubadm
, пароль — qweasd123
.
Остановка AppSec.Hub
Выполните следующие команды:
cd /opt/apphub
sudo docker-compose down
Установка Jenkins (root/rootless)
Важно!
Начиная с версии 2024.4.1, если планируется использование инструментов PT Application Inspector или CodeScoring, необходимо подготовить Docker-образ по инструкции, приведенной в разделе «Добавление в Docker-образ hub-engine агентов Johnny и PT AISA».
Master нода
За основу взята сборка Jenkins, запускаемая в rootless Docker. Для сборки используется нода master.
Установлен следующий набор плагинов
ace-editor:latest ant:latest antisamy-markup-formatter:latest apache-httpcomponents-client-4-api:latest authentication-tokens:latest bitbucket:latest blueocean:latest blueocean-autofavorite:latest blueocean-bitbucket-pipeline:latest blueocean-commons:latest blueocean-config:latest blueocean-core-js:latest blueocean-dashboard:latest blueocean-display-url:latest blueocean-events:latest blueocean-github-pipeline:latest blueocean-git-pipeline:latest blueocean-i18n:latest blueocean-jira:latest blueocean-jwt:latest blueocean-personalization:latest blueocean-pipeline-api-impl:latest blueocean-pipeline-editor:latest blueocean-pipeline-scm-api:latest blueocean-rest:latest blueocean-rest-impl:latest blueocean-web:latest bouncycastle-api:latest branch-api:latest build-pipeline-plugin:latest build-timeout:latest build-token-root:latest build-token-trigger:latest checkmarx:latest cloudbees-bitbucket-branch-source:latest cloudbees-folder:latest command-launcher:latest conditional-buildstep:latest configuration-as-code:latest copy-data-to-workspace-plugin:latest credentials:latest credentials-binding:latest dependency-check-jenkins-plugin:latest dependency-track:latest display-url-api:latest docker-commons:latest docker-workflow:latest durable-task:latest email-ext:latest external-monitor-job:latest favorite:latest generic-webhook-trigger:latest git:latest git-client:latest github:latest github-api:latest github-branch-source:latest gitlab-plugin:latest git-server:latest gradle:latest handlebars:latest handy-uri-templates-2-api:latest htmlpublisher:latest jackson2-api:latest javadoc:latest jdk-tool:latest jenkins-design-language:latest jira:latest job-fan-in:latest jquery:latest jquery-detached:latest jsch:latest junit:latest ldap:latest lockable-resources:latest mailer:latest mapdb-api:latest matrix-auth:latest matrix-project:latest maven-plugin:latest mercurial:latest metrics:latest momentjs:latest nested-view:latest nexus-jenkins-plugin:latest nuget:latest pam-auth:latest parameterized-trigger:latest permissive-script-security:latest pipeline-build-step:latest pipeline-graph-analysis:latest pipeline-input-step:latest pipeline-milestone-step:latest pipeline-model-api:latest pipeline-model-declarative-agent:latest pipeline-model-definition:latest pipeline-model-extensions:latest pipeline-rest-api:latest pipeline-stage-step:latest pipeline-stage-tags-metadata:latest pipeline-stage-view:latest plain-credentials:latest pubsub-light:latest resource-disposer:latest run-condition:latest scm-api:latest script-security:latest sloccount:latest sse-gateway:latest ssh-agent:latest ssh-credentials:latest ssh-slaves:latest stash-pullrequest-builder:latest structs:latest subversion:latest text-finder:latest timestamper:latest token-macro:latest trilead-api:latest variant:latest view-job-filters:latest windows-slaves:latest workflow-aggregator:latest workflow-api:latest workflow-basic-steps:latest workflow-cps:latest workflow-cps-global-lib:latest workflow-durable-task-step:latest workflow-job:latest workflow-multibranch:latest workflow-scm-step:latest workflow-step-api:latest workflow-support:latest ws-cleanup:latest
Во время запуска проводятся первоначальные настройки, которые задают учетные данные Администратора и базовый URL Jenkins, импортируют в систему все SSL-сертификаты как доверенные и устанавливают переменные окружения.
Slave нода
За основу взят базовый образ Ubuntu, который также запускается в rootless контейнере, поверх которого установлены утилиты и сборщики, необходимые для проведения сканирований.
Данный образ может работать со следующим списком утилит: mono
, cdxgen
, nuget
, npm
, java
, maven
и gradle
.
При подключении ноды к Jenkins необходимо указать следующие метки: all super jenkins-slave-node-all maven mono npm nodejs docker java python pypi cdxgen
.
Установка
-
Создайте папки.
sudo mkdir -p /opt/jenkins/jenkins_home sudo mkdir -p /opt/jenkins/jenkins-slave-all sudo mkdir -p /opt/jenkins/ssh-pub-keys-all sudo mkdir -p /opt/jenkins/certs sudo mkdir -p /opt/jenkins/docker-certs sudo mkdir -p /opt/jenkins/fortify
-
Сохраните файл с публичным ключом authorized_keys в папку ssh-pub-keys-all.
-
Если в качестве доверенных необходимо добавить самоподписанные сертификаты, сохраните корневой сертификат или сертификаты всех узлов с расширением .crt в папку certs. Более подробная информация приведена в разделе «Безопасная сетевая конфигурация».
-
Если для Docker в качестве доверенных необходимо добавить самоподписанные сертификаты, создайте папку docker-certs/<repo>, где
<repo>
— container registry, который указывается при авторизации.Например
Если необходимо выполнить авторизацию с помощью команды
docker login gitlab.example.com
, создайте директорию docker-certs/gitlab.example.com и сохраните корневой сертификат или сертификат узла в ней. -
Задайте права пользователя на папки и файлы.
sudo chown 1000:1000 -R /opt/jenkins/jenkins_home sudo chmod 775 -R /opt/jenkins/fortify sudo chown 1000:2000 -R /opt/jenkins/fortify sudo chown 2000:2000 -R /opt/jenkins/jenkins-slave-all sudo chmod 600 /opt/jenkins/ssh-pub-keys-all/authorized_keys sudo chown 2000:2000 /opt/jenkins/ssh-pub-keys-all/authorized_keys sudo chmod 755 -R /opt/jenkins/certs/ sudo chown 1000:2000 -R /opt/jenkins/certs/
export REMAP_UID=$(cat /etc/subuid | grep -i $USER | awk -F : '{print $2}') export UID_2000=$((${REMAP_UID}+1999)) export UID_1000=$((${REMAP_UID}+999)) sudo chown ${UID_1000}:${UID_1000} -R /opt/jenkins/jenkins_home sudo chmod 775 -R /opt/jenkins/fortify sudo chown ${UID_1000}:${UID_2000} -R /opt/jenkins/fortify sudo chown ${UID_2000}:${UID_2000} -R /opt/jenkins/jenkins-slave-all sudo chmod 600 /opt/jenkins/ssh-pub-keys-all/authorized_keys sudo chown ${UID_2000}:${UID_2000} /opt/jenkins/ssh-pub-keys-all/authorized_keys sudo chown ${UID_2000}:${UID_2000} -R /opt/jenkins/ssh-pub-keys-all sudo chmod 755 -R /opt/jenkins/certs/ sudo chown ${UID_1000}:${UID_2000} -R /opt/jenkins/certs/
-
Создайте файл /opt/jenkins/.env со следующим содержимым:
hub_engine_manager_version=<version> hub_engine_version=<version>
где
<version>
— последняя актуальная версия продукта, например —2023.4.1
. -
Для корректной работы контейнера docker-in-docker выполните следующие команды.
sudo mkdir /sys/fs/cgroup/systemd sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
-
Создайте файл /opt/jenkins/docker-compose.yaml, пример см. в «Приложении 10».
Важно!
При использовании rootless Docker на хостовой системе контейнер docker-in-docker начинает работать нестабильно. В качестве альтернативы предлагается использовать внешний Docker-демон, взаимодействие с которым осуществляется через SSH-соединение. Таким образом, проводя операции с Docker-контейнерами в образе node-all (запуск, удаление и т. п.), мы проводим эти операции на удалённом хосте, с которым установлено соединение. Важно, что для обеспечения работоспособности такой системы не обязательно иметь 2 инстанса — можно использовать тот же хост, на котором происходит установка Jenkins. Далее приведена инструкция по конфигурации подключения удалённого Docker-демона.
-
Уберите из docker-compose.yaml сервис docker-in-docker.
-
На отдельном хосте установите rootless Docker (хост может быть тот, на котором устанавливается Jenkins).
-
Создайте SSH-ключи БЕЗ ПАРОЛЯ.
-
Запишите ключ удаленного хоста в файл known_hosts (измените
<domain>
на доменное имя хоста, на котором запущен rootless Docker):ssh-keyscan -H <domain> | sudo tee -a /opt/jenkins/ssh-pub-keys-all/known_hosts
-
Сохраните публичный SSH-ключ в файл /home/<user>/.ssh/authorized_keys на хосте, где запущен rootless Docker (замените
<user>
на имя пользователя на удаленном хосте, от которого запущен Docker). -
Сохраните приватный ключ в файл с названием
id_rsa
в директорию /opt/jenkins/ssh-pub-keys-all на хосте, где устанавливается Jenkins. -
Замените в файле docker-compose.yaml значение переменной
DOCKER_HOST
в сервисах Jenkins и node-all наssh://<user>@<domain>
, где<user>
— имя пользователя, от которого на удаленном хосте запущен Docker, а<domain>
— доменное имя хоста, на котором запущен rootless Docker. -
Если владельцем Docker-сокета является непривилегированный пользователь, установите необходимые права и владельца на добавленные файлы.
export REMAP_UID=$(cat /etc/subuid | grep -i $USER | awk -F : '{print $2}') export UID_2000=$((${REMAP_UID}+1999)) export UID_1000=$((${REMAP_UID}+999)) sudo chmod 600 /opt/jenkins/ssh-pub-keys-all/known_hosts sudo chown ${UID_2000}:${UID_2000} /opt/jenkins/ssh-pub-keys-all/known_hosts sudo chmod 400 /opt/jenkins/ssh-pub-keys-all/id_rsa sudo chown ${UID_2000}:${UID_2000} /opt/jenkins/ssh-pub-keys-all/id_rsa sudo chown ${UID_2000}:${UID_2000} -R /opt/jenkins/ssh-pub-keys-all
-
-
Для корректной работы отдельных утилит и инструментов, например cdxgen, могут потребоваться переменные окружения, которые указываются в файле docker-compose.yaml (раздел environment сервиса jenkins). Перечень переменных окружения контейнера hub-engine-manager приведен в Приложении 11.
Примечание
Для автоматического конфигурирования URL Jenkins и учетных данных Администратора используются переменные окружения:
JENKINS_URL
,JENKINS_ADMIN_USER
,JENKINS_PASSADMIN_PASSWORD
. При запуске Jenkins соответствующие параметры берутся из перечисленных переменных.Если после запуска необходимо скрыть учетные данные Администратора, следует убрать переменные
JENKINS_ADMIN_USER
иJENKINS_ADMIN_PASSPASSWORD
из docker-compose.yaml — текущие учетные данные (username
/password
) будут сохранены в Jenkins и, используя их, можно войти в систему. -
Если необходимо использовать Fortify, предварительно создав файл license/fortify.license с лицензией для него, добавьте в docker-compose.yaml следующий раздел.
fortify-node: image: registry.appsec.global/appsechub/hub-engine:${hub_engine_version} container_name: node-fortify user: 2000:2000 networks: - network restart: always environment: - LANG=en_US.utf-8 - "JAVA_OPTS=-DLANG=en_US.UTF-8" volumes: - ./certs:/tmp/certs - ./ssh-pub-keys-all:/home/ubuntu/.ssh - ./jenkins-slave-fortify:/home/ubuntu/jenkins-slave - ./fortify/projects_fortify:/fortify/projects - ./license/fortify.license:/opt/Fortify/Fortify_SCA_and_Apps_21.1.1/fortify.license
-
Выполните настройку HTTPS-соединения, добавив в docker-compose.yaml следующий раздел.
nginx: image: registry.appsec.global/public/sfs-nginx:latest container_name: nginx networks: - network volumes: - ./nginx:/etc/nginx/conf.d:ro - ./ssl:/etc/ssl/certs/ssl-cert:ro restart: always ports: - 80:80/tcp - 443:443/tcp
-
Создайте директории.
sudo mkdir /opt/jenkins/nginx sudo mkdir /opt/jenkins/ssl
-
В директории ssl сохраните сертификат в файл fullchain.pem и ключ в файл privkey.pem.
-
В директории nginx создайте конфигурационный файл для reverse-proxy — web.conf и в параметре
server_name
укажите URL Jenkins.server { listen 80; server_name jenkins.company.com; # Укажите URL для доступа к Jenkins. ignore_invalid_headers off; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; client_max_body_size 100m; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://jenkins:8080; } listen 443 ssl; ssl_certificate /etc/ssl/certs/ssl-cert/fullchain1.pem; ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey1.pem; if ($scheme != "https") { return 301 https://$host$request_uri; } }
-
Для rootless Docker установите разрешение на прослушивание привилегированных портов от непривилегированного пользователя.
echo "net.ipv4.ip_unprivileged_port_start=0" | sudo tee -a /etc/sysctl.conf sudo sysctl -p /etc/sysctl.conf
Запуск
Запуск осуществляется с помощью следующей команды (из директории docker-compose.yaml).
cd /opt/jenkins
sudo docker-compose up -d
После запуска Jenkins будет доступен на порту 8080
.
Важно
После запуска даже у анонимного пользователя будут права администратора. После первого запуска добавьте всех необходимых пользователей (Manage Jenkins › Manage Users) и назначьте им права в матричном системе доступа (Manage Jenkins › Configure Global Security › Authentication › Authorization (Matrix-based security)).
Подключение нод
-
Перед добавлением slave node необходимо добавить приватный SSH-ключ в хранилище секретов Jenkins (Manage Jenkins › Manage Credentials).
Перейдите в Jenkins (поле Store) › Global credentials › Add Credentials и добавьте приватный ключ.
-
Добавьте новый узел Manage Jenkins › Manage Nodes and Clouds › New Node, укажите название и нажмите OK.
-
В меню настроек укажите следующие параметры:
Параметр Значение Remote root directory /home/ubuntu/jenkins-slave
Labels all super jenkins-slave-node-all maven mono npm nodejs docker java python pypi cdxgen
Host node-all
В выпадающем списке Host Key Verification Strategy выберите Non verifying Verification Strategy и нажмите Save.
-
Укажите для slave node порт
2022
(Advanced › Port). -
Укажите переменные окружения.
Переменная Значение LANG en_US.UTF-8
PATH ${PATH}:/usr/local/go/bin:/opt/gradle/gradle-8.7.0/bin
При добавлении slave ноды Fortify необходимо указать в Jenkins следующую переменную окружения.
Название Значение PATH ${PATH}:/opt/Fortify/Fortify_SCA_and_Apps_21.1.1/bin
При успешном добавлении статус ноды изменится на In Sync.
Важно!
При интеграции AppSec.Hub и Jenkins некоторые сканирования могут заканчиваться неуспешно, если не дать разрешение на исполнение Groovy-скриптам, которые появляются в Jenkins (Manage Jenkins › In-process Script Approval).
Добавление в Docker-образ hub-engine агентов Johnny и PT AISA
Для добавления агента Johnny (CodeScoring) и PT AISA в образ hub-engine необходимо выполнить следующие шаги:
-
Создайте папку для сборки Docker-образа, скопируйте агента командной строки Johnny в созданную папку.
-
Создайте в этой папке Dockerfile со следующим содержимым, изменив версии образа hub-engine и агентов на необходимые (если один из агентов использовать не планируется, то необходимо удалить блок кода, содержащий установку этого агента):
FROM registry.appsec.global/appsechub/hub-engine:2025.1.3 USER root # PT AISA ENV aisa_version 4.8.0.40157 RUN wget -qO - https://update.ptsecurity.com/packages/PT-public.gpg | apt-key add - \ && echo deb https://update.ptsecurity.com/packages/deb/AI.Shell/release all non-free >> /etc/apt/sources.list \ && apt update && apt install aisa=${aisa_version} \ && apt-get clean && rm -rf /var/lib/apt/lists/* # Johnny RUN mkdir -p /opt/codescoring COPY johnny /opt/codescoring USER ubuntu
-
Далее необходимо запустить сборку Docker-файла, при необходимости заменив имя и тег образа.
docker build -t registry.appsec.global/appsechub/hub-engine:2025.1.3-agent -f Dockerfile .
Резервное копирование
- Остановите AppSec.Hub, см. раздел «Остановка AppSec.Hub».
- Сделайте резервную копию директории установки AppSec.Hub (по умолчанию — /opt/apphub).
- Выполните резервное копирование директорий, относящихся к docker volumes, но расположенных за пределами директории установки.
- Запустите AppSec.Hub, см. раздел «Запуск AppSec.Hub».
Восстановление из резервной копии
- Остановите AppSec.Hub, см. раздел «Остановка AppSec.Hub».
- Переместите или переименуйте директорию установки AppSec.Hub (по умолчанию — /opt/apphub).
- Переместите или переименуйте директории, относящиеся к docker volumes, но расположенные за пределами директории установки (при наличии).
- Восстановите из резервной копии установочную директорию AppSec.Hub (по умолчанию — /opt/apphub).
- Восстановите из резервной копии директории, относящиеся к docker volumes, но расположенные за пределами директории установки.
- Запустите AppSec.Hub, см. раздел «Запуск AppSec.Hub».
- Восстановите из резервной копии установочную директорию AppSec.Hub (по умолчанию — /opt/apphub).
- Восстановите из резервной копии директории, относящиеся к docker volumes, но расположенные за пределами директории установки (при наличии).
- Запустите AppSec.Hub, см. раздел «Запуск AppSec.Hub».
Выполните базовый тест восстановленной установки:
- Авторизация.
- Просмотр списка инструментов, проверка соединения с ними (Test connection).
- Просмотр списка приложений.
- Просмотр результатов сканирования (Issues) и дефектов ИБ (Defects).
- Выборочный запуск DevSecOps пайплайнов.
- Просмотр результатов нового сканирования.
Настройка антивирусной защиты
На сервере с установленным AppSec.Hub необходимо установить антивирусное программное обеспечение в соответствии с политиками компании в области антивирусной защиты.
Настройка пайплайн-агентов на удаленном хосте с безопасным соединением TLS
При установке AppSec.Hub и Jenkins на разных хостах необходимо выполнить следующие шаги:
-
Создайте директорию
/opt/pipeline
на удаленном хосте. -
Создайте на удаленном хосте файл docker-compose.yml со следующим содержимым:
version: '3.2' services: nginx: image: nginx container_name: nginx networks: - network volumes: - ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro - ./ssl/certs/ssl-cert:/etc/ssl/certs/ssl-cert:ro restart: always ports: - 80:80/tcp - 443:443/tcp # Порты по количеству агентов, для каждого свой - 50052:50052/tcp - 50053:50053/tcp hub-pipeline-agent-1: image: registry.appsec.global/appsechub/hub-pipeline-agent:${hub_pipeline_agent_version} container_name: hub-pipeline-agent-1 networks: - network user: 2000:2000 restart: always environment: - LANG=en_US.utf-8 - DOCKER_HOST=tcp://docker-in-docker:2375 - SCANS_FOLDER=${SCANS_FOLDER} - ARCHIVE_FOLDER=${ARCHIVE_FOLDER} - CONSUL__HOST=${CONSUL_HOST} - CONSUL__PORT=${CONSUL_PORT} - CONSUL__TOKEN=${CONSUL_TOKEN} - ENCRYPTION_KEY=${ENCRYPTION_KEY} - GRPC__ADDRESS=${GRPC_ADDRESS} - GRPC__ID=${GRPC_ID} - GRPC__NAME=${GRPC_NAME} - GRPC__PORT=${GRPC_PORT} - GRPC__TAGS=${GRPC_TAGS} - GRPC__USE_TLS=${GRPC_USE_TLS} - LOG_LEVEL=${LOG_LEVEL} - PIPELINE_SERVICE_NAME=${PIPELINE_SERVICE_NAME} - PIPELINE_SERVICE_HOST=${PIPELINE_SERVICE_HOST} - PIPELINE_SERVICE_PORT=${PIPELINE_SERVICE_PORT} - RABBITMQ_MANAGEMENT_PORT=${RABBITMQ_MANAGEMENT_PORT} - RABBITMQ__HOST=${RABBITMQ_HOST} - RABBITMQ__PASSWORD=${RABBITMQ_PASSWORD} - RABBITMQ__PORT=${RABBITMQ_PORT} - RABBITMQ__ROUTING_KEY=${RABBITMQ_ROUTING_KEY} - RABBITMQ__USER=${RABBITMQ_USER} volumes: - ./scans_folder:/app/scans_folder hub-pipeline-agent-2: image: registry.appsec.global/appsechub/hub-pipeline-agent:${hub_pipeline_agent_version} container_name: hub-pipeline-agent-2 networks: - network user: 2000:2000 restart: always environment: - LANG=en_US.utf-8 - DOCKER_HOST=tcp://docker-in-docker:2375 - ARCHIVE_FOLDER=${ARCHIVE_FOLDER} - SCANS_FOLDER=${SCANS_FOLDER} - CONSUL__HOST=${CONSUL_HOST} - CONSUL__PORT=${CONSUL_PORT} - CONSUL__TOKEN=${CONSUL_TOKEN} - ENCRYPTION_KEY=${ENCRYPTION_KEY} - GRPC__ADDRESS=${GRPC_ADDRESS} - GRPC__ID=${GRPC_ID} - GRPC__NAME=${GRPC_NAME} - GRPC__PORT=${GRPC_PORT} - GRPC__TAGS=${GRPC_TAGS} - GRPC__USE_TLS=${GRPC_USE_TLS} - LOG_LEVEL=${LOG_LEVEL} - PIPELINE_SERVICE_NAME=${PIPELINE_SERVICE_NAME} - PIPELINE_SERVICE_HOST=${PIPELINE_SERVICE_HOST} - PIPELINE_SERVICE_PORT=${PIPELINE_SERVICE_PORT} - RABBITMQ_MANAGEMENT_PORT=${RABBITMQ_MANAGEMENT_PORT} - RABBITMQ__HOST=${RABBITMQ_HOST} - RABBITMQ__PASSWORD=${RABBITMQ_PASSWORD} - RABBITMQ__PORT=${RABBITMQ_PORT} - RABBITMQ__ROUTING_KEY=${RABBITMQ_ROUTING_KEY} - RABBITMQ__USER=${RABBITMQ_USER} volumes: - ./scans_folder:/app/scans_folder docker-in-docker: image: registry.appsec.global/public/sfs-docker:19.03.3-dind container_name: docker-in-docker privileged: true volumes: - ./docker-certs:/etc/docker/certs.d - /sys/fs/cgroup:/sys/fs/cgroup:ro environment: - DOCKER_TLS_CERTDIR= networks: - network pids_limit: 100 restart: on-failure:5 cpu_shares: 512 deploy: resources: limits: memory: 512M networks: network: driver: "bridge" driver_opts: com.docker.network.driver.mtu: 1450 ipam: driver: default config: - subnet: 172.20.0.0/16
-
Создайте в директории
/opt/pipeline
файл .env со следующим содержимым:# Версия образа hub-pipeline-agent hub_pipeline_agent_version=2025.1.3 # Директория для хранения архивов сканов для hub-pipeline-agent ARCHIVE_FOLDER=/app/archive_folder # Директория для временного хранения файлов сканов SCANS_FOLDER=/app/scans_folder # URL удаленного AppSec.Hub CONSUL_HOST=<AppSec.Hub URL, например, https://hub.your.domain.local> CONSUL_PORT="443" CONSUL_TOKEN="changeit" # Ключ для шифрования логинов и паролей для микросервисов AppSec.Hub # Должен совпадать с ключом hub-core ENCRYPTION_KEY="changeit" # GRPC_ADDRESS - Это URL ЭТОЙ Виртуальной машины GRPC_ADDRESS=<AppSec.Hub URL, например, https://hub-agent.your.domain.local> GRPC_USE_TLS=true # Переменные для hub-pipeline-agent-1 GRPC_ID=hub-pipeline-agent-1 GRPC_NAME=hub-pipeline-agent-1 GRPC_PORT="50052" GRPC_TAGS=["hub-pipeline-agent-1", "grpc-service"] # Переменные для hub-pipeline-agent-2 GRPC_ID2=hub-pipeline-agent-2 GRPC_NAME2=hub-pipeline-agent-2 GRPC_PORT2="50053" GRPC_TAGS2=["hub-pipeline-agent-2", "grpc-service"] LOG_LEVEL=INFO # Имя сервиса hub-pipeline-agent на удаленном хосте AppSec.Hub PIPELINE_SERVICE_NAME=grpc-pipeline-50053 PIPELINE_SERVICE_HOST=<AppSec.Hub URL, например, https://hub.your.domain.local> PIPELINE_SERVICE_PORT=50053 RABBITMQ_MANAGEMENT_PORT="15671" RABBITMQ_HOST=rabbitmq RABBITMQ_PASSWORD="changeit" RABBITMQ_PORT="5671" RABBITMQ_ROUTING_KEY=super RABBITMQ_USER=user
-
Создайте директорию nginx с файлом default.conf со следующим содержимым (блоков
server
в нем может быть больше, чем в примере ниже, если в файле docker-compose.yaml описано больше агентов; общее правило - под каждый агент должен быть создан свой блок):server { server_name localhost; ignore_invalid_headers off; proxy_connect_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; send_timeout 3600; client_max_body_size 10000m; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; #limit_conn connections 90; listen 50052 ssl; http2 on; location / { grpc_pass grpc://hub-pipeline-agent-1:50052; } ssl_certificate /etc/ssl/certs/ssl-cert/fullchain1.pem; # managed by Certbot ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey1.pem; # managed by Certbot } server { server_name localhost; ignore_invalid_headers off; proxy_connect_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; send_timeout 3600; client_max_body_size 10000m; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; #limit_conn connections 90; listen 50053 ssl; http2 on; location / { grpc_pass grpc://hub-pipeline-agent-2:50053; } ssl_certificate /etc/ssl/certs/ssl-cert/fullchain1.pem; # managed by Certbot ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey1.pem; # managed by Certbot }
-
Положите сертификаты для NGINX в директорию /opt/pipeline/ssl.
Настройка SSL-соединения для доступа в hub-pipeline
-
Зайдите на виртуальную машину где установлен AppSec.Hub.
-
В конфигурационном файле /opt/apphub/.env (см. «Приложение 1. Конфигурационный файл .env») укажите новые версии образов:
hub_core_version=2025.1.3 hub_ui_version=2025.1.3 hub_air_version=2025.1.3 hub_db_version=2025.1.3 hub_gateway_version=2025.1.3 hub_issue_rule_version=2025.1.3 hub_issue_version=2025.1.3 hub_sso_version=2025.1.3 hub_metrics_version=2025.1.3 hub_metrics_bridge_version=2025.1.3
И добавьте строки для версий образов новых микросервисов:
hub_pipeline_version=2025.1.3 rabbitmq_version=3.13-management-alpine
-
Добавьте следующие строки в конец файла /opt/apphub/.env (см. «Приложение 1. Конфигурационный файл .env»), указав переменные и значения параметров в соответствии с вашим окружением:
# Переменные для регистрации hub-pipeline на consul CONSUL_HOST=http://consul CONSUL_PORT="8500" CONSUL_TOKEN="changeit" # Имя, хост и порт для hub-pipeline PIPELINE_SERVICE_NAME=grpc-pipeline-50053 PIPELINE_SERVICE_HOST=hub-pipeline PIPELINE_SERVICE_PORT=50053 # Переменные для подключения hub-pipeline к rabbitmq RABBITMQ_MANAGEMENT_PORT="15672" RABBITMQ_HOST=rabbitmq RABBITMQ_AMQP_PORT=5672 RABBITMQ_PASSWORD="changeit" RABBITMQ_PORT="5672" RABBITMQ_ROUTING_KEY=super RABBITMQ_USERNAME=user RABBITMQ_USER=user # Используется для шифрования траффика hub-pipeline # В данный момент в бета-режиме USE_GRPC_SECURITY=false GRPC_AUTHORITY=<адрес хоста (url), на котором установлены пайплайн-агенты>
-
Отредактируйте файл docker-compose.yml - добавьте новые блоки:
rabbitmq: image: registry.appsec.global/public/rabbitmq:${rabbitmq_version} container_name: rabbitmq environment: - RABBITMQ_DEFAULT_USER=${RABBITMQ_USERNAME} - RABBITMQ_DEFAULT_PASS=${RABBITMQ_PASSWORD} networks: - net-hub volumes: - ./rabbit:/var/lib/rabbitmq ports: - 15672:15672 - 5672:5672 restart: on-failure:5 security_opt: - no-new-privileges cpu_shares: 1024 deploy: resources: limits: memory: 300M container_name: hub-pipeline environment: - PG_USER=postgres - PGPASSWORD=${pgsql_admin_password} - PG_URL=${pgsql_url} - HUB_URL=${HUB_URL} - TZ=Europe/Moscow - CONSUL_HOST=http://consul - CONSUL_PORT=8500 - CONSUL_TOKEN=${CONSUL_TOKEN} - DB_URL=jdbc:postgresql://${pgsql_url}/${hub_db_name} - HUBAPP_USERNAME=hubapp - HUBAPP_PASSWORD=${hub_app_password} - RABBITMQ_HOST=${RABBITMQ_HOST} - RABBITMQ_AMQP_PORT=${RABBITMQ_AMQP_PORT} - RABBITMQ_USERNAME=${RABBITMQ_USERNAME} - RABBITMQ_PASSWORD=${RABBITMQ_PASSWORD} - USE_GRPC_SECURITY=${USE_GRPC_SECURITY} - GRPC_AUTHORITY=${GRPC_AUTHORITY} networks: - net-hub cpu_shares: 768 deploy: resources: limits: memory: 1000M
-
В файле для
hub-ui
(/opt/apphub/config/hub-ui/hub.conf, см. «Приложение 13. Конфигурационный файл hub.conf») SSL терминируем в NGINX, роутинг настраиваем по порту, аналогично нодам:server { server_name localhost; ignore_invalid_headers off; proxy_connect_timeout 3600; proxy_send_timeout 3600; proxy_read_timeout 3600; send_timeout 3600; client_max_body_size 10000m; proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; #limit_conn connections 90; listen 50053 ssl http2; location / { grpc_pass grpc://hub-pipeline:50053; } ssl_certificate /etc/ssl/certs/ssl-cert/fullchain1.pem; # managed by Certbot ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey1.pem; # managed by Certbot }
-
Также в файле /opt/apphub/config/hub-ui/default.conf для
hub-ui
для настройки SSL-соединения для доступа вconsul
необходимо создать новый блок -location
сproxy_pass
наconsul
:location /v1/agent/service/ { proxy_set_header X-Forwarded-Port 443; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Scheme https; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Scheme https; proxy_set_header upgrade-insecure-requests 1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://consul:8500/v1/agent/service/; }
-
Для настройки SSL-соединения для доступа в
rabbitmq
добавьте блокstream
в конец файла /opt/apphub/config/nginx/nginx.conf:worker_processes auto; error_log /var/log/nginx/error.log notice; pid /tmp/nginx.pid; events { worker_connections 1024; } http { proxy_temp_path /tmp/proxy_temp; client_body_temp_path /tmp/client_temp; fastcgi_temp_path /tmp/fastcgi_temp; uwsgi_temp_path /tmp/uwsgi_temp; scgi_temp_path /tmp/scgi_temp; include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '$request_length $upstream_response_time $request_time'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; } stream { server { listen 5671 ssl; proxy_pass rabbitmq:5672; ssl_certificate /etc/ssl/certs/ssl-cert/fullchain1.pem; # managed by Certbot ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey1.pem; # managed by Certbot } }
и пробросьте файл в
hub-ui
таким способом:... volumes: ... - ./config/nginx/nginx.conf:/etc/nginx/nginx.conf ...
-
Необходимо открыть порты на двух NGINX - на ноде с AppSec.Hub:
hub-ui: ports: .... - 5671:5671/tcp
и на ноде с пайплайн-агентами:
.... ports: - 80:80/tcp - 443:443/tcp - 50052:50052/tcp - 50053:50053/tcp