При запуске выполняются первоначальные настройки, позволяющие:
определить пользователя с ролью Администратор и установить пароль для его учетной записи;
указать базовый URL Jenkins;
выполнить импорт в систему всех SSL-сертификатов в качестве доверенных;
определить некоторые переменные окружения до запуска инсталляции Jenkins.
Jenkins Slave Node
Используется базовый образ Ubuntu, который запускается в rootless контейнере. Дополнительно установлены утилиты и сборщики, необходимые для проведения сканирований. Возможна работа со следующими утилитами: mono, cdxgen, nuget, npm, java, maven и gradel. При подключении ноды к Jenkins необходимо указать следующие метки: all super jenkins-slave-node-all maven mono npm nodejs docker java python pypi cdxgen.
Настройка
Для запуска используйте следующий docker-compose.yaml.
Для корректной работы отдельных утилит и инструментов, например cdxgen, могут потребоваться переменные окружения, которые указываются в файле docker-compose.yaml, см. строки 22–27 выше. Более подробная информация о переменных окружения приведена здесь.
Примечание
Для автоматического конфигурирования URL Jenkins и учетных данных Администратора используются переменные окружения: JENKINS_URL, JENKINS_ADMIN_USER, JENKINS_PASSADMIN_PASSWORD. При запуске Jenkins соответствующие параметры берутся из перечисленных переменных. Если после запуска необходимо скрыть учетные данные Администратора, следует убрать переменные JENKINS_ADMIN_USER и JENKINS_ADMIN_PASSPASSWORD из docker-compose.yaml — текущие username/password будут сохранены в Jenkins и, используя их, можно войти в систему.
Список используемых переменных окружения
Переменная
Описание
JENKINS_URL
URL Jenkins master ноды
JENKINS_ADMIN_USER
Имя Администратора в Jenkins
JENKINS_ADMIN_PASSWORD
Пароль Администратора в Jenkins
DOCKER_HOST
URL демона Docker
gradle_dependency_task
Имя задачи по умолчанию для скачивания пакетов для утилиты cdxgen
fetch_license
Скачивание информации о лицензии из репозиториев для cdxgen (только для npm и golang) (необязательный параметр, в случае ненадобности — удалить)
maven_home
Домашняя папка maven
gradle_home
Домашняя папка gradle
github_token
Токен Github (необязательный параметр, в случае ненадобности — удалить)
gradle_args
Аргументы запуска утилиты gradle (необязательный параметр, в случае ненадобности — удалить)
mvn_args
Аргументы запуска утилиты mvn (необязательный параметр, в случае ненадобности — удалить)
cdxgen_npm_url
URL репозитория npm для утилиты cdxgen
cdxgen_maven_central_url
URL репозитория maven для утилиты cdxgen
cdxgen_android_maven
URL репозитория Android для утилиты cdxgen
cdxgen_pypi_url
URL репозитория PyPi для утилиты cdxgen
cdxgen_go_url
URL репозитория Go для утилиты cdxgen
cdxgen_nuget_url
URL репозитория nuget для утилиты cdxgen
В директории, где расположен файл docker-compose.yaml, создайте файл .env.
touch .env
И укажите в нем версии для Jenkins и slave-all образов.
jenkins_version=2.0
slave_all_version=2.0
Для подключения к slave ноде по SSH создайте директорию ssh-pub-keys-all и сохраните в ней файл authorized_keys, содержащий публичный ключ. Приватный ключ добавляется в Jenkins, см. раздел «Подключение нод в Jenkins».
Большинство утилит считают самоподписанные сертификаты невалидными — можно столкнуться с проблемами при работе по протоколу HTTPS. Чтобы избежать этого, необходимо добавить сертификаты как доверенные. Перенесите все файлы с расширением .crt в папку certs и после запуска они будут автоматически добавлены в систему как доверенные. Если файлов с расширением .crt нет, но есть сертификаты другого типа от того же домена, их можно сконвертировать следующим образом.
openssl x509 -inform DER -in certificate.cer -out certificate.crt
# Если возникает ошибка, необходимо выполнить следующую команду.
openssl x509 -inform PEM -in certificate.cer -out certificate.crt
openssl pkcs12 -in certificate.pfx -clcerts -nokeys -out certificate.crt
# Потребуется ввод пароля, с использованием которого был зашифрован сертификат.
Если есть необходимость добавить доверенный сертификат для docker, необходимо создать в папке с файлом docker-compose.yaml директорию docker-certs/<repo>, где <repo> — container registry, который указывается при логине, например, если необходимо выполнить вход с помощью команды docker login gitlab.example.com, то необходмио создать директорию docker-certs/gitlab.example.com и сохранить .crt сертификат в ней.
Под инсталляцию рекомендуется выделять отдельную директорию, например /opt/jenkins. При необходимости использования Fortify в Jenkins как slave ноду нужно добавить в docker-compose.yaml следующий код. Предварительно необходимо создать файл с лицензией для Fortify по пути license/fortify.license.
В директории ssl необходимо создать 2 файла fullchain1.pem и privkey1.pem с сертификатом и приватным ключом соответственно.
Поскольку контейнеры запускаются от имени непривилегированного пользователя, необходимо до запуска назначить необходимые права владельца и группу на директории, которые импортируются в контейнеры.
Создайте папки в директории с файлом docker-compose.yaml.
sudo chown 1000:1000 -R jenkins_home
sudo chown 2000:2000 -R fortify
sudo chown 2000:2000 -R jenkins-slave-all
sudo chmod 600 ssh-pub-keys-all/authorized_keys # команду выполнять после того как был сохранён файл authorized_keys с содержанием публичного ключа
sudo chown 2000:2000 -R ssh-pub-keys-all
sudo chmod 755 -R certs
sudo chmod 440 -R certs/* # команду выполнять после того как были импортированы все сертификаты в директорию
sudo chown 1000:2000 -R certs/* # команду выполнять после того как были импортированы все сертификаты в директорию
Запуск
Запуск осуществляется с помощью следующей команды (из директории с файлом docker-compose.yaml).
docker login docker.swordfishsecurity.com -u <user> -p <password>
docker-compose up -d
После запуска Jenkins будет доступен на порту 8080.
Подключение нод в Jenkins
Перед добавлением slave ноды необходимо добавить приватный 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 ноды порт 2022 (Advanced→Port).
Укажите переменные окружения.
Переменная
Значение
LANG
en_US.UTF-8
PATH
${PATH}:/opt/gradle/gradle-6.4.1/bin
При успешном добавлении статус ноды изменится на In Sync.
Важно!
При интеграции AppSec.Hub и Jenkins некоторые сканирования могут заканчиваться неуспешно, если не дать разрешение на исполнение Groovy-скриптам, которые появляются в Jenkins (Manage Jenkins→In-process Script Approval).
Обновление Jenkins до версии 2.0
Остановите Jenkins (команда выполняется из директории, где располагается файл docker-compose.yaml).
docker-compose down
В этой же директории в файле .env укажите следующие переменные (если такой файл отсутствует, его необходимо создать).
jenkins_version=2.0
slave_all_version=2.0
Замените файл docker-compose.yaml приведенным в разделе «Настройка».
Создайте директории, которые передаются в контейнеры, и задайте пользователя и группу.
mkdir jenkins_home
mkdir jenkins-slave-all
mkdir ssh-pub-keys-all
mkdir certs
mkdir docker-certs
mkdir fortify
sudo chown 1000:1000 -R jenkins_home
sudo chown 2000:2000 -R fortify
sudo chown 2000:2000 -R jenkins-slave-all
sudo chmod 600 ssh-pub-keys-all/authorized_keys # команду выполнять после того как был сохранён файл authorized_keys с содержанием публичного ключа
sudo chown 2000:2000 -R ssh-pub-keys-all
sudo chmod 755 -R certs
sudo chmod 440 -R certs/* # команду выполнять после того как были импортированы все сертификаты в директорию
sudo chown 1000:2000 -R certs/* # команду выполнять после того как были импортированы все сертификаты в директорию
Примечание
После обновления Jenkins до актуальной версии могут появиться ошибки зависимостей плагинов.
Для их устранения необходимо из директории jenkins_home удалить папку plugins.
rm -rf jenkins_home/plugins
После удаления в контейнере будет создана новая директория с плагинами, совместимыми с актуальной версией Jenkins.
Запустите Jenkins.
docker-compose up -d
Важно
После полной инициализации Jenkins возникнет ожидаемая ошибка подключения Jenkins master к slave ноде. Связано это с тем, что был изменён порт SSH-сервера на slave ноде, пользователь и корневая директория для Jenkins. Для решения проблемы необходимо указать параметры из раздела «Подключение нод в Jenkins» в настройках подключения slave-all ноды и после переподключения нода станет доступна.