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

Установка Jenkins

Важно!

Начиная с версии 2024.4.1, если планируется использование инструментов PT Application Inspector или CodeScoring, необходимо подготовить Docker-образ по инструкции, приведенной в разделе «Добавление в Docker-образ hub-engine агентов Johnny и PT AISA».

Master нода

За основу взята сборка Jenkins, запускаемая в rootless Docker. Для сборки используется нода master.

Установлен следующий набор плагинов
ace-editor:latest ant:latest antisamy-markup-formatter:latest apache-httpcomponents-client-4-api:latest authentication-tokens:latest bitbucket:latest blueocean:latest blueocean-autofavorite:latest blueocean-bitbucket-pipeline:latest blueocean-commons:latest blueocean-config:latest blueocean-core-js:latest blueocean-dashboard:latest blueocean-display-url:latest blueocean-events:latest blueocean-github-pipeline:latest blueocean-git-pipeline:latest blueocean-i18n:latest blueocean-jira:latest blueocean-jwt:latest blueocean-personalization:latest blueocean-pipeline-api-impl:latest blueocean-pipeline-editor:latest blueocean-pipeline-scm-api:latest blueocean-rest:latest blueocean-rest-impl:latest blueocean-web:latest bouncycastle-api:latest branch-api:latest build-pipeline-plugin:latest build-timeout:latest build-token-root:latest build-token-trigger:latest checkmarx:latest cloudbees-bitbucket-branch-source:latest cloudbees-folder:latest command-launcher:latest conditional-buildstep:latest configuration-as-code:latest copy-data-to-workspace-plugin:latest credentials:latest credentials-binding:latest dependency-check-jenkins-plugin:latest dependency-track:latest display-url-api:latest docker-commons:latest docker-workflow:latest durable-task:latest email-ext:latest external-monitor-job:latest favorite:latest generic-webhook-trigger:latest git:latest git-client:latest github:latest github-api:latest github-branch-source:latest gitlab-plugin:latest git-server:latest gradle:latest handlebars:latest handy-uri-templates-2-api:latest htmlpublisher:latest jackson2-api:latest javadoc:latest jdk-tool:latest jenkins-design-language:latest jira:latest job-fan-in:latest jquery:latest jquery-detached:latest jsch:latest junit:latest ldap:latest lockable-resources:latest mailer:latest mapdb-api:latest matrix-auth:latest matrix-project:latest maven-plugin:latest mercurial:latest metrics:latest momentjs:latest nested-view:latest nexus-jenkins-plugin:latest nuget:latest pam-auth:latest parameterized-trigger:latest permissive-script-security:latest pipeline-build-step:latest pipeline-graph-analysis:latest pipeline-input-step:latest pipeline-milestone-step:latest pipeline-model-api:latest pipeline-model-declarative-agent:latest pipeline-model-definition:latest pipeline-model-extensions:latest pipeline-rest-api:latest pipeline-stage-step:latest pipeline-stage-tags-metadata:latest pipeline-stage-view:latest plain-credentials:latest pubsub-light:latest resource-disposer:latest run-condition:latest scm-api:latest script-security:latest sloccount:latest sse-gateway:latest ssh-agent:latest ssh-credentials:latest ssh-slaves:latest stash-pullrequest-builder:latest structs:latest subversion:latest text-finder:latest timestamper:latest token-macro:latest trilead-api:latest variant:latest view-job-filters:latest windows-slaves:latest workflow-aggregator:latest workflow-api:latest workflow-basic-steps:latest workflow-cps:latest workflow-cps-global-lib:latest workflow-durable-task-step:latest workflow-job:latest workflow-multibranch:latest workflow-scm-step:latest workflow-step-api:latest workflow-support:latest ws-cleanup:latest

Во время запуска проводятся первоначальные настройки, которые задают учетные данные Администратора и базовый URL Jenkins, импортируют в систему все SSL-сертификаты как доверенные и устанавливают переменные окружения.

Slave нода

За основу взят базовый образ Ubuntu, который также запускается в rootless контейнере, поверх которого установлены утилиты и сборщики, необходимые для проведения сканирований.

Данный образ может работать со следующим списком утилит: mono, cdxgen, nuget, npm, java, maven и gradle.

При подключении ноды к Jenkins необходимо указать следующие метки: all super jenkins-slave-node-all maven mono npm nodejs docker java python pypi cdxgen.

Установка

  1. Создайте папки.

    sudo mkdir -p /opt/jenkins/jenkins_home
    sudo mkdir -p /opt/jenkins/jenkins-slave-all
    sudo mkdir -p /opt/jenkins/ssh-pub-keys-all
    sudo mkdir -p /opt/jenkins/certs
    sudo mkdir -p /opt/jenkins/docker-certs
    sudo mkdir -p /opt/jenkins/fortify
    
  2. Сохраните файл с публичным ключом authorized_keys в папку ssh-pub-keys-all.

  3. Если в качестве доверенных необходимо добавить самоподписанные сертификаты, сохраните корневой сертификат или сертификаты всех узлов с расширением .crt в папку certs. Более подробная информация приведена в разделе «Безопасная сетевая конфигурация».

  4. Если для Docker в качестве доверенных необходимо добавить самоподписанные сертификаты, создайте папку docker-certs/<repo>, где <repo> — container registry, который указывается при авторизации.

    Например

    Если необходимо выполнить авторизацию с помощью команды docker login gitlab.example.com, создайте директорию docker-certs/gitlab.example.com и сохраните корневой сертификат или сертификат узла в ней.

  5. Задайте права пользователя на папки и файлы.

    sudo chown 1000:1000 -R /opt/jenkins/jenkins_home
    sudo chmod 775 -R /opt/jenkins/fortify
    sudo chown 1000:2000 -R /opt/jenkins/fortify
    sudo chown 2000:2000 -R /opt/jenkins/jenkins-slave-all
    sudo chmod 600 /opt/jenkins/ssh-pub-keys-all/authorized_keys
    sudo chown 2000:2000 /opt/jenkins/ssh-pub-keys-all/authorized_keys
    sudo chmod 755 -R /opt/jenkins/certs/
    sudo chown 1000:2000 -R /opt/jenkins/certs/
    
    export REMAP_UID=$(cat /etc/subuid | grep -i $USER | awk -F : '{print $2}')
    export UID_2000=$((${REMAP_UID}+1999))
    export UID_1000=$((${REMAP_UID}+999))
    
    sudo chown ${UID_1000}:${UID_1000} -R /opt/jenkins/jenkins_home
    sudo chmod 775 -R /opt/jenkins/fortify
    sudo chown ${UID_1000}:${UID_2000} -R /opt/jenkins/fortify
    sudo chown ${UID_2000}:${UID_2000} -R /opt/jenkins/jenkins-slave-all
    sudo chmod 600 /opt/jenkins/ssh-pub-keys-all/authorized_keys
    sudo chown ${UID_2000}:${UID_2000} /opt/jenkins/ssh-pub-keys-all/authorized_keys
    sudo chown ${UID_2000}:${UID_2000} -R /opt/jenkins/ssh-pub-keys-all
    sudo chmod 755 -R /opt/jenkins/certs/
    sudo chown ${UID_1000}:${UID_2000} -R /opt/jenkins/certs/
    
  6. Создайте файл /opt/jenkins/.env со следующим содержимым:

    hub_engine_manager_version=<version>
    hub_engine_version=<version>
    

    где <version> — последняя актуальная версия продукта, например — 2025.4.2.

  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_ADMIN_PASSWORD. При запуске Jenkins соответствующие параметры берутся из перечисленных переменных.

    Если после запуска необходимо скрыть учетные данные Администратора, следует убрать переменные JENKINS_ADMIN_USER и JENKINS_ADMIN_PASSWORD из docker-compose.yaml — текущие учетные данные (username/password) будут сохранены в Jenkins и, используя их, можно войти в систему.

  10. Если необходимо использовать Fortify, предварительно создав файл license/fortify.license с лицензией для него, добавьте в docker-compose.yaml следующий раздел.

    fortify-node:
        image: registry.appsec.global/appsechub/hub-engine:${hub_engine_version}
        container_name: node-fortify
        user: 2000:2000
        networks:
            - network
        restart: always
        environment:
            - LANG=en_US.utf-8
            - "JAVA_OPTS=-DLANG=en_US.UTF-8"
        volumes:
            - ./certs:/tmp/certs
            - ./ssh-pub-keys-all:/home/ubuntu/.ssh
            - ./jenkins-slave-fortify:/home/ubuntu/jenkins-slave
            - ./fortify/projects_fortify:/fortify/projects
            - ./license/fortify.license:/opt/Fortify/Fortify_SCA_and_Apps_21.1.1/fortify.license
    
  11. Выполните настройку HTTPS-соединения, добавив в docker-compose.yaml следующий раздел.

    nginx:
        image: registry.appsec.global/public/sfs-nginx:latest
        container_name: nginx
        networks:
            - network
        volumes:
            - ./nginx:/etc/nginx/conf.d:ro
            - ./ssl:/etc/ssl/certs/ssl-cert:ro
        restart: always
        ports:
            - 80:80/tcp
            - 443:443/tcp
    
  12. Создайте директории.

    sudo mkdir /opt/jenkins/nginx
    sudo mkdir /opt/jenkins/ssl
    
  13. В директории ssl сохраните сертификат в файл fullchain.pem и ключ в файл privkey.pem.

  14. В директории nginx создайте конфигурационный файл для reverse-proxy — web.conf и в параметре server_name укажите URL Jenkins.

    server {
        listen 80;
        server_name jenkins.company.com; # Укажите URL для доступа к Jenkins.
        ignore_invalid_headers off;
        proxy_connect_timeout       600;
        proxy_send_timeout          600;
        proxy_read_timeout          600;
        send_timeout                600;
        client_max_body_size       100m;
    
        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
    
            proxy_pass http://jenkins:8080;
    
        }
        listen 443 ssl;
            ssl_certificate /etc/ssl/certs/ssl-cert/fullchain1.pem;
            ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey1.pem;
    
            if ($scheme != "https") {
                return 301 https://$host$request_uri;
            }
    
    }
    
  15. Для rootless Docker установите разрешение на прослушивание привилегированных портов от непривилегированного пользователя.

    echo "net.ipv4.ip_unprivileged_port_start=0" | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p /etc/sysctl.conf
    

Запуск

Запуск осуществляется с помощью следующей команды (из директории docker-compose.yaml).

cd /opt/jenkins
sudo docker-compose up -d

После запуска Jenkins будет доступен на порту 8080.

Важно

После запуска даже у анонимного пользователя будут права администратора. После первого запуска добавьте всех необходимых пользователей (Manage JenkinsManage Users) и назначьте им права в матричном системе доступа (Manage JenkinsConfigure Global SecurityAuthenticationAuthorization (Matrix-based security)).

Подключение нод

  1. Перед добавлением slave node необходимо добавить приватный SSH-ключ в хранилище секретов Jenkins (Manage JenkinsManage Credentials).

    Перейдите в Jenkins (поле Store) › Global credentialsAdd Credentials и добавьте приватный ключ.

  2. Добавьте новый узел Manage JenkinsManage Nodes and CloudsNew Node, укажите название и нажмите OK.

  3. В меню настроек укажите следующие параметры:

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

    В выпадающем списке Host Key Verification Strategy выберите Non verifying Verification Strategy и нажмите Save.

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

К началу