Aller au contenu
CI/CD & Automatisation medium

Scanners de sécurité GitLab CI : SAST, DAST, secrets et dépendances

16 min de lecture

logo gitlab

Votre pipeline build, teste et déploie — mais une dépendance npm contient une CVE critique, un développeur a committé un token AWS, et votre image Docker embarque OpenSSL vulnérable. Vous ne le saurez qu’après l’incident. GitLab intègre cinq scanners de sécurité directement dans la CI/CD : ils analysent votre code, vos dépendances, vos images et vos secrets à chaque pipeline, avec un rapport de vulnérabilités exploitable par les développeurs.

  • Activer chaque scanner dans un pipeline GitLab CI avec les templates officiels
  • Lire un rapport de vulnérabilités dans une merge request et prioriser les corrections
  • Configurer Secret Detection pour détecter les tokens committés avant le merge
  • Scanner vos images Docker construites dans le même pipeline
  • Configurer les mécanismes de gouvernance pour réagir aux vulnérabilités détectées
  • Choisir entre Auto DevOps et configuration manuelle

Les scanners de sécurité GitLab répondent à un besoin précis : détecter les vulnérabilités au plus tôt dans le cycle de développement, idéalement dès la merge request, avant que le code n’atteigne la branche principale.

Sans ces scanners, les équipes découvrent les problèmes de sécurité :

  • En production, quand un scanner externe (Trivy, Snyk) détecte une CVE critique sur une image déployée
  • Lors d’un audit, quand on découvre que des secrets traînent dans l’historique Git depuis des mois
  • Après un incident, quand un attaquant exploite une dépendance vulnérable connue depuis longtemps

En pratique quotidienne, les scanners servent à :

  • Attraper les secrets (tokens AWS, clés SSH, mots de passe) dans les commits avant qu’ils ne soient mergés dans la branche principale
  • Vérifier les dépendances à chaque mise à jour de package-lock.json, go.sum ou requirements.txt
  • Valider les images Docker avant de les pousser dans le Container Registry
  • Tester la surface d’attaque d’une application déployée en review app
  • Produire des rapports pour les audits de conformité (lien avec Audit & conformité)
  • Un projet GitLab avec un pipeline fonctionnel (voir Premier pipeline)
  • Comprendre les templates et includes (les scanners utilisent include: template:)
  • Pour le Container Scanning : un job qui construit une image Docker (voir Registries)
  • Pour le DAST : une application déployée accessible (review app ou environnement de staging)
Code source ──► SAST ──────────► Vulnérabilités dans le code
├──► Secret Detection ──► Tokens/clés détectés
├──► Dependency Scanning ► CVE dans les dépendances
└──► Container Scanning ─► CVE dans l'image Docker
Application déployée ──► DAST ─────────► Vulnérabilités web (XSS, injection, etc.)

Le SAST analyse votre code source sans l’exécuter. Il détecte les failles de programmation : injections SQL, XSS, utilisation de fonctions dangereuses, mauvaise gestion des entrées utilisateur.

GitLab détecte automatiquement les langages et active les analyseurs correspondants. Selon le projet, plusieurs analyseurs peuvent s’exécuter en parallèle : Semgrep (Python, JS, Go, Java…), SpotBugs (Java, Kotlin), Sobelow (Elixir), PMD (Apex), Kubesec (manifests Kubernetes) et GitLab Advanced SAST (Ultimate — analyse inter-procédurale).

include:
- template: Jobs/SAST.gitlab-ci.yml

C’est tout. GitLab crée automatiquement un ou plusieurs jobs (ex : semgrep-sast, spotbugs-sast) dans le stage test qui :

  1. Détectent les langages du projet
  2. Exécutent les analyseurs appropriés
  3. Produisent un rapport gl-sast-report.json (format GitLab Security Report, pas SARIF)
  4. Affichent les résultats dans la merge request (Ultimate)

Personnalisation courante :

include:
- template: Jobs/SAST.gitlab-ci.yml
variables:
SAST_EXCLUDED_PATHS: "spec,test,tests,tmp,vendor,node_modules"
SEARCH_MAX_DEPTH: 4

Le scanner de Secret Detection parcourt les commits pour trouver des secrets (tokens, clés API, mots de passe, certificats) qui n’auraient pas dû être committés.

include:
- template: Jobs/Secret-Detection.gitlab-ci.yml

Il détecte entre autres :

Type de secretExemple de pattern
Clés AWSAKIA[0-9A-Z]{16}
Tokens GitLabglpat-[0-9a-zA-Z_-]{20}
Clés privées SSH/RSA-----BEGIN RSA PRIVATE KEY-----
Tokens GitHubghp_[0-9a-zA-Z]{36}
Mots de passe en clairVariables contenant password, secret, token

Scan initial de l’historique (à exécuter une seule fois) :

Après avoir activé Secret Detection, lancez un pipeline manuellement avec la variable SECRET_DETECTION_HISTORIC_SCAN: "true" pour scanner tout l’historique Git. C’est un scan one-shot — ne le laissez pas dans votre configuration permanente, car il rallonge considérablement chaque pipeline.

# Pipeline manuel unique pour le scan historique
# Build > Pipelines > New pipeline > Add variable:
# SECRET_DETECTION_HISTORIC_SCAN = true

Configuration standard (quotidienne) :

include:
- template: Jobs/Secret-Detection.gitlab-ci.yml
variables:
SECRET_DETECTION_EXCLUDED_PATHS: "tests/"

Le Dependency Scanning analyse vos fichiers de verrouillage (package-lock.json, go.sum, Gemfile.lock, requirements.txt) pour identifier les dépendances avec des CVE connues (base NVD et GitLab Advisory Database).

include:
- template: Jobs/Dependency-Scanning.gitlab-ci.yml

Il produit un rapport listant chaque dépendance vulnérable avec :

  • L’identifiant CVE
  • La sévérité (Critical, High, Medium, Low)
  • La version corrigée (quand elle existe)
  • Le lien vers l’advisory

Personnalisation :

include:
- template: Jobs/Dependency-Scanning.gitlab-ci.yml
variables:
DS_EXCLUDED_PATHS: "vendor/"

Le Container Scanning analyse l’image Docker que votre pipeline vient de construire pour trouver les vulnérabilités dans les packages système (apt, apk, rpm) et les bibliothèques embarquées.

include:
- template: Jobs/Container-Scanning.gitlab-ci.yml
container_scanning:
variables:
CS_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

Le DAST teste une application déployée et accessible en simulant des attaques réelles : injections SQL, XSS, CSRF, headers de sécurité manquants, etc.

include:
- template: Security/DAST.gitlab-ci.yml
variables:
DAST_TARGET_URL: "https://staging.mon-app.com"

Le DAST est le scanner le plus lourd : il lance un navigateur headless et explore l’application. Il est généralement exécuté sur un environnement de staging ou une review app, pas en production.

Personnalisation :

include:
- template: Security/DAST.gitlab-ci.yml
variables:
DAST_TARGET_URL: "https://$CI_ENVIRONMENT_SLUG.review.mon-app.com"
DAST_FULL_SCAN_ENABLED: "false" # Scan rapide par défaut
DAST_BROWSER_SCAN: "true" # Scan basé navigateur (recommandé)

Voici un pipeline qui combine les 5 scanners avec les étapes de build et test :

stages:
- build
- test
- deploy
- dast # Stage requis par le template DAST
include:
- template: Jobs/SAST.gitlab-ci.yml
- template: Jobs/Secret-Detection.gitlab-ci.yml
- template: Jobs/Dependency-Scanning.gitlab-ci.yml
- template: Jobs/Container-Scanning.gitlab-ci.yml
- template: Security/DAST.gitlab-ci.yml
variables:
CS_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
DAST_TARGET_URL: "https://$CI_ENVIRONMENT_SLUG.staging.mon-app.com"
build-image:
stage: build
image: docker:27
services:
- docker:27-dind
variables:
DOCKER_TLS_CERTDIR: "/certs"
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
script:
- docker build -t "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" .
- docker push "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"
test:
stage: test
image: node:22-alpine
script:
- npm ci
- npm test
deploy-staging:
stage: deploy
script:
- deploy-to-staging.sh
environment:
name: staging/$CI_COMMIT_REF_SLUG
url: https://$CI_ENVIRONMENT_SLUG.staging.mon-app.com
rules:
- if: $CI_MERGE_REQUEST_IID

Quand les scanners s’exécutent sur une MR, GitLab affiche un widget de sécurité résumant :

  • Le nombre de nouvelles vulnérabilités introduites par la MR
  • Le nombre de vulnérabilités corrigées
  • La répartition par sévérité (Critical, High, Medium, Low)

Chaque vulnérabilité est cliquable et affiche :

  • La description de la faille
  • Le fichier et la ligne concernés (SAST) ou la dépendance (Dependency Scanning)
  • La sévérité et le score CVSS
  • La solution recommandée (mise à jour, contournement)
  • L’identifiant CVE / CWE

Le Security Dashboard (Security & Compliance > Vulnerability Report) centralise toutes les vulnérabilités détectées sur la branche par défaut. Il permet de :

  • Filtrer par scanner, sévérité, statut
  • Marquer une vulnérabilité comme “confirmed”, “dismissed” ou “resolved”
  • Créer un issue GitLab directement depuis une vulnérabilité
  • Suivre l’évolution dans le temps

Deux mécanismes complémentaires permettent de réagir aux résultats des scanners :

1. allow_failure: false — détecter les pannes de scanner

Par défaut, les scanners utilisent allow_failure: true : si le scanner plante (timeout, erreur réseau, image indisponible), le pipeline continue. En passant à false, un échec du scanner lui-même bloque le pipeline — mais les vulnérabilités détectées, elles, ne bloquent rien :

semgrep-sast:
allow_failure: false # Bloque si le scanner plante, PAS si des findings existent

2. Merge request approval policies — bloquer sur les findings (Ultimate)

Pour empêcher le merge quand des vulnérabilités critiques sont détectées, configurez une merge request approval policy dans un projet de politique de sécurité :

  1. Créez un Security Policy Project (Security & Compliance > Policies > New policy project)

  2. Créez une Merge request approval policy avec une règle scan_finding :

    • Sévérité minimale : critical ou high
    • Scanners concernés : SAST, Dependency Scanning, Container Scanning, Secret Detection
    • Approbateurs requis : membres de l’équipe sécurité
  3. Liez le projet de politique à vos projets (Settings > Security & Compliance > Security policy project)

GitLab propose Auto DevOps, qui active automatiquement tous les scanners sans configuration. C’est tentant, mais voici quand choisir chaque approche :

CritèreAuto DevOpsConfiguration manuelle
Temps de mise en placeInstantané15 min
ContrôleLimitéTotal
Scanners activésTousAu choix
PersonnalisationVia variablesVia YAML complet
Recommandé pourPrototypage, petits projetsProduction, conformité

Pour activer Auto DevOps : Settings > CI/CD > Auto DevOps > Enable.

Pour la plupart des équipes en production, la configuration manuelle via include: template: est préférable car elle donne un contrôle explicite sur ce qui s’exécute.

SymptômeCause probableSolution
Scanner non exécutéTemplate pas inclus ou stage manquantVérifiez include: et que le stage existe
SAST: 0 findings sur un projet avec du codeLangage non détectéAjoutez SAST_DEFAULT_ANALYZERS explicitement
Container Scanning échoueImage non trouvéeVérifiez CS_IMAGE et que le job build a réussi
Secret Detection : faux positifsPattern trop largeAjoutez un fichier .gitlab-secret-detection.toml pour exclure
DAST timeoutApplication non accessible depuis le runnerVérifiez l’URL et le réseau du runner
Widget sécurité absent dans la MRLicence insuffisante ou rapports manquantsVérifiez le tier GitLab et les artifacts des jobs
Dependency Scanning: 0 findingsFichier de verrouillage absentGénérez package-lock.json ou go.sum avant
  • GitLab intègre 5 scanners de sécurité activables via include: template: — pas besoin d’outils externes
  • SAST, Secret Detection et Container Scanning sont disponibles sur tous les tiers (y compris Free) — Dependency Scanning et DAST nécessitent Ultimate
  • Les résultats apparaissent directement dans la merge request (widget Ultimate) — sur Free, les rapports JSON sont téléchargeables
  • Le Container Scanning analyse les images Docker construites dans le même pipeline
  • Le DAST teste l’application déployée — il nécessite un environnement accessible et le stage dast
  • allow_failure: false détecte les pannes de scanner — pour bloquer sur les findings, configurez des merge request approval policies (Ultimate)
  • Auto DevOps active tout automatiquement, mais la configuration manuelle offre plus de contrôle
  • Ces scanners complètent notre Volet 3 — Sécurité qui couvre la protection des pipelines eux-mêmes

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.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn