Установка, запуск и резервное копирование
Требования к инфраструктуре
Установленные для эксплуатации 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).
- Ubuntu/CentOS/RHEL (rootless Docker).
- Astra Linux (root Docker).
- Astra Linux (rootless Docker).
Ubuntu/CentOS/RHEL (root Docker)
-
Обновите на сервере пакеты окружения и выполните подготовительные операции.
sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
-
Установите последнюю версию Docker.
-
Запустите Docker.
sudo systemctl start docker
-
Убедитесь, что Docker успешно запущен.
sudo systemctl status docker
В командной строке должно отобразиться:
Active: active (running)
. -
Для запуска Docker после перезагрузки сервера используйте следующую команду.
sudo systemctl enable docker
-
Проверьте версию Docker.
sudo docker --version
-
Установите Docker-compose версии 2.2.3.
export VERSION="v2.2.3" # выпущена до 2022.02.24 (6 января 2022) export DESTINATION=/usr/local/bin/docker-compose sudo curl -L https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m) -o $DESTINATION sudo chmod 755 $DESTINATION
Или более свежую.
sudo curl -SL https://github.com/docker/compose/releases/download/v2.19.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
-
Проверьте версию Docker-compose.
sudo /usr/local/bin/docker-compose --version
Ubuntu/CentOS/RHEL (rootless Docker)
-
Обновите на сервере пакеты окружения.
-
Установите последнюю версию Docker.
curl -fsSL https://get.docker.com/ | sudo sh
-
Выполните подготовку для установки rootless Docker.
sudo apt install -y uidmap sudo sh -eux <<EOF echo "$USER:100000:65536" >> /etc/subuid echo "$USER:100000:65536" >> /etc/subgid EOF
-
Установите rootless Docker.
dockerd-rootless-setuptool.sh install
-
Проверьте версию Docker.
docker --version
-
Установите Docker-compose.
export VERSION=$(curl --silent https://api.github.com/repos/docker/compose/releases/latest | grep -Po '"tag_name": "\K.*\d') export DESTINATION=/usr/local/bin/docker-compose sudo curl -L https://github.com/docker/compose/releases/download/${VERSION}/docker-compose-$(uname -s)-$(uname -m) -o $DESTINATION sudo chmod 755 $DESTINATION
-
Проверьте версию Docker-compose.
/usr/local/bin/docker-compose --version
Astra Linux (root Docker)
-
Обновите на сервере пакеты окружения, а также операционную систему до версии 1.7.4 (версия ядра не ниже 5.15.0-70-generic).
sudo apt update sudo apt dist-upgrade sudo apt install curl
-
Установите последнюю версию Docker.
sudo apt install -y docker.io
-
Запустите Docker.
sudo systemctl start docker
-
Убедитесь, что Docker успешно запущен.
sudo systemctl status docker
В командной строке должно отобразиться:
Active: active (running)
. -
Для запуска Docker после перезагрузки сервера используйте следующую команду.
sudo systemctl enable docker
-
Проверьте версию Docker.
sudo docker --version
-
Установите 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
-
Проверьте версию Docker-compose.
sudo /usr/local/bin/docker-compose --version
Astra Linux (rootless Docker)
-
Обновите на сервере пакеты окружения.
sudo apt update sudo apt upgrade -y
-
Установите последнюю версию Docker, а также вспомогательные утилиты.
sudo apt install -y docker.io rootless-helper-astra curl
-
Запустите Docker от непривилегированного пользователя (замените
<username>
на имя пользователя в системе).sudo systemctl start rootless-docker@<username>
-
Убедитесь, что Docker успешно запущен.
sudo systemctl status rootless-docker@<username>
В командной строке должно отобразиться:
Active: active (running)
. -
Для запуска Docker после перезагрузки сервера используйте следующую команду.
sudo systemctl enable rootless-docker@<username>
-
Проверьте версию Docker.
rootlessenv docker --version
-
Установите 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
-
Проверьте версию 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
Если БД устанавливается отдельно от AppSec.Hub, на инстансе с БД откройте порт 5432
(PostgreSQL).
Установка AppSec.Hub (root/rootless)
-
Создайте папки.
sudo mkdir -p /opt/apphub/config/hub-core sudo mkdir -p /opt/apphub/config/hub-ui sudo mkdir -p /opt/apphub/config/postgresql sudo mkdir -p /opt/apphub/config/consul sudo mkdir -p /opt/apphub/logs/hub-air sudo mkdir -p /opt/apphub/logs/hub-core sudo mkdir -p /opt/apphub/logs/hub-ui sudo mkdir -p /opt/apphub/ml/local sudo mkdir -p /opt/apphub/logs/postgresql sudo mkdir -p /opt/apphub/postgresql/data sudo mkdir -p /opt/apphub/ssl sudo mkdir -p /opt/apphub/consul-data sudo mkdir -p /opt/apphub/zapfiles sudo mkdir -p /opt/apphub/db-data/ sudo mkdir -p /opt/apphub/docker/pythonpath_dev
-
Создайте конфигурационные файлы.
/opt/apphub/.env /opt/apphub/docker-compose.yml /opt/apphub/config/hub-core/app.properties /opt/apphub/config/hub-core/auth.properties /opt/apphub/config/hub-ui/hub.conf /opt/apphub/config/postgresql/postgresql.conf /opt/apphub/config/consul/server.json /opt/apphub/docker/docker-bootstrap.sh /opt/apphub/docker/docker-init.sh /opt/apphub/docker/.env /opt/apphub/docker/pythonpath_dev/superset_config.py
Примеры конфигурационных файлов приведены в следующих приложениях.
-
Выполните настройку конфигурационного файла /opt/apphub/.env. Укажите следующие параметры:
-
pgsql_admin_password
— пароль пользователя с административным доступом к основной схеме БД; -
hub_app_password
— пароль пользователя БД для работы AppSec.Hub; -
hub_auth_password
— пароль пользователя для сервиса аутентификации AppSec.Hub; -
hub_adm_password
— пароль пользователя с правами администратора на БД AppSec.Hub; -
hub_bi_password
— пароль пользователя с правами работы с AppSec.Hub DWH; -
MODEL_SECRET_KEY
— ключ шифрования моделей AVC;Примечание
Ключ шифрования моделей AVC необходимо получить у сотрудников компании Swordfish Security.
-
gateway_jwt_token
— ключ подписи jwt-токена для сервиса gateway; -
consul_token
— токен для доступа к сервису consul.Примечание
Для генерации токена необходимо выполнить следующие команды и скопировать значение
SecretID
в переменнуюconsul_token
в .env-файле: -
SSO_ENC_KEY
— ключ шифрования SSO; -
HUB_URL
— URL AppSec.Hub, например, https://hub.your.domain.local; -
metrics_pg_password
— пароль пользователя с административным доступом БД метрик; metrics_db_password
— пароль пользователя БД;metrics_password
— пароль пользователя метрик;pgtt_scheduler_db_password
— пароль пользователя scheduler БД метрик.
-
-
Выполните настройку конфигурационного файла /opt/apphub/config/hub-ui/hub.conf. В «Приложении 13. Конфигурационный файл hub.conf» приведен пример конфигурации для HTTPS-соединения, если планируется использовать HTTP, удалите из файла следующий раздел.
listen 4443 ssl; ssl_certificate /etc/ssl/certs/ssl-cert/fullchain1.pem; ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey1.pem; if ($scheme != "https") { return 301 https://$host$request_uri; }
Укажите параметр
server_name
— доменное имя сервера/сервиса, на котором будет развернут AppSec.Hub. -
Выполните настройку конфигурационного файла /opt/apphub/config/hub-core/app.properties.
-
db.hub.url
иdb.presentation.url
— замените значения<pgsql_url>
,<pgsql_port>
и<hub_db_name>
на значения соответствующих переменных из файла .env; -
db.hub.password
иdb.presentation.password
— замените<hub_app_password>
на значение соответствующей переменной из файла .env; -
encrypt.key
— замените<HUBAPP-ENC-KEY>
на значение ключа шифрования паролей, используемых для доступа к инструментам ИБ. Размер ключа — 24 символа. -
hub.app.url
— замените на URL, который будет использоваться для доступа к AppSec.Hub. -
hub.consul.token
— замените значение параметра на токен для сервиса consul, см. пункт 3.
-
-
Выполните настройку конфигурационного файла /opt/apphub/config/hub-core/auth.properties.
-
db.auth.url
— замените значения<pgsql_url>
,<pgsql_port>
и<hub_db_name>
на значения соответствующих переменных из файла .env. -
db.auth.password
— замените<hub_auth_password>
на значение переменнойhub_auth_password
из файла .env. -
jwt.token.signing.key
— замените<HUBAPP-SIGN-KEY>
на значение, полученное в результате выполнения следующей команды.
-
-
Выполните настройку конфигурационного файла /opt/apphub/docker/docker-init.sh, см. «Приложение 19. Конфигурационный файл metrics docker-init.sh». В скрипте инициализации базы данных metrics, в секции, определяющей администратора БД metrics:
superset fab create-admin \ --username admin \ --firstname Superset \ --lastname Admin \ --email admin@superset.com \
укажите следующие параметры:
--username
— логин пользователя с правами администратора БД metrics;--firstname
— имя пользователя с правами администратора БД metrics;--lastname
— фамилия пользователя с правами администратора БД metrics;--email
— электронная почта пользователя с правами администратора БД metrics.
-
Выполните настройку конфигурационного файла /opt/apphub/docker/.env, см. «Приложение 20. Конфигурационный файл metrics .env». Укажите следующие параметры:
DATABASE_PASSWORD
,POSTGRES_PASSWORD
— пароль пользователя с административным доступом к основной схеме БД metrics;ADMIN_PASSWORD
— пароль пользователя администратора metrics, по умолчанию будет иметь значениеadmin
;SUPERSET_SECRET_KEY
— установите для этого параметра значение, полученное в результате выполнения следующей команды:openssl rand -base64 42
.
-
Если в качестве доверенных необходимо добавить самоподписанные сертификаты, см. раздел «Добавление самоподписанных сертификатов в качестве доверенных».
-
Назначьте группу и владельца локальных папок.
sudo chown 2000:2000 -R /opt/apphub/config/hub-core sudo chown 101:101 -R /opt/apphub/config/hub-ui sudo chown 70:70 -R /opt/apphub/config/postgresql sudo chown 2000:2000 -R /opt/apphub/logs/hub-air sudo chown 2000:2000 -R /opt/apphub/logs/hub-core sudo chown 101:101 -R /opt/apphub/logs/hub-ui sudo chown 2000:2000 -R /opt/apphub/ml/local sudo chown 70:70 -R /opt/apphub/logs/postgresql sudo chown 70:70 -R /opt/apphub/postgresql/data sudo chown 101:101 -R /opt/apphub/ssl sudo chown 100:1000 -R /opt/apphub/consul-data sudo chown 100:1000 -R /opt/apphub/config/consul sudo chown 2000:2000 -R /opt/apphub/zapfiles sudo chown 70:70 -R /opt/apphub/db-data sudo chown 100:1000 -R /opt/apphub/docker/ sudo chmod u+x /opt/apphub/docker/docker-bootstrap.sh sudo chmod u+x /opt/apphub/docker/docker-init.sh
export REMAP_UID=$(cat /etc/subuid | grep -i $USER | awk -F : '{print $2}') export UID_2000=$((${REMAP_UID}+1999)) export UID_101=$((${REMAP_UID}+100)) export UID_70=$((${REMAP_UID}+69)) export UID_100=$((${REMAP_UID}+99)) export UID_1000=$((${REMAP_UID}+999)) sudo chown ${UID_2000}:${UID_2000} -R /opt/apphub/config/hub-core sudo chown ${UID_101}:${UID_101} -R /opt/apphub/config/hub-ui sudo chown ${UID_70}:${UID_70} -R /opt/apphub/config/postgresql sudo chown ${UID_2000}:${UID_2000} -R /opt/apphub/logs/hub-air sudo chown ${UID_2000}:${UID_2000} -R /opt/apphub/logs/hub-core sudo chown ${UID_101}:${UID_101} -R /opt/apphub/logs/hub-ui sudo chown ${UID_2000}:${UID_2000} -R /opt/apphub/ml/local sudo chown ${UID_70}:${UID_70} -R /opt/apphub/logs/postgresql sudo chown ${UID_70}:${UID_70} -R /opt/apphub/postgresql/data sudo chown ${UID_101}:${UID_101} -R /opt/apphub/ssl sudo chown ${UID_100}:${UID_1000} -R /opt/apphub/consul-data sudo chown ${UID_100}:${UID_1000} -R /opt/apphub/config/consul sudo chown ${UID_2000}:${UID_2000} -R /opt/apphub/zapfiles sudo chown ${UID_70}:${UID_70} -R /opt/apphub/db-data sudo chown ${UID_1000}:${UID_1000} -R /opt/apphub/docker/ sudo chmod u+x /opt/apphub/docker/docker-bootstrap.sh sudo chmod u+x /opt/apphub/docker/docker-init.sh
Установите разрешение на прослушивание привилегированных портов от непривилегированного пользователя.
Установка AppSec.Hub на Astra Linux (root/rootless)
-
Создайте папки.
sudo mkdir -p /opt/apphub/config/hub-core sudo mkdir -p /opt/apphub/config/hub-ui sudo mkdir -p /opt/apphub/config/postgresql sudo mkdir -p /opt/apphub/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
-
Создайте конфигурационные файлы.
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 -
Выполните настройку конфигурационного файла /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; -
consul_token
— токен для доступа к сервису consul. Он будет сгенерирован после запуска consul.Примечание
Для генерации токена необходимо выполнить следующие команды (из директории, где установлен AppSec.Hub) и скопировать значение
SecretID
в переменнуюconsul_token
в .env-файле: -
SSO_ENC_KEY
— ключ шифрования SSO; -
HUB_URL
— URL AppSec.Hub, например, https://hub.your.domain.local; -
metrics_pg_password
— пароль пользователя с административным доступом БД метрик; metrics_db_password
— пароль пользователя БД;metrics_password
— пароль пользователя метрик;pgtt_scheduler_db_password
— пароль пользователя scheduler БД метрик.
-
Выполните настройку конфигурационного файла /opt/apphub/config/hub-ui/hub.conf, см. «Приложение 13. Конфигурационный файл hub.conf». Приведен пример конфигурации для HTTPS-соединения, если планируется использовать HTTP, удалите из файла следующий раздел.
listen 4443 ssl; ssl_certificate /etc/ssl/certs/ssl-cert/fullchain1.pem; ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey1.pem; if ($scheme != "https") { return 301 https://$host$request_uri; }
Укажите параметр
server_name
— доменное имя сервера/сервиса, на котором будет развернут AppSec.Hub. -
Выполните настройку конфигурационного файла /opt/apphub/config/hub-core/app.properties, см. «Приложение 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.
-
-
Выполните настройку конфигурационного файла /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
-
Выполните настройку конфигурационного файла /opt/apphub/docker/docker-init.sh, см. «Приложение 19. Конфигурационный файл metrics docker-init.sh». В скрипте инициализации базы данных metrics, в секции, определяющей администратора БД metrics:
superset fab create-admin \ --username admin \ --firstname Superset \ --lastname Admin \ --email admin@superset.com \
укажите следующие параметры:
--username
— логин пользователя с правами администратора БД metrics;--firstname
— имя пользователя с правами администратора БД metrics;--lastname
— фамилия пользователя с правами администратора БД metrics;--email
— электронная почта пользователя с правами администратора БД metrics.
-
Выполните настройку конфигурационного файла /opt/apphub/docker/.env, см. «Приложение 20. Конфигурационный файл metrics .env». Укажите следующие параметры:
DATABASE_PASSWORD
,POSTGRES_PASSWORD
— пароль пользователя с административным доступом к основной схеме БД metrics;ADMIN_PASSWORD
— пароль пользователя администратора metrics, по умолчанию будет иметь значениеadmin
;SUPERSET_SECRET_KEY
— установите для этого параметра значение, полученное в результате выполнения следующей команды:openssl rand -base64 42
.
-
Если в качестве доверенных необходимо добавить самоподписанные сертификаты, см. раздел «Добавление самоподписанных сертификатов в качестве доверенных».
-
Назначьте группу и владельца локальных папок.
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
Установите разрешение на прослушивание привилегированных портов от непривилегированного пользователя.
Установка AppSec.Hub с использованием Kubernetes Helm 3
-
Добавьте репозиторий Helm 3.
helm repo add sfs https://registry.appsec.global/repository/sfs-helm/ \ --username <username> --password <password> helm repo update
-
Скачайте версию AppSec.Hub.
helm pull sfs/appsechub
-
Сконфигурируйте параметры в файле 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
.
Пример модуля
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.
-
Установите 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 предоставляет следующие возможности:
- Устанавливает AppSec.Hub указанной версии (при наличии соответствующего образа установщика). На текущий момент поддерживается версия 2025.1.1.
- Автоматически генерирует пароли и ключи в конфигурационных файлах.
- Обеспечивает безопасную установку, исключающую нарушение работоспособности уже развернутого AppSec.Hub (при условии отсутствия ручных изменений в конфигурационных файлах).
- Исправляет ошибки в конфигурационных файлах (например, добавление пропущенных строк в app.properties).
- Автоматизирует правки конфигурации при обновлении AppSec.Hub.
- Обеспечивает настройку по протоколам HTTP и HTTPS.
- Импортирует CA-сертификаты без необходимости ручного копирования файла cacerts из контейнера hub-core.
Требования к серверу, куда будет производиться установка
Перед запуском необходимо убедиться, что:
-
На сервере установлены:
- Docker (рекомендуется использовать версию, совместимую с docker-compose).
- docker-compose версии не ниже 2.24.0.
-
Есть доступ к репозиторию
registry.appsec.global
. - Пользователь имеет права повышать привилегии до
root
(черезsudo
).
Для локального запуска (опционально):
- Убедитесь, что Docker авторизован в
registry.appsec.global
. - Обеспечьте сетевой доступ до целевой машины через SSH.
Установка и запуск AppSec.Hub
-
Подготовка к запуску.
Запуск установки может осуществляться как локально, для установки на сервер, так и с сервера, на который необходимо установить AppSec.Hub. Основное различие между этими вариантами заключается в значении параметра
hub_host
:- При запуске с локального устройства в
hub_host
указывается IP-адрес сервера. - При запуске установки не посредственно на сервере в
hub_host
указывается локальный адрес (127.0.0.1
).
- При запуске с локального устройства в
-
Авторизация в Docker Registry.
На целевом сервере выполните команду для авторизации в Docker Registry:
docker login registry.appsec.global
Эта команда необходима для получения доступа к образам Docker.
-
Запуск контейнера.
Для запуска контейнера используйте один из следующих вариантов в зависимости от метода аутентификации:
1. С использованием логина и пароля.
``` docker run --network host -it --rm registry.appsec.global/appsechub/appsechub-installer:2025.1.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 запросит пароль для выполнения операций. -
Настройка HTTPS.
Для настройки HTTPS необходимо подключить volume с файлами сертификата и ключа.
Требования:
- Монтировать папку нужно в директорию
/ssl
в контейнере. - В папке должны находиться два файла: сертификат (с расширением
.crt
) и ключ (с расширением.key
).
- Монтировать папку нужно в директорию
-
Добавление самоподписанных сертификатов (при необходимости использования).
Для импорта корневых сертификатов необходимо подключить volume с файлами сертификатов.
Требования:
- Монтировать папку нужно в директорию
/ca
в контейнере. - В папке должны находиться файлы с расширениями
.crt
,.cert
или.pem
.
Примечание
На первом запуске создаётся чистый
cacerts
. При последующих запусках используются уже импортированные сертификаты.Для удаления устаревших или ошибочно импортированных сертификатов удалите файл
cacerts
из папки с корневыми сертификатами.Пример команды (с SSL и CA сертификатами):
- Монтировать папку нужно в директорию
-
Запуск Appsec.Hub на сервере.
После выполнения вышеуказанных шагов перейдите в директорию
/opt/apphub
на сервере, куда производилась установка и выполните команды:
Запуск AppSec.Hub
После запуска AppSec.Hub будет доступен по URL, указанном в файле /opt/apphub/config/hub-core/app.properties (см. параметр hub_url
).
Имя предустановленного пользователя — hubadm
, пароль — qweasd123
.
Остановка AppSec.Hub
Установка Jenkins (root/rootless)
Важно!
Начиная с версии 2024.4.1, если планируется использование инструментов PT Application Inspector или CodeScoring, необходимо подготовить Docker-образ по инструкции, приведенной в разделе «Добавление в Docker-образ hub-engine агентов Johnny и PT AISA».
Master нода
За основу взята сборка Jenkins, запускаемая в rootless Docker. Для сборки используется нода master.
Установлен следующий набор плагинов
ace-editor:latest ant:latest antisamy-markup-formatter:latest apache-httpcomponents-client-4-api:latest authentication-tokens:latest bitbucket:latest blueocean:latest blueocean-autofavorite:latest blueocean-bitbucket-pipeline:latest blueocean-commons:latest blueocean-config:latest blueocean-core-js:latest blueocean-dashboard:latest blueocean-display-url:latest blueocean-events:latest blueocean-github-pipeline:latest blueocean-git-pipeline:latest blueocean-i18n:latest blueocean-jira:latest blueocean-jwt:latest blueocean-personalization:latest blueocean-pipeline-api-impl:latest blueocean-pipeline-editor:latest blueocean-pipeline-scm-api:latest blueocean-rest:latest blueocean-rest-impl:latest blueocean-web:latest bouncycastle-api:latest branch-api:latest build-pipeline-plugin:latest build-timeout:latest build-token-root:latest build-token-trigger:latest checkmarx:latest cloudbees-bitbucket-branch-source:latest cloudbees-folder:latest command-launcher:latest conditional-buildstep:latest configuration-as-code:latest copy-data-to-workspace-plugin:latest credentials:latest credentials-binding:latest dependency-check-jenkins-plugin:latest dependency-track:latest display-url-api:latest docker-commons:latest docker-workflow:latest durable-task:latest email-ext:latest external-monitor-job:latest favorite:latest generic-webhook-trigger:latest git:latest git-client:latest github:latest github-api:latest github-branch-source:latest gitlab-plugin:latest git-server:latest gradle:latest handlebars:latest handy-uri-templates-2-api:latest htmlpublisher:latest jackson2-api:latest javadoc:latest jdk-tool:latest jenkins-design-language:latest jira:latest job-fan-in:latest jquery:latest jquery-detached:latest jsch:latest junit:latest ldap:latest lockable-resources:latest mailer:latest mapdb-api:latest matrix-auth:latest matrix-project:latest maven-plugin:latest mercurial:latest metrics:latest momentjs:latest nested-view:latest nexus-jenkins-plugin:latest nuget:latest pam-auth:latest parameterized-trigger:latest permissive-script-security:latest pipeline-build-step:latest pipeline-graph-analysis:latest pipeline-input-step:latest pipeline-milestone-step:latest pipeline-model-api:latest pipeline-model-declarative-agent:latest pipeline-model-definition:latest pipeline-model-extensions:latest pipeline-rest-api:latest pipeline-stage-step:latest pipeline-stage-tags-metadata:latest pipeline-stage-view:latest plain-credentials:latest pubsub-light:latest resource-disposer:latest run-condition:latest scm-api:latest script-security:latest sloccount:latest sse-gateway:latest ssh-agent:latest ssh-credentials:latest ssh-slaves:latest stash-pullrequest-builder:latest structs:latest subversion:latest text-finder:latest timestamper:latest token-macro:latest trilead-api:latest variant:latest view-job-filters:latest windows-slaves:latest workflow-aggregator:latest workflow-api:latest workflow-basic-steps:latest workflow-cps:latest workflow-cps-global-lib:latest workflow-durable-task-step:latest workflow-job:latest workflow-multibranch:latest workflow-scm-step:latest workflow-step-api:latest workflow-support:latest ws-cleanup:latest
Во время запуска проводятся первоначальные настройки, которые задают учетные данные Администратора и базовый URL Jenkins, импортируют в систему все SSL-сертификаты как доверенные и устанавливают переменные окружения.
Slave нода
За основу взят базовый образ Ubuntu, который также запускается в rootless контейнере, поверх которого установлены утилиты и сборщики, необходимые для проведения сканирований.
Данный образ может работать со следующим списком утилит: mono
, cdxgen
, nuget
, npm
, java
, maven
и gradle
.
При подключении ноды к Jenkins необходимо указать следующие метки: all super jenkins-slave-node-all maven mono npm nodejs docker java python pypi cdxgen
.
Установка
-
Создайте папки.
sudo mkdir -p /opt/jenkins/jenkins_home sudo mkdir -p /opt/jenkins/jenkins-slave-all sudo mkdir -p /opt/jenkins/ssh-pub-keys-all sudo mkdir -p /opt/jenkins/certs sudo mkdir -p /opt/jenkins/docker-certs sudo mkdir -p /opt/jenkins/fortify
-
Сохраните файл с публичным ключом authorized_keys в папку ssh-pub-keys-all.
-
Если в качестве доверенных необходимо добавить самоподписанные сертификаты, сохраните корневой сертификат или сертификаты всех узлов с расширением .crt в папку certs. Более подробная информация приведена в разделе «Безопасная сетевая конфигурация».
-
Если для Docker в качестве доверенных необходимо добавить самоподписанные сертификаты, создайте папку docker-certs/<repo>, где
<repo>
— container registry, который указывается при авторизации.Например
Если необходимо выполнить авторизацию с помощью команды
docker login gitlab.example.com
, создайте директорию docker-certs/gitlab.example.com и сохраните корневой сертификат или сертификат узла в ней. -
Задайте права пользователя на папки и файлы.
sudo chown 1000:1000 -R /opt/jenkins/jenkins_home sudo chmod 775 -R /opt/jenkins/fortify sudo chown 1000:2000 -R /opt/jenkins/fortify sudo chown 2000:2000 -R /opt/jenkins/jenkins-slave-all sudo chmod 600 /opt/jenkins/ssh-pub-keys-all/authorized_keys sudo chown 2000:2000 /opt/jenkins/ssh-pub-keys-all/authorized_keys sudo chmod 755 -R /opt/jenkins/certs/ sudo chown 1000:2000 -R /opt/jenkins/certs/
export REMAP_UID=$(cat /etc/subuid | grep -i $USER | awk -F : '{print $2}') export UID_2000=$((${REMAP_UID}+1999)) export UID_1000=$((${REMAP_UID}+999)) sudo chown ${UID_1000}:${UID_1000} -R /opt/jenkins/jenkins_home sudo chmod 775 -R /opt/jenkins/fortify sudo chown ${UID_1000}:${UID_2000} -R /opt/jenkins/fortify sudo chown ${UID_2000}:${UID_2000} -R /opt/jenkins/jenkins-slave-all sudo chmod 600 /opt/jenkins/ssh-pub-keys-all/authorized_keys sudo chown ${UID_2000}:${UID_2000} /opt/jenkins/ssh-pub-keys-all/authorized_keys sudo chown ${UID_2000}:${UID_2000} -R /opt/jenkins/ssh-pub-keys-all sudo chmod 755 -R /opt/jenkins/certs/ sudo chown ${UID_1000}:${UID_2000} -R /opt/jenkins/certs/
-
Создайте файл /opt/jenkins/.env со следующим содержимым:
hub_engine_manager_version=<version> hub_engine_version=<version>
где
<version>
— последняя актуальная версия продукта, например —2023.4.1
. -
Для корректной работы контейнера docker-in-docker выполните следующие команды.
sudo mkdir /sys/fs/cgroup/systemd sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
-
Создайте файл /opt/jenkins/docker-compose.yaml, пример см. в «Приложении 10».
Важно!
При использовании rootless Docker на хостовой системе контейнер docker-in-docker начинает работать нестабильно. В качестве альтернативы предлагается использовать внешний Docker-демон, взаимодействие с которым осуществляется через SSH-соединение. Таким образом, проводя операции с Docker-контейнерами в образе node-all (запуск, удаление и т. п.), мы проводим эти операции на удалённом хосте, с которым установлено соединение. Важно, что для обеспечения работоспособности такой системы не обязательно иметь 2 инстанса — можно использовать тот же хост, на котором происходит установка Jenkins. Далее приведена инструкция по конфигурации подключения удалённого Docker-демона.
-
Уберите из docker-compose.yaml сервис docker-in-docker.
-
На отдельном хосте установите rootless Docker (хост может быть тот, на котором устанавливается Jenkins).
-
Создайте SSH-ключи БЕЗ ПАРОЛЯ.
-
Запишите ключ удаленного хоста в файл known_hosts (измените
<domain>
на доменное имя хоста, на котором запущен rootless Docker):ssh-keyscan -H <domain> | sudo tee -a /opt/jenkins/ssh-pub-keys-all/known_hosts
-
Сохраните публичный SSH-ключ в файл /home/<user>/.ssh/authorized_keys на хосте, где запущен rootless Docker (замените
<user>
на имя пользователя на удаленном хосте, от которого запущен Docker). -
Сохраните приватный ключ в файл с названием
id_rsa
в директорию /opt/jenkins/ssh-pub-keys-all на хосте, где устанавливается Jenkins. -
Замените в файле docker-compose.yaml значение переменной
DOCKER_HOST
в сервисах Jenkins и node-all наssh://<user>@<domain>
, где<user>
— имя пользователя, от которого на удаленном хосте запущен Docker, а<domain>
— доменное имя хоста, на котором запущен rootless Docker. -
Если владельцем Docker-сокета является непривилегированный пользователь, установите необходимые права и владельца на добавленные файлы.
export REMAP_UID=$(cat /etc/subuid | grep -i $USER | awk -F : '{print $2}') export UID_2000=$((${REMAP_UID}+1999)) export UID_1000=$((${REMAP_UID}+999)) sudo chmod 600 /opt/jenkins/ssh-pub-keys-all/known_hosts sudo chown ${UID_2000}:${UID_2000} /opt/jenkins/ssh-pub-keys-all/known_hosts sudo chmod 400 /opt/jenkins/ssh-pub-keys-all/id_rsa sudo chown ${UID_2000}:${UID_2000} /opt/jenkins/ssh-pub-keys-all/id_rsa sudo chown ${UID_2000}:${UID_2000} -R /opt/jenkins/ssh-pub-keys-all
-
-
Для корректной работы отдельных утилит и инструментов, например cdxgen, могут потребоваться переменные окружения, которые указываются в файле docker-compose.yaml (раздел environment сервиса jenkins). Перечень переменных окружения контейнера hub-engine-manager приведен в Приложении 11.
Примечание
Для автоматического конфигурирования URL Jenkins и учетных данных Администратора используются переменные окружения:
JENKINS_URL
,JENKINS_ADMIN_USER
,JENKINS_PASSADMIN_PASSWORD
. При запуске Jenkins соответствующие параметры берутся из перечисленных переменных.Если после запуска необходимо скрыть учетные данные Администратора, следует убрать переменные
JENKINS_ADMIN_USER
иJENKINS_ADMIN_PASSPASSWORD
из docker-compose.yaml — текущие учетные данные (username
/password
) будут сохранены в Jenkins и, используя их, можно войти в систему. -
Если необходимо использовать Fortify, предварительно создав файл license/fortify.license с лицензией для него, добавьте в docker-compose.yaml следующий раздел.
fortify-node: image: registry.appsec.global/appsechub/hub-engine:${hub_engine_version} container_name: node-fortify user: 2000:2000 networks: - network restart: always environment: - LANG=en_US.utf-8 - "JAVA_OPTS=-DLANG=en_US.UTF-8" volumes: - ./certs:/tmp/certs - ./ssh-pub-keys-all:/home/ubuntu/.ssh - ./jenkins-slave-fortify:/home/ubuntu/jenkins-slave - ./fortify/projects_fortify:/fortify/projects - ./license/fortify.license:/opt/Fortify/Fortify_SCA_and_Apps_21.1.1/fortify.license
-
Выполните настройку HTTPS-соединения, добавив в docker-compose.yaml следующий раздел.
nginx: image: registry.appsec.global/public/sfs-nginx:latest container_name: nginx networks: - network volumes: - ./nginx:/etc/nginx/conf.d:ro - ./ssl:/etc/ssl/certs/ssl-cert:ro restart: always ports: - 80:80/tcp - 443:443/tcp
-
Создайте директории.
sudo mkdir /opt/jenkins/nginx sudo mkdir /opt/jenkins/ssl
-
В директории ssl сохраните сертификат в файл fullchain.pem и ключ в файл privkey.pem.
-
В директории nginx создайте конфигурационный файл для reverse-proxy — web.conf и в параметре
server_name
укажите URL Jenkins.server { listen 80; server_name jenkins.company.com; # Укажите URL для доступа к Jenkins. ignore_invalid_headers off; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; client_max_body_size 100m; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_pass http://jenkins:8080; } listen 443 ssl; ssl_certificate /etc/ssl/certs/ssl-cert/fullchain1.pem; ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey1.pem; if ($scheme != "https") { return 301 https://$host$request_uri; } }
-
Для rootless Docker установите разрешение на прослушивание привилегированных портов от непривилегированного пользователя.
echo "net.ipv4.ip_unprivileged_port_start=0" | sudo tee -a /etc/sysctl.conf sudo sysctl -p /etc/sysctl.conf
Запуск
Запуск осуществляется с помощью следующей команды (из директории docker-compose.yaml).
cd /opt/jenkins
sudo docker-compose up -d
После запуска Jenkins будет доступен на порту 8080
.
Важно
После запуска даже у анонимного пользователя будут права администратора. После первого запуска добавьте всех необходимых пользователей (Manage Jenkins › Manage Users) и назначьте им права в матричном системе доступа (Manage Jenkins › Configure Global Security › Authentication › Authorization (Matrix-based security)).
Подключение нод
-
Перед добавлением slave node необходимо добавить приватный SSH-ключ в хранилище секретов Jenkins (Manage Jenkins › Manage Credentials).
Перейдите в Jenkins (поле Store) › Global credentials › Add Credentials и добавьте приватный ключ.
-
Добавьте новый узел Manage Jenkins › Manage Nodes and Clouds › New Node, укажите название и нажмите OK.
-
В меню настроек укажите следующие параметры и нажмите 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
-
Укажите для slave node порт
2022
(Advanced › Port). -
Укажите переменные окружения.
Переменная Значение LANG en_US.UTF-8
PATH ${PATH}:/usr/local/go/bin:/opt/gradle/gradle-8.7.0/bin
При добавлении slave ноды Fortify необходимо указать в Jenkins следующую переменную окружения.
Название Значение PATH ${PATH}:/opt/Fortify/Fortify_SCA_and_Apps_21.1.1/bin
При успешном добавлении статус ноды изменится на In Sync.
Важно!
При интеграции AppSec.Hub и Jenkins некоторые сканирования могут заканчиваться неуспешно, если не дать разрешение на исполнение Groovy-скриптам, которые появляются в Jenkins (Manage Jenkins › In-process Script Approval).
Добавление в Docker-образ hub-engine агентов Johnny и PT AISA
Для добавления агента Johnny (CodeScoring) и PT AISA в образ hub-engine необходимо выполнить следующие шаги:
-
Создайте папку для сборки Docker-образа, скопируйте агента командной строки Johnny в созданную папку.
-
Создайте в этой папке Dockerfile со следующим содержимым, изменив версии образа hub-engine и агентов на необходимые (если один из агентов использовать не планируется, то необходимо удалить блок кода, содержащий установку этого агента):
FROM registry.appsec.global/appsechub/hub-engine:2025.1.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
-
Далее необходимо запустить сборку Docker-файла, при необходимости заменив имя и тег образа.
docker build -t registry.appsec.global/appsechub/hub-engine:2025.1.1-agent -f Dockerfile .
Резервное копирование
- Остановите AppSec.Hub, см. раздел «Остановка AppSec.Hub».
- Сделайте резервную копию директории установки AppSec.Hub (по умолчанию — /opt/apphub).
- Выполните резервное копирование директорий, относящихся к docker volumes, но расположенных за пределами директории установки.
- Запустите AppSec.Hub, см. раздел «Запуск AppSec.Hub».
Восстановление из резервной копии
- Остановите AppSec.Hub, см. раздел «Остановка AppSec.Hub».
- Переместите или переименуйте директорию установки AppSec.Hub (по умолчанию — /opt/apphub).
- Переместите или переименуйте директории, относящиеся к docker volumes, но расположенные за пределами директории установки (при наличии).
- Восстановите из резервной копии установочную директорию AppSec.Hub (по умолчанию — /opt/apphub).
- Восстановите из резервной копии директории, относящиеся к docker volumes, но расположенные за пределами директории установки.
- Запустите AppSec.Hub, см. раздел «Запуск AppSec.Hub».
- Восстановите из резервной копии установочную директорию AppSec.Hub (по умолчанию — /opt/apphub).
- Восстановите из резервной копии директории, относящиеся к docker volumes, но расположенные за пределами директории установки (при наличии).
- Запустите AppSec.Hub, см. раздел «Запуск AppSec.Hub».
Выполните базовый тест восстановленной установки:
- Авторизация.
- Просмотр списка инструментов, проверка соединения с ними (Test connection).
- Просмотр списка приложений.
- Просмотр результатов сканирования (Issues) и дефектов ИБ (Defects).
- Выборочный запуск DevSecOps пайплайнов.
- Просмотр результатов нового сканирования.
Настройка антивирусной защиты
На сервере с установленным AppSec.Hub необходимо установить антивирусное программное обеспечение в соответствии с политиками компании в области антивирусной защиты.