Dependency-Track и SonarQube в GitLab CI: проверка кода и зависимостей

0
15
Обложка статьи: Dependency-Track и SonarQube в GitLab CI: проверка кода и зависимостей

SonarQube ищет проблемы в вашем коде (SAST), Dependency-Track следит за уязвимостями в сторонних библиотеках (SCA) по списку компонентов SBOM. Ниже подключение обоих к GitLab CI. Предполагается, что обе системы уже развёрнуты и доступны раннеру по внутреннему адресу.

Шаг 1. Токены в переменных GitLab

В проекте откройте Settings → CI/CD → Variables и создайте:

  • SONAR_HOST_URL — адрес SonarQube;
  • SONAR_TOKEN — токен проекта из SonarQube;
  • DT_URL — адрес Dependency-Track;
  • DT_API_KEY — ключ API команды с правом BOM_UPLOAD и PROJECT_CREATION_UPLOAD.

Отметьте токены как Masked и Protected. Токены не должны попасть в репозиторий и журналы: секреты в git.

Шаг 2. SonarQube в конвейере

sonarqube:
  stage: test
  image:
    name: sonarsource/sonar-scanner-cli:latest
    entrypoint: [""]
  variables:
    GIT_DEPTH: "0"
  script:
    - sonar-scanner
        -Dsonar.projectKey=$CI_PROJECT_PATH_SLUG
        -Dsonar.sources=.
        -Dsonar.host.url=$SONAR_HOST_URL
        -Dsonar.token=$SONAR_TOKEN
        -Dsonar.qualitygate.wait=true
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

Параметр qualitygate.wait=true заставляет задание завершиться с ошибкой, если проект не прошёл quality gate. Без него конвейер всегда зелёный. В старых версиях сканера вместо sonar.token используется sonar.login. Закрепите версию образа вместо latest.

Шаг 3. SBOM и загрузка в Dependency-Track

Для генерации списка компонентов выберите утилиту под язык, например cdxgen (универсальная) или cyclonedx-py для Python.

dependency-track:
  stage: test
  image: node:20
  script:
    - npx @cyclonedx/cdxgen -o bom.json .
    - curl -fsS -X POST "$DT_URL/api/v1/bom"
        -H "X-Api-Key: $DT_API_KEY"
        -F "autoCreate=true"
        -F "projectName=$CI_PROJECT_PATH_SLUG"
        -F "projectVersion=$CI_COMMIT_REF_SLUG"
        -F "bom=@bom.json"
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

Dependency-Track не заваливает конвейер сам: он принимает BOM и анализирует асинхронно. Правила (политики) и уведомления о новых уязвимостях настраиваются в его интерфейсе. Если нужна блокировка сборки, запросите метрики проекта через API и сравните с порогом в следующем шаге.

Шаг 4. Не открывайте системы наружу

  • SonarQube и Dependency-Track должны быть доступны раннеру по внутренней сети, а не из интернета.
  • Измените пароли по умолчанию. Дополнительно: безопасность Docker для самих контейнеров систем.

Как проверить

  • В GitLab задание sonarqube зелёное, а на тестовой ветке с заведомой проблемой падает на quality gate.
  • В SonarQube появился проект с ключом из $CI_PROJECT_PATH_SLUG и свежим анализом.
  • В Dependency-Track в списке проектов появился проект с компонентами и найденными уязвимостями.
  • Команда curl завершается с кодом 0. Ошибка 401 означает неверный ключ, 403 — недостаточно прав у команды.

Общий порядок защиты узла, где работает раннер: hardening Linux.

Оставьте свой ответ