IT-Admin.tech

Analyse des images de conteneurs dans CI/CD : Trivy, Clair, OPA & Policy‑Gates

CI/CD-Architekturdiagramm mit Trivy-, Clair- und OPA-Integrationen zur Image-Prüfung
Schematische Pipeline: Build → Trivy/Clair Scan → OPA Policy-Gate → Registry. Architektur zeigt Integrationspunkte, SBOM-Flow und Signaturprüfung für Audit und Governance.

Le scan d’images de conteneurs dans les pipelines CI/CD n’est plus un « nice-to-have », mais une obligation opérationnelle pour les équipes qui mettent des conteneurs en production. Retenez le mot-clé : scan d’images de conteneurs dans CI/CD – vérifier tôt, filtrer de manière critique, déployer en toute sécurité. Dans cet article, j’explique de manière pratique le rôle d’outils comme Trivy et Clair, comment Policy-as-Code avec Open Policy Agent (OPA) automatise les décisions de gate, et quelles pièges opérationnels et de migration vous devez éviter.

Pourquoi le scan d’images dans la pipeline est indispensable

Les images de conteneurs regroupent des paquets du système d’exploitation, des bibliothèques d’exécution et des artefacts applicatifs. Un problème de sécurité à n’importe quel niveau — une bibliothèque vulnérable, un service non protégé, des permissions de fichiers incorrectes — peut représenter un risque en production. Le scan d’images recherche des vulnérabilités connues (Common Vulnerabilities and Exposures, CVE), des composants obsolètes ou des erreurs de configuration.

Termes expliqués brièvement : CVE désigne une vulnérabilité publiquement connue. CVSS (Common Vulnerability Scoring System) est une métrique pour prioriser les CVE. SBOM (Software Bill of Materials) est la liste de tous les composants d’une image, apportant de la transparence pour les audits et les scans. Registry est l’endroit (p. ex. Docker Hub, Harbor) où les images sont stockées. CI/CD fait référence à Continuous Integration/Continuous Delivery, c’est‑à‑dire aux processus automatisés de build et de livraison.

Quels objets de vérification et quels instants de contrôle existe-t-il ?

Le scan peut s’effectuer à plusieurs endroits ; chaque position a des avantages et des inconvénients :

  • Pendant le build : les scans durant la construction (dans la CI) détectent les problèmes tôt. Avantage : boucles de feedback courtes ; inconvénient : impact sur les performances et faux positifs pouvant bloquer les builds.
  • Scan dans la registry : les scans après le push dans la registry (asynchrones) conviennent si des intégrations de registry existent. Avantage : scans cohérents de toutes les images ; inconvénient : des déploiements peuvent utiliser une image avant la fin du scan.
  • Pre-Deploy / Policy Gate : gate avant la production – seules les images conformes aux policies sont autorisées. Avantage : dernier contrôle de sécurité ; inconvénient : complexité accrue et nécessité de stratégies de rollback robustes.
  • Scans en runtime : scans des conteneurs en cours d’exécution via rapprochement CPE/SBOM et outils RASP. Avantage : détecte la dérive ; inconvénient : démarche réactive et souvent coûteuse en ressources.

Présentation des outils : comparaison entre Trivy et Clair

Trivy et Clair sont deux scanners établis, mais ils suivent des architectures et des modèles opérationnels différents.

Trivy

Trivy est un scanner léger et rapide à démarrer, qui identifie les vulnérabilités dans les paquets système, les bibliothèques applicatives et les images de conteneurs. Trivy utilise des sources publiques de données CVE et peut générer des SBOM. Il peut s’exécuter localement dans un job CI ou en tant que serveur (Trivy Server) et dispose d’un large écosystème de formats et d’intégrations.

Important pour les équipes d’exploitation : Trivy est performant, mais les flux standards doivent être mis à jour régulièrement. Le caching peut accélérer les jobs, mais entraîne un risque de latence des données lors de la découverte de nouvelles CVE.

Shell
# Beispiel: Schneller Scan eines lokalen Images mit Trivy
trivy image --exit-code 1 --severity HIGH,CRITICAL --format json -o trivy-result.json my-registry.example.com/myapp:1.2.3

L’option –exit-code 1 fait en sorte que Trivy retourne un code de sortie erroné en cas de vulnérabilité de niveau HIGH/CRITICAL, code que les systèmes CI interprètent comme un échec de build.

Clair

Clair est un moteur d’analyse d’images de conteneurs axé sur la persistance et l’intégration dans les workflows de registre. Clair maintient une base de données dans laquelle sont consolidés les scans et les flux de vulnérabilités. Cela rend Clair robuste pour les exigences organisationnelles nécessitant des requêtes à long terme, des analyses historiques et une intégration au registre.

Implication opérationnelle: Clair nécessite davantage d’infrastructure (base de données, service) et est donc plus exigeant sur le plan organisationnel. Pour les grandes organisations disposant de nombreux images et de contraintes de conformité, Clair peut toutefois apporter des avantages via une meilleure gestion de l’historique des scans.

Shell
# Beispiel: Clair-Scanner (community tool) gegen eine Clair-Instanz
clair-scanner --ip clair-service.internal my-registry.example.com/myapp:1.2.3

Remarque: Il existe différents scanners/wrappers pour Clair (clair, clair-scanner). Vérifiez la documentation de la variante utilisée et déployez Clair, si possible, dans un sous-réseau sécurisé avec accès restreint.

Policy-as-Code mit OPA: pourquoi et comment

Open Policy Agent (OPA) est un moteur de politiques qui décrit les règles en Rego. Policy-as-Code signifie : les règles de sécurité sont versionnées, vérifiées et appliquées de manière automatisée — comparable à l’Infrastructure-as-Code. OPA n’est pas un scanner ; il prend des décisions sur la base de métadonnées (p. ex. résultats de scan, SBOM, tags d’image) et rend une décision oui/non pour un job de build.

Exemples de politiques : ne pas autoriser un image de base comportant des CVE critiques connues, ne pas accepter d’images taguées avec l’utilisateur root, n’autoriser que les images signées, exiger un SBOM ou définir un seuil CVSS maximal.

Rego
package image.policy

# Verweigere Images mit kritischen Schwachstellen
violation[reason] {
  some vuln
  input.scanResults.vulnerabilities[vuln]
  vuln.severity == "CRITICAL"
  reason = sprintf("CRITICAL vulnerability: %s", [vuln.vulnerabilityID])
}

default allow = true
allow { count(violation) == 0 }

Dans le CI, intégrez OPA comme gate : le CI lit le JSON de scan (p. ex. la sortie de Trivy), appelle opa eval ou opa test et interrompt le job si des politiques sont enfreintes.

Shell
# Beispiel: Policy-Prüfung mit OPA (lokal im CI-Job)
opa eval -i trivy-result.json -d policy.rego "data.image.policy.allow"
# Exit-Code auswerten und Build abbrechen, wenn policy.allow == false

Proposition d’architecture: Wie die Komponenten zusammenspielen

Une architecture courante combine des scans rapides en ligne dans le build, des scans asynchrones par le registre et des gates OPA avant la production :

  1. Le job de build génère l’image et la pousse dans le registre interne.
  2. Le job de build exécute Trivy (ou Clair-Scanner) et stocke les résultats en JSON/artefact.
  3. OPA évalue les résultats avec les politiques ; en cas de violation, le build échoue ou marque l’image comme « quarantined ».
  4. Le registre exécute des scans supplémentaires (p. ex. Clair) et persiste l’historique.
  5. Le job de déploiement interroge le statut du registre et l’API OPA/policy avant de lancer le déploiement en production.

Important: la séparation des résultats de scan et de la décision de politique permet l’auditabilité et la traçabilité. Stockez les JSONs de scan dans votre stockage d’artefacts CI ou dans un backend de sécurité centralisé (p. ex. Harbor, qui fournit une API pour les résultats de scan).

Container-Image-Scanning in CI/CD: Gate-Strategien und Praxis

Les stratégies de gate définissent quand un scan déclenche une action. Échelons typiques :

  • Warnung : résultat documenté, le build se poursuit. Utile pour la phase d’observation.
  • Quarantäne : l’image reste dans le registre, le déploiement est bloqué jusqu’à revue.
  • Bloc : le build/déploiement est empêché (p. ex. en cas de CRITICAL CVEs).
  • Une pratique éprouvée consiste en des politiques en cascade : initialement des alertes, puis une quarantaine pour les problèmes récurrents et enfin des blocs stricts pour les risques critiques. Utilisez les SBOMs pour réduire les faux positifs — si une bibliothèque apparaît dans l’image mais n’est pas utilisée à l’exécution, cela peut influencer la décision de la politique.

    CI-Integration: Beispiel GitLab‑CI mit Trivy und OPA

    Exemple concret : un job GitLab CI qui construit l’image, la scanne avec Trivy et utilise OPA pour la décision de politique. Le YAML est idempotent et fixe les versions.

    Yaml
    stages:
      - build
      - scan
    
    variables:
      IMAGE: registry.example.com/$CI_PROJECT_PATH:$CI_COMMIT_SHORT_SHA
    
    build:
      stage: build
      image: docker:20.10
      services:
        - docker:dind
      script:
        - docker build -t $IMAGE .
        - docker push $IMAGE
      artifacts:
        paths: ["build.log"]
    
    scan:
      stage: scan
      image: aquasec/trivy:0.40.0
      script:
        - trivy image --format json -o trivy-result.json $IMAGE
        - opa eval -i trivy-result.json -d policy.rego "data.image.policy.allow" || exit 1
      artifacts:
        paths: ["trivy-result.json"]
      when: on_success

    Important : l’évaluation OPA décide ; laissez le scanner se contenter de fournir les résultats. Ainsi, la décision sémantique reste centralisée, versionnée et traçable.

    Migrationspfad: Von Trivy-Only zu Clair + OPA

    À mesure que votre organisation grandit, vous souhaiterez peut‑être migrer des scans CI locaux vers une architecture hybride avec Clair et OPA. Un parcours de migration praticable :

    1. Analyse : recensez les images, le nombre de scans par semaine et le temps moyen de scan.
    2. Pilot : déployez Clair dans un namespace isolé avec une petite base de données et configurez le Feed-Sync.
    3. Parallelbetrieb : laissez Trivy continuer à s’exécuter dans le CI, mais envoyez des copies des résultats de scan à Clair pour persistance.
    4. Policy-Härtung : versionnez les politiques OPA et exécutez des tests dans le CI (opa test).
    5. Rollout : basculez les jobs de déploiement vers des requêtes de statut de registre et des vérifications via l’API OPA ; surveillez les métriques et les erreurs SLA.

    Pièges typiques lors de la migration : absence de capacité pour la base de données de Clair, versions de flux incohérentes, et marge insuffisante pour les processus d’exception. Planifiez des tests de capacité et prévoyez une option de retour arrière.

    Praxis-Checkliste vor Go‑Live

    • Figez les versions du scanner et d’OPA dans le CI.
    • Commencez par l’observabilité : alertes plutôt que blocs pendant 4–8 semaines.
    • Mettez en place un workflow de ticketing pour les exceptions avec approbations limitées dans le temps.
    • Automatisez la génération de SBOM et stockez les artefacts.
    • Signez les images avec cosign et vérifiez les signatures via l’Admission Controller.
    • Définissez des SLA pour le Feed-Sync, la revue des politiques et les décisions d’exception.

    Erweiterte Fehlerfälle, Troubleshooting und typische Ursachen

    Certaines erreurs se reproduisent. Voici les causes typiques et les séquences de vérification :

    • Incompatibilité du scanner : figez les versions ; testez contre un registre de test. Vérifiez les changements incompatibles dans les notes de version.
    • Réseau/Proxy/TLS : les runners CI nécessitent souvent une configuration explicite du proxy et des CA. Testez la connectivité depuis le runner avec curl et trivy db update.
    • Goulots de performance : les scans sont intensifs en E/S et CPU. Augmentez la capacité des runners ou déployez des conteneurs/serveurs de scan dédiés.
    • Absence de pistes d’audit : Stockez centralement les JSON de scan, les décisions OPA et les logs d’exception à des fins d’analyse forensique.
    Shell
    # Netzwerk- und Feed-Check
    trivy db update --download-db-only || echo "Feed update failed"
    curl -I https://registry.example.com/v2/ || echo "Registry unreachable"
    

    Rétention, archivage et exigences forensiques

    Pour la conformité et la réponse aux incidents, conservez les JSON de scan, les décisions OPA et les revues d’exception pendant au moins 6–24 mois. Structurez les logs de façon à rendre facilement interrogeables les champs suivants : Image-Tag, Registry-URL, Scan-Timestamp, Vulnerability-IDs, CVSS, Policy-Decision, Reviewer et date de validation. Ces métadonnées sont essentielles pour analyser ultérieurement les causes ou répondre à des demandes réglementaires.

    Stratégie de rollback et d’urgence

    Dans les situations où un gate bloque à tort ou qu’une release critique est imminente, vous avez besoin d’un processus de contournement contrôlé :

    • Exception temporaire documentée dans le système de ticketing, avec justification, relecteur et date d’expiration.
    • Déploiement canary avec feature flags pour minimiser le risque.
    • Tagging d’images de secours : conserver comme option de rollback des images vérifiées et signées.
    • Playbook de rollback automatisé pour l’orchestration (p. ex. rollback Kubernetes via controller).

    Chaque exception constitue un cas d’audit : un suivi post-mortem est obligatoire pour améliorer durablement les politiques.

    Métriques et reporting : ce qu’il faut mesurer

    Métriques clés pour piloter la qualité et l’efficacité :

    • Durée moyenne de scan par image
    • Nombre de policy-violations par release
    • Taux de faux positifs après triage
    • Nombre d’erreurs de synchronisation des feeds par jour
    • Temps moyen jusqu’à l’approbation d’une exception (SLA)

    Des rapports automatisés aident à rendre visible la dette technique (p. ex. des images de base obsolètes) et à clarifier les responsabilités.

    Conclusion : pragmatisme plutôt que perfection

    Le scanning d’images de conteneurs dans les pipelines CI/CD est un exercice d’équilibre entre sécurité et disponibilité. Trivy est particulièrement adapté aux scans rapides et intégrés ; Clair est pertinent si vous avez besoin d’une persistance centrée sur la registry et d’un historique. OPA fournit la couche de gouvernance et d’audit nécessaire pour appliquer les politiques de façon automatisée. Un déploiement progressif avec observabilité, politiques testées, SLA clairs et processus d’exception documentés assure la sécurité sans compromettre la capacité de livraison.

    Sujets complémentaires et liens internes

    Ce sujet se prête bien à des guides sur le durcissement des registries, la sécurité des CI runners, la génération de SBOM, la signature d’images et les playbooks d’incident response. Préparez des liens internes vers ces domaines afin d’établir un modèle opérationnel cohérent.

    Aspects opérationnels du scanning d’images de conteneurs en CI/CD

    Si vous ne souhaitez pas seulement tester le scanning mais l’opérer, les risques se déplacent du choix d’outil vers la discipline opérationnelle : intégrité des feeds, performance, durcissement sécurité des services de scan et gouvernance des politiques. Planifiez tôt des mesures techniques garantissant la disponibilité et la confidentialité de la pipeline de scan.

    • Gestion des feeds : Répliquez les flux de vulnérabilités localement ou via un CDN pour atténuer les limitations de débit et les pannes externes. Validez l’intégrité des feeds (hashs, signatures) et déclenchez des alertes en cas d’échec de synchronisation.
    • Mise à l’échelle & mise en cache: Faites monter horizontalement les Scanner-Worker ; utilisez un cache partagé pour DB/Feeds, afin que les jobs CI parallèles ne téléchargent pas tous les mêmes feeds. En cas de forte charge, réduisez la Scan-Fidelity (z. B. nur HIGH/CRITICAL) comme coupe‑circuit temporaire.
    • Communication sécurisée: Protégez les serveurs Clair, Trivy et OPA avec mTLS, des règles de pare‑feu et une séparation réseau. Stockez les DB-Credentials et les clés de signature dans un secrets-backend (Vault) et faites-les tourner régulièrement.
    • Gouvernance des policies: Les changements de policy doivent être intégrés dans des workflows GitOps avec Branch-Protection, Peer-Review et des exécutions automatisées d’opa test. Les rôles et droits d’accès sur les repositories de policy minimisent les risques d’abus.
    • Tâches récurrentes: Automatisez la DB-Maintenance (VACUUM/OPTIMIZE), les feed-backups et les health-checks ; planifiez des fenêtres pour les Index-Rebuilds et des tests de capacité.
    • Stratégies de rescan: Déclenchez automatiquement des Re-Scans lors de nouvelles CVE ou de mises à jour du Base‑Image ; orchestrez ces jobs pour que les pics de charge soient gérés.
    • Observabilité: Enregistrez des Scan-JSONs structurés avec Image‑Digest, Request‑ID et Policy‑Decision. Exportez des métriques pour la Scan‑Queue‑Länge, la latence de décision et le % d’images bloquées.
    Yaml
    # Beispiel: Prometheus-Alert für lange Scan-Queues
    - alert: HighScanQueueLength
      expr: sum(container_scanner_queue_length) > 50
      for: 10m
      labels:
        severity: warning
      annotations:
        summary: "Scanner-Queue > 50 (10m)"

    De tels alerts aident à déclencher des règles automatiques de dégradation (z. B. reduzierte Scan-Tiefe) tout en alertant les équipes. Avec ces mesures opérationnelles, vous rendez le container-image-scanning dans les pipelines CI/CD robuste, auditable et à l’échelle — établissant ainsi une base solide pour vos solutions numériques d’entreprise.