Aller au contenu
Sécurité medium

Dependency-Track : centraliser la gestion des SBOM

23 min de lecture

dependency-track logo

Dependency-Track est une plateforme open-source qui centralise l’analyse des vulnérabilités de tous vos projets. Vous uploadez des SBOM (Software Bill of Materials), et Dependency-Track les corrèle automatiquement avec les bases de vulnérabilités (NVD, GitHub Advisories, OSS Index). Contrairement aux scanners ponctuels, il surveille en continu : une vulnérabilité découverte demain sur une dépendance présente dans 50 projets vous alertera automatiquement.

Ce guide couvre l’installation (Docker, Kubernetes), la configuration des sources de vulnérabilités, l’API REST, l’intégration CI/CD et les alertes (Slack, Teams, email).

  • Comprendre le rôle d’un SBOM et pourquoi centraliser leur analyse
  • Installer Dependency-Track avec Docker Compose ou Kubernetes
  • Configurer les sources de vulnérabilités (NVD, GitHub Advisories, OSS Index)
  • Uploader des SBOM via l’API REST et automatiser dans vos pipelines CI/CD
  • Créer des alertes pour être notifié des nouvelles vulnérabilités
  • Définir des politiques pour bloquer les composants non conformes

Vous utilisez peut-être déjà Trivy ou Grype pour scanner vos images. Ces outils sont excellents pour détecter les vulnérabilités à un instant T. Mais que se passe-t-il quand :

  • Une nouvelle CVE est publiée pour Log4j, et vous ne savez pas quels projets l’utilisent ?
  • Vous devez prouver à un auditeur que vous avez corrigé une vulnérabilité sur tous vos projets ?
  • Votre équipe sécurité veut un tableau de bord de toutes les vulnérabilités de l’entreprise ?

Dependency-Track résout ces problèmes en centralisant les SBOM de tous vos projets et en les corrélant en continu avec les bases de vulnérabilités.

ApprocheScanner ponctuel (Trivy, Grype)Dependency-Track
Quand ?À chaque build/scanEn continu (24/7)
Scope1 projet à la foisTous les projets
Nouvelles CVEDétectées au prochain scanAlertes immédiates
Vue d’ensembleNonTableau de bord global
HistoriqueNonOui, avec métriques dans le temps

Un SBOM est la liste complète des composants qui constituent votre logiciel. Comme la liste d’ingrédients sur un emballage alimentaire, il permet de savoir exactement ce que contient votre application.

{
"bomFormat": "CycloneDX",
"specVersion": "1.6",
"components": [
{
"name": "lodash",
"version": "4.17.21",
"purl": "pkg:npm/lodash@4.17.21"
},
{
"name": "express",
"version": "4.18.2",
"purl": "pkg:npm/express@4.18.2"
}
]
}

Formats supportés par Dependency-Track :

FormatDescriptionOutils générateurs
CycloneDXStandard OWASP, recommandéTrivy, Syft, cdxgen
SPDXStandard Linux FoundationSyft, tern

Le PURL (Package URL) est un identifiant universel pour les packages. Il permet à Dependency-Track de retrouver un composant dans les bases de vulnérabilités.

pkg:npm/lodash@4.17.21
pkg:maven/org.apache.logging.log4j/log4j-core@2.17.0
pkg:apk/alpine/openssl@3.0.8-r0
pkg:deb/debian/openssl@1.1.1n-0+deb10u3

Dependency-Track consulte plusieurs bases de données pour détecter les vulnérabilités :

SourceDescriptionConfiguration
NVDNational Vulnerability Database (NIST)Activée par défaut, API key recommandée
GitHub AdvisoriesVulnérabilités GitHubToken GitHub requis
OSS IndexSonatype, gratuitActivée par défaut
OSVOpen Source Vulnerabilities (Google)Optionnelle
SnykBase commercialeToken Snyk requis
VulnDBBase commerciale (Risk Based Security)Abonnement requis

En plus des bases de vulnérabilités, Dependency-Track utilise des analyseurs pour enrichir les données :

AnalyseurFonction
Internal AnalyzerCorrèle les composants avec la base interne
NPM AuditVulnérabilités npm spécifiques
OSS IndexAnalyse via API Sonatype
TrivyIntégration avec un serveur Trivy (v4.13+)
SnykAnalyse via API Snyk
  • Docker et Docker Compose (méthode recommandée)
  • 4 Go de RAM minimum (8 Go recommandés pour la production)
  • PostgreSQL (H2 déprécié depuis v4.13)
  1. Créer le fichier docker-compose.yml

    services:
    dtrack-apiserver:
    image: dependencytrack/apiserver:4.13.6
    depends_on:
    - postgres
    environment:
    # Base de données PostgreSQL
    - ALPINE_DATABASE_MODE=external
    - ALPINE_DATABASE_URL=jdbc:postgresql://postgres:5432/dtrack
    - ALPINE_DATABASE_DRIVER=org.postgresql.Driver
    - ALPINE_DATABASE_USERNAME=dtrack
    - ALPINE_DATABASE_PASSWORD=dtrack
    # Synchronisation initiale (optionnel, améliore le démarrage)
    - ALPINE_DATABASE_POOL_ENABLED=true
    - ALPINE_DATABASE_POOL_MAX_SIZE=20
    volumes:
    - dtrack-data:/data
    ports:
    - "8081:8080"
    restart: unless-stopped
    dtrack-frontend:
    image: dependencytrack/frontend:4.13.6
    depends_on:
    - dtrack-apiserver
    environment:
    - API_BASE_URL=http://localhost:8081
    ports:
    - "8080:8080"
    restart: unless-stopped
    postgres:
    image: postgres:16-alpine
    environment:
    - POSTGRES_DB=dtrack
    - POSTGRES_USER=dtrack
    - POSTGRES_PASSWORD=dtrack
    volumes:
    - postgres-data:/var/lib/postgresql/data
    restart: unless-stopped
    volumes:
    dtrack-data:
    postgres-data:
  2. Démarrer les services

    Fenêtre de terminal
    docker compose up -d

    Sortie attendue :

    [+] Running 4/4
    ✔ Network dependency-track_default Created
    ✔ Container postgres Started
    ✔ Container dtrack-apiserver Started
    ✔ Container dtrack-frontend Started
  3. Vérifier le démarrage

    Fenêtre de terminal
    # Attendre que l'API soit prête (30-60 secondes)
    curl -s http://localhost:8081/api/version | jq .

    Sortie attendue :

    {
    "version": "4.13.6",
    "timestamp": "2025-11-17T08:44:22Z",
    "framework": {
    "name": "Alpine",
    "version": "3.4.0"
    },
    "database": {
    "productVersion": "16.11",
    "productName": "PostgreSQL"
    }
    }
  4. Accéder à l’interface

    Ouvrez http://localhost:8080 dans votre navigateur.

    • Identifiant : admin
    • Mot de passe : admin (à changer immédiatement)

Pour un déploiement Kubernetes, utilisez le chart Helm officiel :

Fenêtre de terminal
# Ajouter le repository
helm repo add dependencytrack https://dependencytrack.github.io/helm-charts
helm repo update
# Installer avec PostgreSQL externe
helm install dependency-track dependencytrack/dependency-track \
--namespace dependency-track \
--create-namespace \
--set apiserver.database.url=jdbc:postgresql://postgres:5432/dtrack \
--set apiserver.database.username=dtrack \
--set apiserver.database.password=dtrack \
--set frontend.env.API_BASE_URL=https://dtrack.example.com/api
  1. Se connecter à l’interface avec admin / admin

  2. Aller dans Administration → Access Management → Managed Users

  3. Cliquer sur admin puis Change Password

Ou via l’API :

Fenêtre de terminal
# Obtenir un token (vous serez forcé de changer le mot de passe)
curl -X POST "http://localhost:8081/api/v1/user/login" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d 'username=admin&password=admin'
# Réponse si changement requis
# FORCE_PASSWORD_CHANGE
# Changer le mot de passe
curl -X POST "http://localhost:8081/api/v1/user/forceChangePassword" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d 'username=admin&password=admin&newPassword=VotreNouveauMotDePasse123&confirmPassword=VotreNouveauMotDePasse123'

Par défaut, seules NVD et OSS Index sont activées. Pour de meilleurs résultats, configurez des sources supplémentaires.

La synchronisation NVD initiale prend plusieurs heures sans clé API. Avec une clé API gratuite, elle prend environ 30 minutes.

  1. Obtenir une clé API NVD : https://nvd.nist.gov/developers/request-an-api-key
  2. Configurer dans Administration → Analyzers → National Vulnerability Database
  3. Coller votre clé API
# Via variables d'environnement dans docker-compose.yml
environment:
- ALPINE_VULNERABILITY_SOURCE_NVD_API_KEY=votre-cle-api-nvd

Pour intégrer Dependency-Track dans vos pipelines CI/CD, vous avez besoin d’un API key avec les bonnes permissions.

  1. Créer une équipe

    Fenêtre de terminal
    # S'authentifier
    TOKEN=$(curl -s -X POST "http://localhost:8081/api/v1/user/login" \
    -H "Content-Type: application/x-www-form-urlencoded" \
    -d 'username=admin&password=VotreMotDePasse' )
    # Créer l'équipe
    curl -s -X PUT "http://localhost:8081/api/v1/team" \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"name":"CI-CD-Integration"}' | jq .

    Sortie :

    {
    "uuid": "ec9f8bc4-8953-4c57-beed-62fb189960ec",
    "name": "CI-CD-Integration",
    "apiKeys": [],
    "permissions": []
    }
  2. Ajouter les permissions

    Fenêtre de terminal
    TEAM_UUID="ec9f8bc4-8953-4c57-beed-62fb189960ec"
    # Permissions nécessaires pour le CI/CD
    for PERM in BOM_UPLOAD PROJECT_CREATION_UPLOAD VIEW_VULNERABILITY; do
    curl -s -X POST "http://localhost:8081/api/v1/permission/${PERM}/team/${TEAM_UUID}" \
    -H "Authorization: Bearer $TOKEN"
    done
  3. Générer un API key

    Fenêtre de terminal
    curl -s -X PUT "http://localhost:8081/api/v1/team/${TEAM_UUID}/key" \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" | jq -r '.key'

    Sortie :

    odt_2d7FSPVR_wypkOzMckIbjsNkUcahyYA5XqrqhYPOr
PermissionDescription
BOM_UPLOADUploader des SBOM
PROJECT_CREATION_UPLOADCréer des projets automatiquement lors de l’upload
VIEW_VULNERABILITYVoir les vulnérabilités
VULNERABILITY_ANALYSISModifier l’analyse des vulnérabilités
PORTFOLIO_MANAGEMENTGérer les projets et composants
POLICY_MANAGEMENTGérer les politiques
SYSTEM_CONFIGURATIONConfiguration système
Fenêtre de terminal
# Scanner une image Docker
trivy image --format cyclonedx nginx:1.25 > nginx-sbom.json
# Scanner un projet local
trivy fs --format cyclonedx . > project-sbom.json
# Scanner avec les vulnérabilités incluses
trivy image --format cyclonedx --scanners vuln python:3.12 > python-sbom.json
Fenêtre de terminal
# Scanner une image
syft nginx:1.25 -o cyclonedx-json > nginx-sbom.json
# Scanner un répertoire
syft dir:. -o cyclonedx-json > project-sbom.json
Fenêtre de terminal
API_KEY="odt_votre_api_key"
BOM_BASE64=$(base64 -w 0 nginx-sbom.json)
curl -X PUT "http://localhost:8081/api/v1/bom" \
-H "X-Api-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"projectName\": \"nginx\",
\"projectVersion\": \"1.25\",
\"autoCreate\": true,
\"bom\": \"$BOM_BASE64\"
}"

Sortie :

{
"token": "9f4c18b6-e20c-44e6-8710-f332a53a6275"
}

L’upload est asynchrone. Utilisez le token pour vérifier le statut :

Fenêtre de terminal
curl -s "http://localhost:8081/api/v1/bom/token/9f4c18b6-e20c-44e6-8710-f332a53a6275" \
-H "X-Api-Key: $API_KEY" | jq .

Sortie pendant le traitement :

{
"processing": true
}

Sortie après traitement :

{
"processing": false
}
Fenêtre de terminal
curl -s "http://localhost:8081/api/v1/project" \
-H "X-Api-Key: $API_KEY" | jq '.[] | {name, version, metrics}'

Sortie :

{
"name": "nginx",
"version": "1.25",
"metrics": {
"critical": 2,
"high": 5,
"medium": 12,
"low": 3,
"components": 45,
"vulnerableComponents": 8
}
}
Fenêtre de terminal
PROJECT_UUID="fe281b4c-347c-45ed-9911-b2bc26245fc1"
curl -s "http://localhost:8081/api/v1/vulnerability/project/${PROJECT_UUID}" \
-H "X-Api-Key: $API_KEY" | jq '.[] | {vulnId, severity, source, cvssV3BaseScore}'

Sortie :

{
"vulnId": "CVE-2024-12345",
"severity": "CRITICAL",
"source": "NVD",
"cvssV3BaseScore": 9.8
}
Fenêtre de terminal
curl -s "http://localhost:8081/api/v1/metrics/portfolio/current" \
-H "X-Api-Key: $API_KEY" | jq '{projects, vulnerableProjects, critical, high, medium, low}'

Sortie :

{
"projects": 15,
"vulnerableProjects": 8,
"critical": 12,
"high": 45,
"medium": 128,
"low": 67
}
.gitlab-ci.yml
stages:
- build
- security
variables:
DTRACK_URL: "https://dependency-track.example.com"
DTRACK_API_KEY: $DTRACK_API_KEY # Secret CI/CD
generate_sbom:
stage: build
image: aquasec/trivy:latest
script:
- trivy fs --format cyclonedx --output sbom.json .
artifacts:
paths:
- sbom.json
expire_in: 1 week
upload_sbom:
stage: security
image: curlimages/curl:latest
needs:
- generate_sbom
script:
- |
BOM_BASE64=$(base64 -w 0 sbom.json)
curl -X PUT "${DTRACK_URL}/api/v1/bom" \
-H "X-Api-Key: ${DTRACK_API_KEY}" \
-H "Content-Type: application/json" \
-d "{
\"projectName\": \"${CI_PROJECT_NAME}\",
\"projectVersion\": \"${CI_COMMIT_REF_NAME}\",
\"autoCreate\": true,
\"bom\": \"${BOM_BASE64}\"
}"
.github/workflows/sbom.yml
name: SBOM Upload
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
sbom:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
format: cyclonedx-json
output-file: sbom.json
- name: Upload to Dependency-Track
run: |
BOM_BASE64=$(base64 -w 0 sbom.json)
curl -X PUT "${{ secrets.DTRACK_URL }}/api/v1/bom" \
-H "X-Api-Key: ${{ secrets.DTRACK_API_KEY }}" \
-H "Content-Type: application/json" \
-d "{
\"projectName\": \"${{ github.repository }}\",
\"projectVersion\": \"${{ github.ref_name }}\",
\"autoCreate\": true,
\"bom\": \"${BOM_BASE64}\"
}"
// Jenkinsfile
pipeline {
agent any
environment {
DTRACK_URL = 'https://dependency-track.example.com'
DTRACK_API_KEY = credentials('dtrack-api-key')
}
stages {
stage('Generate SBOM') {
steps {
sh 'docker run --rm -v $(pwd):/app aquasec/trivy fs --format cyclonedx /app > sbom.json'
}
}
stage('Upload SBOM') {
steps {
sh '''
BOM_BASE64=$(base64 -w 0 sbom.json)
curl -X PUT "${DTRACK_URL}/api/v1/bom" \
-H "X-Api-Key: ${DTRACK_API_KEY}" \
-H "Content-Type: application/json" \
-d "{
\\"projectName\\": \\"${JOB_NAME}\\",
\\"projectVersion\\": \\"${BUILD_NUMBER}\\",
\\"autoCreate\\": true,
\\"bom\\": \\"${BOM_BASE64}\\"
}"
'''
}
}
}
}

Dependency-Track peut vous alerter via plusieurs canaux. Depuis v4.13, les notifications programmées (résumé quotidien/hebdomadaire) sont disponibles.

  1. Aller dans Administration → Notifications → Alerts

  2. Créer un nouveau publisher (Slack, Teams, Email, Webhook…)

  3. Créer une règle de notification :

    • Sélectionner les événements (nouvelles vulnérabilités, violations de politique…)
    • Assigner le publisher
    • Optionnel : filtrer par projet ou sévérité
ÉvénementDescription
NEW_VULNERABILITYNouvelle vulnérabilité détectée
NEW_VULNERABLE_DEPENDENCYNouveau composant vulnérable ajouté
ANALYSIS_DECISION_CHANGEChangement de statut d’analyse
POLICY_VIOLATIONViolation d’une politique
BOM_CONSUMEDSBOM uploadé avec succès
BOM_PROCESSING_FAILEDÉchec de traitement d’un SBOM
VEX_CONSUMEDVEX importé

Les nouveaux types de notifications en mode résumé permettent de recevoir une synthèse plutôt qu’une alerte par vulnérabilité :

TypeDescription
NEW_VULNERABILITIES_SUMMARYRésumé des nouvelles vulnérabilités
NEW_POLICY_VIOLATIONS_SUMMARYRésumé des violations de politique

Configuration via expression cron dans l’interface ou l’API.

{
"name": "Slack Alerts",
"publisherClass": "org.dependencytrack.notification.publisher.SlackPublisher",
"templateMimeType": "application/json",
"template": "{\"text\": \"Nouvelle vulnérabilité ${vulnerability.vulnId} (${vulnerability.severity}) détectée dans ${project.name}\"}",
"destination": "https://hooks.slack.com/services/XXX/YYY/ZZZ"
}

Les politiques permettent de définir des règles automatiques pour détecter les composants non conformes.

ConditionDescription
SeverityNiveau de sévérité (CRITICAL, HIGH, MEDIUM, LOW)
LicenseLicences interdites (GPL, AGPL…)
Component AgeÂge du composant
CoordinatesPackage spécifique (name, version, purl)
SWID Tag IDIdentifiant SWID
CWECatégorie de faiblesse (CWE-79, CWE-89…)
  1. Aller dans Policies → Create Policy

  2. Définir les conditions :

    SujetOpérateurValeur
    SeverityISCRITICAL
  3. Assigner aux projets (tous ou sélection)

  4. Choisir le niveau de violation :

    • Fail : Bloquant (affichage rouge)
    • Warn : Avertissement (affichage orange)
    • Info : Information (affichage bleu)
Fenêtre de terminal
curl -X PUT "http://localhost:8081/api/v1/policy" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Block Log4j < 2.17.1",
"violationState": "FAIL",
"policyConditions": [
{
"subject": "COORDINATES",
"operator": "MATCHES",
"value": "{\"group\":\"org.apache.logging.log4j\",\"name\":\"log4j-core\",\"version\":\"<2.17.1\"}"
}
]
}'

Les Collection Projects permettent d’organiser vos projets de manière hiérarchique.

  • Regrouper les microservices d’une même application
  • Créer une vue “équipe” avec tous les projets d’une équipe
  • Agréger les métriques de plusieurs projets
Fenêtre de terminal
curl -X PUT "http://localhost:8081/api/v1/project" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Platform E-Commerce",
"version": "1.0",
"collectionLogic": "AGGREGATE_DIRECT_CHILDREN"
}'

Logiques de collection :

LogiqueDescription
NONEProjet standard (défaut)
AGGREGATE_DIRECT_CHILDRENAgrège les enfants directs
AGGREGATE_ALL_CHILDRENAgrège tous les descendants
SymptômeCause probableSolution
API ne répond pasContainer non démarrédocker compose logs dtrack-apiserver
Erreur databasePostgreSQL non prêtAttendre ou vérifier docker compose logs postgres
Frontend erreur APIURL API incorrecteVérifier API_BASE_URL dans la config frontend
Synchronisation lentePas de clé API NVDObtenir une clé gratuite sur nvd.nist.gov
SymptômeCause probableSolution
401 UnauthorizedAPI key invalideVérifier l’API key, régénérer si nécessaire
403 ForbiddenPermissions manquantesAjouter BOM_UPLOAD et PROJECT_CREATION_UPLOAD
Processing=true indéfinimentServeur surchargéVérifier les ressources (RAM, CPU)
0 vulnérabilitésBases non synchroniséesAttendre la sync NVD (plusieurs heures)
Fenêtre de terminal
# Vérifier l'état des services
docker compose ps
# Logs de l'API server
docker compose logs -f dtrack-apiserver
# Vérifier la version
curl -s http://localhost:8081/api/version | jq .
# Vérifier la santé
curl -s http://localhost:8081/api/v1/health | jq .
# Statistiques de la base
curl -s "http://localhost:8081/api/v1/metrics/portfolio/current" \
-H "X-Api-Key: $API_KEY" | jq .
  1. Dependency-Track centralise l’analyse des SBOM de tous vos projets et corrèle en continu avec les bases de vulnérabilités
  2. Utilisez PostgreSQL (H2 déprécié depuis v4.13) et obtenez une clé API NVD gratuite pour accélérer la synchronisation
  3. Les API keys sont hachées depuis v4.13 : sauvegardez-les immédiatement après génération
  4. L’upload est asynchrone : utilisez le token retourné pour vérifier le statut de traitement
  5. Configurez des notifications pour être alerté des nouvelles vulnérabilités critiques
  6. Créez des politiques pour détecter automatiquement les composants non conformes
  7. Collection Projects (v4.13+) permet d’organiser et d’agréger les métriques de plusieurs projets
  8. Intégrez dans votre CI/CD : générez les SBOM avec Trivy/Syft et uploadez automatiquement

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.