Garden of KnowledgeApplied Sciences › Computer Science › Software › DevSecOps › CI-CD
February 25, 2026

DevSecOps Pipeline (CI/CD Security)

Le DevSecOps intègre la sécurité dans chaque étape du pipeline CI/CD plutôt que de l’appliquer uniquement à la fin. L’objectif est de détecter les vulnérabilités le plus tôt possible (“shift left”) quand leur correction est moins coûteuse.

Philosophie Shift Left§

Traditionnel : Code → Build → Test → Deploy → [Sécurité]
DevSecOps    : [Sécurité] à chaque étape du pipeline

Le coût de correction d’une vulnérabilité multiplie par 10 à chaque étape :

Étapes du pipeline sécurisé§

Commit → SAST → SCA → Build → DAST → Image Scan → Deploy → RASP/monitoring
  ↑         ↑      ↑      ↑      ↑         ↑
Secrets  Linting  CVE  Artefact  API      Container
Scan    statique  Deps  signing  Tests    vulns

1. Pre-commit (poste du développeur)§

Détection de secrets§

Empêcher le commit de secrets (clés API, tokens, mots de passe) dans le dépôt.

# git-secrets (AWS)
git secrets --install
git secrets --register-aws

# gitleaks — analyse le dépôt complet ou les diffs
gitleaks detect --source . --verbose
gitleaks protect --staged   # hook pre-commit

# detect-secrets (Yelp) — baseline + audit
detect-secrets scan > .secrets.baseline
detect-secrets audit .secrets.baseline

Configuration .gitleaks.toml :

[rules]
  [[rules.rules]]
    description = "AWS Access Key"
    regex = '''AKIA[0-9A-Z]{16}'''
    tags = ["aws", "credentials"]

[allowlist]
  paths = [".secrets.baseline"]
  regexes = ["EXAMPLE_KEY_.*"]

Linting de sécurité§

# Bash : shellcheck
shellcheck script.sh

# Python : bandit (détecte les mauvaises pratiques de sécurité)
bandit -r ./src -ll    # -ll = sévérité medium et haute uniquement

# Terraform : tfsec, checkov
tfsec .
checkov -d . --framework terraform

# Docker : hadolint
hadolint Dockerfile

2. SAST (Static Application Security Testing)§

Analyse le code source sans l’exécuter.

Outils§

OutilLangagesType
Semgrep30+ langagesOpen source, règles personnalisables
SonarQube / SonarCloud30+Open core, intégration IDE
CodeQL (GitHub)C/C++, Java, Python, JS…Requêtes logiques sur l’AST
CheckmarxEntrepriseCommercial
Snyk Code30+Commercial (tier gratuit)
BanditPythonOpen source
SpotBugs + FindSecBugsJavaOpen source

Semgrep en pratique§

# Scan avec les règles de sécurité de la communauté
semgrep --config p/security-audit .
semgrep --config p/owasp-top-ten .
semgrep --config p/python .

# Règle personnalisée
cat > regles/no-hardcoded-creds.yaml << 'EOF'
rules:
  - id: no-hardcoded-password
    patterns:
      - pattern: password = "..."
      - pattern-not: password = ""
    message: "Hardcoded password detected: $MATCH"
    severity: ERROR
    languages: [python]
EOF

semgrep --config regles/ .

CodeQL (GitHub Actions)§

# .github/workflows/codeql.yml
name: CodeQL Analysis
on: [push, pull_request]
jobs:
  analyze:
    runs-on: ubuntu-latest
    permissions:
      security-events: write
    steps:
      - uses: actions/checkout@v4
      - uses: github/codeql-action/init@v3
        with:
          languages: python, javascript
      - uses: github/codeql-action/autobuild@v3
      - uses: github/codeql-action/analyze@v3

3. SCA (Software Composition Analysis)§

Analyse les dépendances tierces pour détecter les CVEs connues.

Outils§

OutilTypeNotes
OWASP Dependency-CheckOpen sourceJava, .NET, Python, Node
SnykCommercial (tier gratuit)Fix automatique, PR
TrivyOpen sourceDépendances + images Docker
Renovate / DependabotOpen sourceMise à jour automatique des dépendances
# Trivy — scan des dépendances Python
trivy fs --security-checks vuln requirements.txt

# OWASP Dependency-Check
dependency-check --project "MonApp" --scan ./src --format HTML

# Snyk
snyk test --severity-threshold=high
snyk monitor   # enregistre le projet pour monitoring continu

Intégration GitLab CI§

# .gitlab-ci.yml
dependency_scan:
  image: owasp/dependency-check:latest
  stage: test
  script:
    - /usr/share/dependency-check/bin/dependency-check.sh
        --project "MonApp"
        --scan .
        --format JSON
        --failOnCVSS 7
  artifacts:
    reports:
      dependency_scanning: dependency-check-report.json
  allow_failure: false

4. Signature des artefacts§

Garantir l’intégrité des artefacts tout au long de la supply chain.

# Signer une image Docker avec Cosign (Sigstore)
cosign generate-key-pair
cosign sign --key cosign.key monregistre.io/monapp:1.0

# Vérifier
cosign verify --key cosign.pub monregistre.io/monapp:1.0

# SBOM (Software Bill of Materials) — inventaire de toutes les dépendances
syft monregistre.io/monapp:1.0 -o spdx-json > sbom.json
grype sbom:sbom.json   # scanner les CVEs depuis le SBOM

5. DAST (Dynamic Application Security Testing)§

Teste l’application en cours d’exécution, en envoyant des requêtes malveillantes.

# OWASP ZAP en mode API scan
zap_scan:
  image: zaproxy/zap-stable
  stage: dast
  script:
    - zap-api-scan.py
        -t https://staging.monapp.com/api/openapi.json
        -f openapi
        -r zap-report.html
        -x zap-report.xml
        -l PASS
  artifacts:
    paths: [zap-report.html]
# Nikto — scan de serveur web
nikto -h https://staging.monapp.com -o nikto-report.html

# sqlmap — test d'injection SQL (environnement autorisé uniquement)
sqlmap -u "https://staging.monapp.com/api/users?id=1" --level=3

6. Scan d’images Docker§

# GitLab CI — scan Trivy
container_scan:
  image: aquasec/trivy:latest
  stage: scan
  script:
    - trivy image
        --exit-code 1
        --severity CRITICAL,HIGH
        --no-progress
        --format table
        $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  allow_failure: false
# Rapport JSON pour intégration
trivy image --format json --output trivy-report.json monapp:latest

# Vérifier la configuration du Dockerfile
trivy config Dockerfile

# Scan du filesystem complet
trivy fs --security-checks vuln,config .

7. Pipeline GitLab CI complet§

stages:
  - secrets
  - sast
  - sca
  - build
  - scan
  - dast
  - deploy

secrets_detection:
  stage: secrets
  image: zricethezav/gitleaks:latest
  script:
    - gitleaks detect --source . --exit-code 1

semgrep_sast:
  stage: sast
  image: returntocorp/semgrep:latest
  script:
    - semgrep --config p/security-audit --error .

dependency_check:
  stage: sca
  image: owasp/dependency-check
  script:
    - dependency-check.sh --project app --scan . --failOnCVSS 7

build_image:
  stage: build
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

trivy_scan:
  stage: scan
  image: aquasec/trivy
  script:
    - trivy image --exit-code 1 --severity CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA

zap_dast:
  stage: dast
  image: zaproxy/zap-stable
  script:
    - zap-api-scan.py -t $STAGING_URL/openapi.json -f openapi -l PASS

deploy_prod:
  stage: deploy
  script:
    - kubectl set image deployment/app app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  when: manual
  only:
    - main

Supply Chain Security§

La compromission de la chaîne d’approvisionnement logicielle (SolarWinds, XZ Utils, Log4Shell) est une menace majeure.

SLSA (Supply chain Levels for Software Artifacts)§

Framework de niveaux de sécurité pour la supply chain :

NiveauExigences
SLSA 1Build scriptable, provenance générée
SLSA 2Build service (CI), provenance signée
SLSA 3Build isolé, pas de modification possible des sources pendant le build
SLSA 4Build hermétique, revue de code à deux personnes

Bonnes pratiques supply chain§

# Épingler les actions GitHub par digest SHA (pas par tag)
# Mauvais (le tag peut être modifié)
- uses: actions/checkout@v4

# Bon (digest immuable)
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683

# Épingler les images Docker par digest dans les Dockerfiles
FROM python:3.12-slim@sha256:abc123...

# SBOM pour chaque artefact livré
- uses: anchore/sbom-action@v0
  with:
    image: ${{ env.IMAGE }}
    artifact-name: sbom.spdx.json

Métriques de sécurité pipeline§

MétriqueDescription
Vulnérabilités détectées/sprintTendance de la dette de sécurité
Mean Time to Fix (MTTF) vulnérabilitéVitesse de remédiation
% builds bloqués par sécuritéAdoption réelle du shift left
Couverture SCA% dépendances analysées
Secrets exposés détectésNombre de commits bloqués par pre-commit
—The Gardener