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

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

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

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

Astra Linux (root Docker)

  1. Обновите на сервере пакеты окружения, а также операционную систему до версии 1.7.4 (версия ядра не ниже 5.15.0-70-generic).

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

    sudo apt install -y docker.io
    
  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.

    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
    
  8. Проверьте версию Docker-compose.

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

Astra Linux (rootless Docker)

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

    sudo apt update
    sudo apt upgrade -y
    
  2. Установите последнюю версию Docker, а также вспомогательные утилиты.

    sudo apt install -y docker.io rootless-helper-astra curl
    
  3. Запустите Docker от непривилегированного пользователя (замените <username> на имя пользователя в системе).

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

    sudo systemctl status rootless-docker@<username>
    

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

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

    sudo systemctl enable rootless-docker@<username>
    
  6. Проверьте версию Docker.

    rootlessenv docker --version
    
  7. Установите Docker-compose.

    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
    
  8. Проверьте версию Docker-compose.

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

Примечание

Для упрощения работы с Docker и Docker-compose рекомендуется добавить следующие alias в файл .bash_aliases в домашней директории пользователя (после выполнения команды необходимо перезайти на хост).

cat << EOF >> ~/.bash_aliases
alias docker='rootlessenv docker'
alias docker-compose='rootlessenv docker-compose'
EOF

Настройка локального 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 (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
    

    Примеры конфигурационных файлов приведены в следующих приложениях.

    Файл Приложение
    /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
  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 — пароль пользователя метрик;
    • pgtt_scheduler_db_password — пароль пользователя scheduler БД метрик.
  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;
    • ADMIN_PASSWORD — пароль пользователя администратора metrics, по умолчанию будет иметь значение admin;
    • SUPERSET_SECRET_KEY — установите для этого параметра значение, полученное в результате выполнения следующей команды: openssl rand -base64 42.
  9. Если в качестве доверенных необходимо добавить самоподписанные сертификаты, см. раздел «Добавление самоподписанных сертификатов в качестве доверенных».

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

    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 на Astra Linux (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/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/config/consul
    sudo mkdir -p /opt/apphub/zapfiles
    sudo mkdir -p /opt/apphub/db-data/
    sudo mkdir -p /opt/apphub/docker/pythonpath_dev
    
  2. Создайте конфигурационные файлы.

    sudo touch /opt/apphub/.env
    sudo touch /opt/apphub/docker-compose.yml
    sudo touch /opt/apphub/config/hub-core/app.properties
    sudo touch /opt/apphub/config/hub-core/auth.properties
    sudo touch /opt/apphub/config/hub-ui/hub.conf
    sudo touch /opt/apphub/config/postgresql/postgresql.conf
    sudo touch /opt/apphub/config/consul/server.json
    sudo touch /opt/apphub/docker/docker-bootstrap.sh
    sudo touch /opt/apphub/docker/docker-init.sh
    sudo touch /opt/apphub/docker/.env
    sudo touch /opt/apphub/docker/pythonpath_dev/superset_config.py
    

    Примеры конфигурационных файлов приведены в следующих приложениях.

    Примечание

    При rootless установке в файле docker-compose.yml необходимо заменить строку user: "root" на строку user: "superset" в секциях metrics и metrics-init.

    Файл Приложение
    .env Приложение 1. Конфигурационный файл .env
    docker-compose.yml Приложение 9. Пример docker-compose.yml для контейнера AppSec.Hub
    app.properties Приложение 4. Конфигурационный файл app.properties
    auth.properties Приложение 12. Конфигурационный файл auth.properties
    hub.conf Приложение 13. Конфигурационный файл hub.conf
    postgresql.conf Приложение 14. Конфигурационный файл postgresql.conf
    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
  3. Выполните настройку конфигурационного файла /opt/apphub/.env, см. «Приложение 1. Конфигурационный файл .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. Он будет сгенерирован после запуска consul.

      Примечание

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

      docker-compose up -d consul
      docker exec -it consul sh -c "consul acl bootstrap | grep -i secretid"
      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 — пароль пользователя метрик;
    • pgtt_scheduler_db_password — пароль пользователя scheduler БД метрик.
  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, см. «Приложение 4. Конфигурационный файл 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>на значение ключа шифрования паролей, используемых для доступа к инструментам ИБ. Рекомендованный размер ключа — 32 символа.

      Примечание

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

      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, см. «Приложение 12. Конфигурационный файл auth.properties».

    • db.auth.url — замените значения <pgsql_url>, <pgsql_port> и <hub_db_name> на значения соответствующих переменных из файла .env.
    • db.auth.password — замените <hubauth-user-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 3- | 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;
    • ADMIN_PASSWORD — пароль пользователя администратора metrics, по умолчанию будет иметь значение admin;
    • SUPERSET_SECRET_KEY — установите для этого параметра значение, полученное в результате выполнения следующей команды: openssl rand -base64 42.
  9. Если в качестве доверенных необходимо добавить самоподписанные сертификаты, см. раздел «Добавление самоподписанных сертификатов в качестве доверенных».

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

    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 1000: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 REMAP_GID=$(cat /etc/subgid | grep -i $USER | awk -F : '{print $2}')
    export UID_2000=$((${REMAP_UID}+1999))
    export GID_2000=$((${REMAP_GID}+1999))
    export UID_101=$((${REMAP_UID}+100))
    export GID_101=$((${REMAP_GID}+100))
    export UID_70=$((${REMAP_UID}+69))
    export GID_70=$((${REMAP_GID}+69))
    export UID_100=$((${REMAP_UID}+99))
    export GID_100=$((${REMAP_GID}+99))
    export UID_1000=$((${REMAP_UID}+999))
    export GID_1000=$((${REMAP_GID}+999))
    
    sudo chown ${UID_2000}:${GID_2000} -R /opt/apphub/config/hub-core
    sudo chown ${UID_101}:${GID_101} -R /opt/apphub/config/hub-ui
    sudo chown ${UID_70}:${GID_70} -R /opt/apphub/config/postgresql
    sudo chown ${UID_2000}:${GID_2000} -R /opt/apphub/logs/hub-air
    sudo chown ${UID_2000}:${GID_2000} -R /opt/apphub/logs/hub-core
    sudo chown ${UID_101}:${GID_101} -R /opt/apphub/logs/hub-ui
    sudo chown ${UID_2000}:${GID_2000} -R /opt/apphub/ml/local
    sudo chown ${UID_70}:${GID_70} -R /opt/apphub/logs/postgresql
    sudo chown ${UID_70}:${GID_70} -R /opt/apphub/postgresql/data
    sudo chown ${UID_101}:${GID_101} -R /opt/apphub/ssl
    sudo chown ${UID_100}:${GID_1000} -R /opt/apphub/consul-data
    sudo chown ${UID_100}:${GID_1000} -R /opt/apphub/config/consul
    sudo chown ${UID_2000}:${GID_2000} -R /opt/apphub/zapfiles
    sudo chown ${UID_70}:${GID_70} -R /opt/apphub/db-data
    sudo chown ${UID_2000}:${GID_2000} -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

  1. Добавьте репозиторий Helm 3.

    helm repo add sfs https://registry.appsec.global/repository/sfs-helm/ \
        --username <username> --password <password>
    helm repo update
    
  2. Скачайте версию AppSec.Hub.

    helm pull sfs/appsechub
    
  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 - если вы хотите создать секрет, укажите закодированные в base64 значения для username и password.
    Пример модуля
    images:
        registry:
            name: registry.appsec.global
            ImagePullSecret:
                name: regcred
                create: true
                username: c29tZXVzZXI=  # base64 от "someuser"
                password: c29tZXBhc3N3b3Jk  # base64 от "somepassword"
    

    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. Настройка 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.
    Пример модуля
    hubEngine:
        # -- Запуск 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 (см. документацию)
        authorized_keys:
    
        nodes:
            - fullname: hub-engine-1
                image:
                    name: appsechub/hub-engine
                    pullPolicy: Always
                    repository: registry.appsec.global
                    tag: 2025.1.1
                #  replicaCount: 1
                service:
                    enableIp: null
                    externalTrafficPolicy: Local
                    ip: null
                    port: 2022
                    targetPort: 2022
                    portName: port2022
                    type: ClusterIP
                    annotations: {}
                resources:
                    requests:
                        memory: "128Mi"
                        cpu: "50m"
                    limits:
                        memory: "4096Mi"
                        cpu: "500m"
                pvc:
                    enable: true
                    storageClassName: yc-network-ssd
                    storage: 10Gi
                    accessModes:
                        - ReadWriteOnce
                    path: /home/ubuntu/jenkins_slave
                nodeSelector:
                    disk: ssd
                strategy:
                    type: Recreate
                env:
                    timezone: Europe/Moscow
                volumemounts: {}
                volumes: {}
    

    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. Включение метрик в 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 из модуля hubcore.
    • Укажите пароль для пользователя metrics в разделе postgresql. Пароль должен совпадать с db_pass, указанным в supersetNode.
    • Включите использование PVC, указав storageClass, accessModes, size - размер тома.
    • В разделе hubmetricsbridge укажите следующие параметры:
      • PGPASSWORD - пароль администратора БД метрик.
      • CHEDULER_DB_PASSWORD - пароль пользователя scheduler БД метрик.
      • METRICS_DB_PASSWORD - пароль пользователя метрик.
      • REMOTE_PASSWORD_DB - пароль пользователя с правами администратора на БД AppSec.Hub.
      • METRICS_PASSWORD - имя пользователя метрик.
    • В разделе hubmetricspgtimetable укажите пароль пользователя scheduler в разделе hubmetricspgtimetable в параметре PGTT_PGPASSWORD.
    Пример модуля
    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: 'пароль_для_metrics'
        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 * * * *"
            nodeSelector: {}
    
        hubmetricspgtimetable:
            PGTT_PGPASSWORD: 'пароль_scheduler'
    

    3.14. Для более гибкой настройки смотрите файл values.yaml.

  4. Установите AppSec.Hub.

    helm upgrade --install hub sfs/appsechub -f values.yaml
    

Установка и использование AppSec.Hub Installer

В этом разделе приведена инструкция по установке и использованию AppSec.Hub Installer версии 2025.1.1.

Важно!

Установка с помощью AppSec.Hub Installer может быть произведена на Ubuntu/CentOS/RHEL для root-конфигурации.

Возможности установщика

AppSec.Hub Installer предоставляет следующие возможности:

  1. Устанавливает AppSec.Hub указанной версии (при наличии соответствующего образа установщика). На текущий момент поддерживается версия 2025.1.1.
  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.1 \
        -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.1 \
        -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.1 \  
        -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.1 \  
        -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
cd /opt/apphub
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
cd /opt/apphub
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. В меню настроек укажите следующие параметры и нажмите Save.

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

  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.1
    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
    
    FROM registry.appsec.global/appsechub/hub-engine:2025.1.1-astra
    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 astra
    
  3. Далее необходимо запустить сборку Docker-файла, при необходимости заменив имя и тег образа.

    docker build -t registry.appsec.global/appsechub/hub-engine:2025.1.1-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 необходимо установить антивирусное программное обеспечение в соответствии с политиками компании в области антивирусной защиты.

К началу