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

Установка, запуск и резервное копирование

Требования к инфраструктуре

Установленные для эксплуатации 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)

  1. Обновите на сервере пакеты окружения и выполните подготовительные операции.

    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
    
    sudo yum -y update
    
  2. Установите последнюю версию Docker.

    sudo apt-get update
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
    curl -fsSL https://get.docker.com/ | sudo sh
    
  3. Запустите Docker.

    sudo systemctl start docker
    
  4. Убедитесь, что Docker успешно запущен.

    sudo systemctl status docker
    

    В командной строке должно отобразиться: Active: active (running).

  5. Для запуска Docker после перезагрузки сервера используйте следующую команду.

    sudo systemctl enable docker
    
  6. Проверьте версию Docker.

    sudo docker --version
    
  7. Установите 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
    
  8. Проверьте версию Docker-compose.

    sudo /usr/local/bin/docker-compose --version
    

Ubuntu/CentOS/RHEL (rootless Docker)

  1. Обновите на сервере пакеты окружения.

    sudo apt update
    sudo apt upgrade -y
    
    sudo yum -y update
    
  2. Установите последнюю версию Docker.

    curl -fsSL https://get.docker.com/ | sudo sh
    
  3. Выполните подготовку для установки rootless Docker.

    sudo apt install -y uidmap
    
    sudo sh -eux <<EOF
    echo "$USER:100000:65536" >> /etc/subuid
    echo "$USER:100000:65536" >> /etc/subgid
    EOF
    
  4. Установите rootless Docker.

    dockerd-rootless-setuptool.sh install
    
  5. Проверьте версию Docker.

    docker --version
    
  6. Установите 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
    
  7. Проверьте версию Docker-compose.

    /usr/local/bin/docker-compose --version
    

Настройка локального firewall

sudo ufw allow 443/tcp

Если БД устанавливается отдельно от AppSec.Hub, на инстансе с БД откройте порт 5432 (PostgreSQL).

sudo ufw allow 5432/tcp
sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Если БД устанавливается отдельно от AppSec.Hub, на инстансе с БД откройте порт 5432 (PostgreSQL).

sudo firewall-cmd --permanent --zone=public --add-port=5432/tcp

Установка AppSec.Hub с помощью Docker

Установка AppSec.Hub (root/rootless)

  1. Создайте папки.

    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
    
  2. Создайте конфигурационные файлы.

    /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 Приложение 1. Конфигурационный файл .env
    /opt/apphub/docker-compose.yml Приложение 9. Пример docker-compose.yml для контейнера AppSec.Hub
    /opt/apphub/config/hub-core/app.properties Приложение 4. Конфигурационный файл app.properties
    /opt/apphub/config/hub-core/auth.properties Приложение 12. Конфигурационный файл auth.properties
    /opt/apphub/config/hub-ui/hub.conf Приложение 13. Конфигурационный файл hub.conf
    /opt/apphub/config/postgresql/postgresql.conf Приложение 14. Конфигурационный файл postgresql.conf
    /opt/apphub/config/consul/server.json Приложение 3. Конфигурационный файл server.json
    /opt/apphub/docker/docker-bootstrap.sh Приложение 18. Конфигурационный файл metrics docker-bootstrap.sh
    /opt/apphub/docker/docker-init.sh Приложение 19. Конфигурационный файл metrics docker-init.sh
    /opt/apphub/docker/.env Приложение 20. Конфигурационный файл metrics .env
    /opt/apphub/docker/pythonpath_dev/superset_config.py Приложение 21. Конфигурационный файл metrics superset_config.py
    /opt/apphub/config/nginx/nginx.conf Приложение 22. Конфигурационный файл nginx.conf
  3. Выполните настройку конфигурационного файла /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;

      Примечание

      Для генерации паролей можно использовать следующую команду.

      dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2-17 | rev
      
    • MODEL_SECRET_KEY — ключ шифрования моделей AVC;

      Примечание

      Ключ шифрования моделей AVC необходимо получить у сотрудников компании Swordfish Security.

    • gateway_jwt_token — ключ подписи jwt-токена для сервиса gateway;

      Примечание

      Для генерации токена можно использовать следующую команду:

      dd if=/dev/urandom bs=1 count=64 2>/dev/null | base64 -w 0 | rev | cut -b 3- | rev
      

    • CONSUL_TOKEN — токен для доступа к сервису consul.

      Примечание

      Для генерации токена необходимо выполнить следующие команды и скопировать значение SecretID в переменную CONSUL_TOKEN в .env-файле:

      sudo docker-compose up -d consul
      sleep 20
      sudo docker exec -it consul sh -c "consul acl bootstrap | grep -i secretid"
      sudo docker-compose down
      

      Пример

      SecretID:         99f65ab5-ad40-0f8c-cbc8-aca384590eb6
      
    • SSO_ENC_KEY — ключ шифрования SSO;

      Примечание

      Для генерации ключа шифрования SSO можно использовать следующую команду:

      dd if=/dev/urandom bs=1 count=32 2>/dev/null | base64 -w 0 | rev | cut -b 2-17 | rev
      

    • 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.
  4. Выполните настройку конфигурационного файла /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.

  5. Выполните настройку конфигурационного файла /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 символа.

      Примечание

      Для генерации ключа можно использовать следующую команду.

      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, см. пункт 3.

  6. Выполните настройку конфигурационного файла /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> на значение, полученное в результате выполнения следующей команды.

      dd if=/dev/urandom bs=1 count=64 2>/dev/null | base64 -w 0 | rev | cut -b 2- | rev
      
  7. Выполните настройку конфигурационного файла /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.
  8. Выполните настройку конфигурационного файла /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.
  9. Для добавления возможности использования внутренних агентов сканирований на одном хосте или на разных хостах с AppSec.Hub, выполните шаги, описанные в разделах:

  10. Если в качестве доверенных необходимо добавить самоподписанные сертификаты, см. раздел «Добавление самоподписанных сертификатов в качестве доверенных».

  11. Назначьте группу и владельца локальных папок.

    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
    

    Установите разрешение на прослушивание привилегированных портов от непривилегированного пользователя.

    echo "net.ipv4.ip_unprivileged_port_start=0" | sudo tee -a /etc/sysctl.conf 
    sudo sysctl -p /etc/sysctl.conf
    

Установка AppSec.Hub с использованием Kubernetes Helm 3

Для получения Helm-чарт AppSec.Hub необходимо добавить OCI-совместимый Helm приватный реестр (registry.appsec.global) с теми же учетными данными, что и для доступа к образам контейнеров.

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

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

    helm pull oci://registry.appsec.global/appsechub/hub-helm/appsechub --version 0.2.7
    
  3. Сконфигурируйте параметры в файле 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.
    Пример модуля
    images:
        registry:
            name: registry.appsec.global
            ImagePullSecret:
                name: regcred
                create: true
                username: user
                password: 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.

  4. Установите 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 предоставляет следующие возможности:

  1. Устанавливает AppSec.Hub указанной версии (при наличии соответствующего образа установщика). На текущий момент поддерживается версия 2025.1.3.
  2. Автоматически генерирует пароли и ключи в конфигурационных файлах.
  3. Обеспечивает безопасную установку, исключающую нарушение работоспособности уже развернутого AppSec.Hub (при условии отсутствия ручных изменений в конфигурационных файлах).
  4. Исправляет ошибки в конфигурационных файлах (например, добавление пропущенных строк в app.properties).
  5. Автоматизирует правки конфигурации при обновлении AppSec.Hub.
  6. Обеспечивает настройку по протоколам HTTP и HTTPS.
  7. Импортирует CA-сертификаты без необходимости ручного копирования файла cacerts из контейнера hub-core.

Требования к серверу

Перед запуском необходимо убедиться, что:

  1. На сервере, куда будет производиться установка, установлены:

    • Docker (рекомендуется использовать версию, совместимую с docker-compose).
    • docker-compose версии не ниже 2.24.0.
  2. Есть доступ к репозиторию registry.appsec.global.

  3. Пользователь имеет права повышать привилегии до root (через sudo).

Для локального запуска (опционально):

  • Убедитесь, что Docker авторизован в registry.appsec.global.
  • Обеспечьте сетевой доступ до целевой машины через SSH.

Установка и запуск AppSec.Hub

  1. Подготовка к запуску.

    Запуск установки может осуществляться как локально, для установки на сервер, так и с сервера, на который необходимо установить AppSec.Hub. Основное различие между этими вариантами заключается в значении параметра hub_host:

    • При запуске с локального устройства в hub_host указывается IP-адрес сервера.
    • При запуске установки не посредственно на сервере в hub_host указывается локальный адрес (127.0.0.1).
  2. Авторизация в Docker Registry.

    На целевом сервере выполните команду для авторизации в Docker Registry:

    docker login registry.appsec.global
    

    Эта команда необходима для получения доступа к образам Docker.

  3. Запуск контейнера.

    Для запуска контейнера используйте один из следующих вариантов в зависимости от метода аутентификации:

    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 запросит пароль для выполнения операций.

  4. Настройка HTTPS.

    Для настройки HTTPS необходимо подключить volume с файлами сертификата и ключа.

    Требования:

    • Монтировать папку нужно в директорию /ssl в контейнере.
    • В папке должны находиться два файла: сертификат (с расширением .crt) и ключ (с расширением .key).
    docker run -v ./ssl:/ssl --network host -it --rm \  
        registry.appsec.global/appsechub/appsechub-installer:2025.1.3 \  
        -e hub_url="https://PLACE_ADDRESS" \  
        -e hub_host="127.0.0.1" \  
        -k --user YOUR_USERNAME  
    
  5. Добавление самоподписанных сертификатов (при необходимости использования).

    Для импорта корневых сертификатов необходимо подключить volume с файлами сертификатов.

    Требования:

    • Монтировать папку нужно в директорию /ca в контейнере.
    • В папке должны находиться файлы с расширениями .crt, .cert или .pem.

    Примечание

    На первом запуске создаётся чистый cacerts. При последующих запусках используются уже импортированные сертификаты.

    Для удаления устаревших или ошибочно импортированных сертификатов удалите файл cacerts из папки с корневыми сертификатами.

    Пример команды (с SSL и CA сертификатами):

    docker run -v ./ca:/ca -v ./ssl:/ssl --network host -it --rm \  
        registry.appsec.global/appsechub/appsechub-installer:2025.1.3 \  
        -e hub_url="https://PLACE_ADDRESS" \  
        -e hub_host="127.0.0.1" \  
        -k --user YOUR_USERNAME  
    
  6. Запуск Appsec.Hub на сервере.

    После выполнения вышеуказанных шагов перейдите в директорию /opt/apphub на сервере, куда производилась установка и выполните команды:

    cd /opt/apphub  
    docker-compose up -d 
    

Запуск 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.

Установка

  1. Создайте папки.

    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
    
  2. Сохраните файл с публичным ключом authorized_keys в папку ssh-pub-keys-all.

  3. Если в качестве доверенных необходимо добавить самоподписанные сертификаты, сохраните корневой сертификат или сертификаты всех узлов с расширением .crt в папку certs. Более подробная информация приведена в разделе «Безопасная сетевая конфигурация».

  4. Если для Docker в качестве доверенных необходимо добавить самоподписанные сертификаты, создайте папку docker-certs/<repo>, где <repo> — container registry, который указывается при авторизации.

    Например

    Если необходимо выполнить авторизацию с помощью команды docker login gitlab.example.com, создайте директорию docker-certs/gitlab.example.com и сохраните корневой сертификат или сертификат узла в ней.

  5. Задайте права пользователя на папки и файлы.

    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/
    
  6. Создайте файл /opt/jenkins/.env со следующим содержимым:

    hub_engine_manager_version=<version>
    hub_engine_version=<version>
    

    где <version> — последняя актуальная версия продукта, например — 2023.4.1.

  7. Для корректной работы контейнера docker-in-docker выполните следующие команды.

    sudo mkdir /sys/fs/cgroup/systemd
    sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
    
  8. Создайте файл /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
      
  9. Для корректной работы отдельных утилит и инструментов, например 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 и, используя их, можно войти в систему.

  10. Если необходимо использовать 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
    
  11. Выполните настройку 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
    
  12. Создайте директории.

    sudo mkdir /opt/jenkins/nginx
    sudo mkdir /opt/jenkins/ssl
    
  13. В директории ssl сохраните сертификат в файл fullchain.pem и ключ в файл privkey.pem.

  14. В директории 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;
            }
    
    }
    
  15. Для 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 JenkinsManage Users) и назначьте им права в матричном системе доступа (Manage JenkinsConfigure Global SecurityAuthenticationAuthorization (Matrix-based security)).

Подключение нод

  1. Перед добавлением slave node необходимо добавить приватный SSH-ключ в хранилище секретов Jenkins (Manage JenkinsManage Credentials).

    Перейдите в Jenkins (поле Store) › Global credentialsAdd Credentials и добавьте приватный ключ.

  2. Добавьте новый узел Manage JenkinsManage Nodes and CloudsNew Node, укажите название и нажмите OK.

  3. В меню настроек укажите следующие параметры:

    Параметр Значение
    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.

  4. Укажите для slave node порт 2022 (AdvancedPort).

  5. Укажите переменные окружения.

    Переменная Значение
    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 JenkinsIn-process Script Approval).

Добавление в Docker-образ hub-engine агентов Johnny и PT AISA

Для добавления агента Johnny (CodeScoring) и PT AISA в образ hub-engine необходимо выполнить следующие шаги:

  1. Создайте папку для сборки Docker-образа, скопируйте агента командной строки Johnny в созданную папку.

  2. Создайте в этой папке 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
    
  3. Далее необходимо запустить сборку Docker-файла, при необходимости заменив имя и тег образа.

    docker build -t registry.appsec.global/appsechub/hub-engine:2025.1.3-agent -f Dockerfile .
    

Резервное копирование

  1. Остановите AppSec.Hub, см. раздел «Остановка AppSec.Hub».
  2. Сделайте резервную копию директории установки AppSec.Hub (по умолчанию — /opt/apphub).
  3. Выполните резервное копирование директорий, относящихся к docker volumes, но расположенных за пределами директории установки.
  4. Запустите AppSec.Hub, см. раздел «Запуск AppSec.Hub».

Восстановление из резервной копии

  1. Остановите AppSec.Hub, см. раздел «Остановка AppSec.Hub».
  2. Переместите или переименуйте директорию установки AppSec.Hub (по умолчанию — /opt/apphub).
  3. Переместите или переименуйте директории, относящиеся к docker volumes, но расположенные за пределами директории установки (при наличии).
  4. Восстановите из резервной копии установочную директорию AppSec.Hub (по умолчанию — /opt/apphub).
  5. Восстановите из резервной копии директории, относящиеся к docker volumes, но расположенные за пределами директории установки.
  6. Запустите AppSec.Hub, см. раздел «Запуск AppSec.Hub».
  1. Восстановите из резервной копии установочную директорию AppSec.Hub (по умолчанию — /opt/apphub).
  2. Восстановите из резервной копии директории, относящиеся к docker volumes, но расположенные за пределами директории установки (при наличии).
  3. Запустите AppSec.Hub, см. раздел «Запуск AppSec.Hub».

Выполните базовый тест восстановленной установки:

  • Авторизация.
  • Просмотр списка инструментов, проверка соединения с ними (Test connection).
  • Просмотр списка приложений.
  • Просмотр результатов сканирования (Issues) и дефектов ИБ (Defects).
  • Выборочный запуск DevSecOps пайплайнов.
  • Просмотр результатов нового сканирования.

Настройка антивирусной защиты

На сервере с установленным AppSec.Hub необходимо установить антивирусное программное обеспечение в соответствии с политиками компании в области антивирусной защиты.

Настройка пайплайн-агентов на удаленном хосте с безопасным соединением TLS

При установке AppSec.Hub и Jenkins на разных хостах необходимо выполнить следующие шаги:

  1. Создайте директорию /opt/pipeline на удаленном хосте.

  2. Создайте на удаленном хосте файл 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
    
  3. Создайте в директории /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
    
  4. Создайте директорию 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 поддерживают GRPC «из коробки». Для более старых версий NGINX фрагмент

    listen 50052 ssl;
    http2 on;
    

    можно заменить на

    listen 50052 http2;
    

    Можно всегда использовать второй вариант, но новые версии будут при этом выдавать предупреждения (warnings).

  5. Положите сертификаты для NGINX в директорию /opt/pipeline/ssl.

Настройка SSL-соединения для доступа в hub-pipeline

  1. Зайдите на виртуальную машину где установлен AppSec.Hub.

  2. В конфигурационном файле /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
    
  3. Добавьте следующие строки в конец файла /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), на котором установлены пайплайн-агенты>
    
  4. Отредактируйте файл 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
    
  5. В файле для 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
    }
    
  6. Также в файле /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/;
    }
    
  7. Для настройки 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
    ...
    
  8. Необходимо открыть порты на двух NGINX - на ноде с AppSec.Hub:

    hub-ui:
        ports:
            ....
            - 5671:5671/tcp
    

    и на ноде с пайплайн-агентами:

    ....
        ports:
            - 80:80/tcp
            - 443:443/tcp
            - 50052:50052/tcp
            - 50053:50053/tcp
    
К началу