Aller au contenu

GUAC : visualiser et interroger votre supply chain

Mise à jour :

Vous avez généré des SBOM pour documenter vos composants logiciels. Vous avez des scans de vulnérabilités qui s’accumulent. Vous avez peut-être même des attestations SLSA pour prouver la provenance de vos builds. Mais quand une nouvelle CVE critique tombe un vendredi soir, êtes-vous capable de répondre rapidement à cette question : “Quels sont tous les artefacts en production qui utilisent log4j 2.14.0 ?”

Si la réponse implique de fouiller manuellement dans des dizaines de fichiers JSON, vous avez besoin de GUAC.

Qu’est-ce que GUAC ?

GUAC (prononcé “gouac”, comme la sauce mexicaine) signifie Graph for Understanding Artifact Composition. C’est un outil open source qui agrège toutes vos métadonnées de sécurité supply chain dans un graphe de connaissances interrogeable.

Pourquoi un graphe ?

Les outils traditionnels traitent les données de sécurité en silos :

  • Un SBOM par image → fichier JSON isolé
  • Un scan Trivy → rapport séparé
  • Une attestation SLSA → document distinct

GUAC connecte toutes ces informations pour révéler les relations cachées. Par exemple : “Cette CVE affecte ce package → qui est inclus dans cette image → qui est déployée dans ces 15 services”.

Sans GUACAvec GUAC
500 fichiers SBOM à parcourir manuellementUne requête pour tout le parc
”Est-ce qu’on utilise log4j ?” → plusieurs heuresRéponse en quelques secondes
Impact d’une CVE 0-day ? → “on ne sait pas”Graphe des dépendances transitives
Corrélation CVE ↔ SBOM ↔ SLSA → tableur ExcelRelations automatiques dans le graphe

Architecture de GUAC

Avant de passer à l’installation, comprenons comment GUAC fonctionne. Cette compréhension vous aidera à diagnostiquer les problèmes et à optimiser votre déploiement.

Architecture GUAC : Collectors, Ingestor, Assembler, CollectSub, Certifiers, GraphQL Server et Visualizer

Les composants expliqués

ComposantRôleAnalogie
CollectorsRécupèrent les documents (SBOM, attestations) depuis diverses sourcesLe facteur qui récupère le courrier
IngestorParse les documents et les traduit dans le modèle GUACLe traducteur qui standardise les formats
AssemblerStocke les données dans la base de données grapheL’archiviste qui range tout
CollectSubCoordonne les demandes d’informations supplémentairesLe chef d’équipe qui distribue le travail
CertifiersEnrichissent automatiquement avec des données externes (CVE, licences)Les enquêteurs qui creusent chaque piste
GraphQL ServerExpose les données via une API interrogeableLe bibliothécaire qui répond aux questions

Prérequis

Avant d’installer GUAC, assurez-vous d’avoir :

  • Docker et Docker Compose (v2.x recommandé)
  • Au moins 4 Go de RAM disponibles pour les conteneurs
  • Des SBOM à ingérer (sinon, GUAC sera vide et inutile)
  • Optionnel : PostgreSQL 14+ si vous voulez la persistance

Installation

Cette méthode utilise le backend in-memory. Idéale pour découvrir GUAC, mais les données sont perdues au redémarrage.

Terminal window
# Cloner le dépôt officiel
git clone https://github.com/guacsec/guac.git
cd guac
# Démarrer tous les services
docker compose up -d

Services démarrés :

ServicePortDescription
GraphQL API8080Point d’entrée pour les requêtes
Visualizer3000Interface web d’exploration
NATS4222Bus de messages interne
Collector-Écoute les nouvelles données

Vérification :

Terminal window
# Vérifier que tous les conteneurs tournent
docker compose ps
# Tester l'API GraphQL
curl -s http://localhost:8080/query \
-H "Content-Type: application/json" \
-d '{"query": "{ packages { type } }"}'

Vous devriez obtenir une réponse JSON (probablement vide si aucun SBOM n’a été ingéré).

Concepts clés : le modèle de données

GUAC organise les informations dans un graphe composé de nœuds (entités) et d’arêtes (relations). Comprendre ce modèle est essentiel pour écrire des requêtes efficaces.

Les types de nœuds

Type de nœudCe que c’estExemple concret
PackageUn composant logiciel identifié par un pURLpkg:npm/lodash@4.17.21
SourceUn dépôt de code sourcegit+https://github.com/lodash/lodash
ArtifactUn fichier binaire ou une imagesha256:abc123... (image Docker)
VulnerabilityUne faille de sécurité connueCVE-2021-44228 (Log4Shell)
BuilderUn système de buildhttps://github.com/actions

Les types de relations

RelationCe qu’elle signifieUtilité
IsDependencyOfA est une dépendance de BTracer les dépendances transitives
HasSBOML’artefact possède un SBOMVérifier la couverture SBOM
CertifyVulnLe package a une vulnérabilité connueIdentifier les composants vulnérables
HasSlsaL’artefact a une attestation SLSAVérifier la provenance
HasSourceAtLe package provient de ce dépôtTracer l’origine du code
IsOccurrenceOfCet artefact est une instance de ce packageLier binaires et packages

Visualiser les relations

Voici comment ces relations forment un graphe pour une image Docker :

Graphe GUAC montrant les relations entre Artifact, SBOM, SLSA, Package et CVE

Ingérer des données

Un GUAC vide est inutile. Voyons comment alimenter le graphe avec vos données de sécurité.

Ingérer un SBOM

  1. Générer un SBOM (si vous n’en avez pas déjà)

    Terminal window
    # Avec Syft
    syft myimage:latest -o cyclonedx-json > sbom.json
  2. Ingérer le SBOM dans GUAC

    Terminal window
    # Avec guacone
    guacone collect files sbom.json

    Sortie attendue :

    {"level":"info","msg":"Collecting files from: sbom.json"}
    {"level":"info","msg":"Successfully ingested 1 document(s)"}
  3. Vérifier l’ingestion

    Ouvrez le Visualizer sur http://localhost:3000 et recherchez votre package.

Ingérer depuis un registry OCI

GUAC peut extraire automatiquement les SBOM attachés aux images OCI :

Terminal window
# Ingérer depuis GitHub Container Registry
guacone collect oci ghcr.io/mon-org/mon-image:v1.0.0
# Ingérer depuis Docker Hub
guacone collect oci docker.io/library/nginx:latest

Ingérer des vulnérabilités (OSV)

Le certifier OSV surveille automatiquement les nouveaux packages et vérifie s’ils ont des vulnérabilités connues dans la base OSV.dev :

Terminal window
# Lancer le certifier OSV (s'exécute en continu)
guacone certifier osv

Ingérer des attestations SLSA

Terminal window
# Ingérer une attestation de provenance signée
guacone collect files provenance.intoto.jsonl

Interroger GUAC

GUAC expose une API GraphQL. Vous pouvez l’interroger via :

Via le CLI : requêtes courantes

Trouver les vulnérabilités d’un package :

Terminal window
guacone query vuln "pkg:npm/lodash@4.17.20"

Sortie :

+-------------+-----------+---------------------------------------+
| NODE TYPE | NODE ID | ADDITIONAL INFORMATION |
+-------------+-----------+---------------------------------------+
| certifyVuln | 148776 | vulnerability ID: ghsa-35jh-r3h4-6jhm |
| certifyVuln | 148777 | vulnerability ID: cve-2021-23337 |
+-------------+-----------+---------------------------------------+

Obtenir tout ce qu’on sait sur un package :

Terminal window
guacone query known "pkg:golang/github.com/prometheus/client_golang@1.11.0"

Via GraphQL : requêtes avancées

Pour des requêtes complexes, utilisez directement l’API GraphQL.

Exemple 1 : Tous les packages vulnérables dans le graphe

query TousLesPackagesVulnerables {
CertifyVuln(certifyVulnSpec: {}) {
package {
type
namespaces {
namespace
names {
name
versions {
version
}
}
}
}
vulnerability {
vulnerabilityIDs {
vulnerabilityID
}
}
}
}

Exécution via cURL :

Terminal window
curl -s http://localhost:8080/query \
-H "Content-Type: application/json" \
-d '{
"query": "{ CertifyVuln { package { type namespaces { names { name versions { version } } } } vulnerability { vulnerabilityIDs { vulnerabilityID } } } }"
}' | jq .

Exemple 2 : Impact d’une CVE spécifique

“Quels artefacts sont impactés par Log4Shell ?”

query ImpactLog4Shell {
CertifyVuln(
certifyVulnSpec: {
vulnerability: { vulnerabilityID: "cve-2021-44228" }
}
) {
package {
namespaces {
names {
name
versions {
version
}
}
}
}
}
}

Exemple 3 : Packages sans SBOM

“Quels packages n’ont pas de SBOM attaché ?” (pour identifier les trous de couverture)

query PackagesSansSBOM {
packages(pkgSpec: {}) {
namespaces {
names {
name
versions {
version
# Si ce package n'apparaît pas dans HasSBOM, c'est qu'il manque
}
}
}
}
}

Cas d’usage concrets

Réponse aux incidents (CVE 0-day)

Scénario : Une nouvelle CVE critique (type Log4Shell) est publiée un vendredi à 17h. Vous devez identifier rapidement tous les systèmes impactés.

  1. Identifier le package concerné

    La CVE mentionne log4j-core versions 2.0 à 2.14.1. Le pURL est : pkg:maven/org.apache.logging.log4j/log4j-core

  2. Requêter GUAC

    Terminal window
    guacone query vuln "pkg:maven/org.apache.logging.log4j/log4j-core"
  3. Analyser les résultats

    GUAC retourne la liste de tous les artefacts qui utilisent log4j (directement ou transitivement).

  4. Prioriser la remédiation

    • Production critique → patch immédiat
    • Environnements de dev → planifier
    • Dépendances transitives → évaluer le risque réel

Temps de réponse : Quelques minutes au lieu de plusieurs heures.

Conformité réglementaire (CRA, NIS2)

Le Cyber Resilience Act européen et NIS2 imposent :

  • Inventaire des composants logiciels → SBOM dans GUAC
  • Traçabilité des artefacts → Attestations SLSA dans GUAC
  • Gestion des vulnérabilités → Certifiers OSV dans GUAC

Requête d’audit : “Prouvez que vous savez ce qui compose votre logiciel”

Terminal window
# Export de tous les packages connus
guacone query known --all > inventaire-complet.json

Évaluation avant adoption

Avant d’ajouter une nouvelle dépendance, interrogez GUAC :

query EvaluerDependance {
# Score OpenSSF Scorecard
scorecards(scorecardSpec: { source: { name: "github.com/nouveau/projet" } }) {
aggregateScore
checks {
check
score
}
}
# Historique de vulnérabilités
CertifyVuln(
certifyVulnSpec: { package: { name: "nouveau-projet" } }
) {
vulnerability {
vulnerabilityIDs {
vulnerabilityID
}
}
}
}

Intégrations

GUAC s’intègre dans votre écosystème existant :

OutilType d’intégrationDirection
Syft / TrivyGénérateurs SBOMSBOM → GUAC
CosignSignatures et attestationsAttestations → GUAC
GrypeScanner de vulnérabilitésRésultats scan → GUAC
Dependency-TrackGestion vulnérabilitésBidirectionnel
GitHub ActionsCI/CDIngestion automatique
HarborRegistry OCIPull SBOM automatique

Exemple : Ingestion automatique en CI

.github/workflows/supply-chain.yml
name: Supply Chain Security
on:
push:
branches: [main]
jobs:
sbom-to-guac:
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- name: Generate SBOM
uses: anchore/sbom-action@v0
with:
format: cyclonedx-json
output-file: sbom.json
- name: Push to GUAC
run: |
curl -X POST http://guac.internal:8080/collect/files \
-F "file=@sbom.json"

Dépannage

SymptômeCause probableSolution
”No packages found”SBOM pas encore ingéréVérifier guacone collect et les logs
Visualizer ne répond pasPort 3000 non exposéVérifier docker compose ps
Pas de vulnérabilitésCertifier OSV non lancéLancer guacone certifier osv
Ingestion lenteBackend in-memory saturéPasser à PostgreSQL
”Connection refused” GraphQLAPI pas démarréeVérifier le conteneur guac-graphql

À retenir

  1. GUAC = graphe de connaissances qui connecte SBOM, vulnérabilités, attestations SLSA et dépendances

  2. Une requête remplace des heures de recherche manuelle lors d’incidents de sécurité

  3. Les certifiers enrichissent automatiquement le graphe avec les données OSV, Scorecard et licences

  4. PostgreSQL en production : le backend in-memory est uniquement pour les démos

  5. L’alimentation est clé : un GUAC vide est inutile. Intégrez la génération et l’ingestion SBOM dans votre CI/CD

  6. GraphQL pour les requêtes avancées : le CLI couvre 80% des besoins, mais GraphQL débloque les cas complexes

Pour aller plus loin

Ressources externes