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

Установка AppSec.Hub

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

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

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

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

Установка 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

Выполните следующие шаги:

  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 — замените значения <pgsql_url>, <pgsql_port> и <hub_db_name> на значения соответствующих переменных из файла .env;

    • db.hub.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
    

Добавление в 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.4.2
    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
    
    RUN chown ubuntu:ubuntu /opt/codescoring/johnny \
        && chmod u+x /opt/codescoring/johnny
    
    USER ubuntu
    
  3. Далее необходимо запустить сборку Docker-файла, при необходимости заменив имя и тег образа.

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

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

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

  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-node-1:
            image: registry.appsec.global/appsechub/hub-pipeline-agent:${hub_pipeline_agent_version}
            container_name: hub-pipeline-agent-node-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-node-2:
            image: registry.appsec.global/appsechub/hub-pipeline-agent:${hub_pipeline_agent_version}
            container_name: hub-pipeline-agent-node-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.4.2
    
    # Директория для хранения архивов сканов для 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-node-1
    GRPC_ID=hub-pipeline-agent-node-1
    GRPC_NAME=hub-pipeline-agent-node-1
    GRPC_PORT="50052"
    GRPC_TAGS=["hub-pipeline-agent-node-1", "grpc-service"]
    # Переменные для hub-pipeline-agent-node-2
    GRPC_ID2=hub-pipeline-agent-node-2
    GRPC_NAME2=hub-pipeline-agent-node-2
    GRPC_PORT2="50053"
    GRPC_TAGS2=["hub-pipeline-agent-node-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-node-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-node-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.4.2
    hub_ui_version=2025.4.2
    hub_air_version=2025.4.2
    hub_db_version=2025.4.2
    hub_gateway_version=2025.4.2
    hub_issue_rule_version=2025.4.2
    hub_issue_version=2025.4.2
    hub_sso_version=2025.4.2
    hub_metrics_version=2025.4.2
    hub_metrics_bridge_version=2025.4.2
    

    И добавьте строки для версий образов новых микросервисов:

    hub_pipeline_version=2025.4.2
    rabbitmq_version=3.13-management
    
  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
    
К началу