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

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

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

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

  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. Если в качестве доверенных необходимо добавить самоподписанные сертификаты, см. раздел «Добавление самоподписанных сертификатов в качестве доверенных».

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

    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
    
    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
    

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

    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
    
  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
    

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

    Файл Приложение
    .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
  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

  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. Если в качестве доверенных необходимо добавить самоподписанные сертификаты, см. раздел «Добавление самоподписанных сертификатов в качестве доверенных».

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

    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
    
    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
    

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

    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://docker.swordfishsecurity.com/repository/sfs-helm/ \
        --username <username> --password <password>
    helm repo update
    
  2. Скачайте версию AppSec.Hub.

    helm pull sfs/appsechub
    
  3. Сконфигурируйте параметры в файле values.yaml.

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

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

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

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: docker.swordfishsecurity.com/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: docker.swordfishsecurity.com/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).

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

  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 необходимо установить антивирусное программное обеспечение в соответствии с политиками компании в области антивирусной защиты.

К началу