🇬🇧 English · 🇫🇷 Français
Pépin trouve les pépins de votre cloud souverain.
Chaque commande de cet enregistrement s'exécute réellement. Il est régénéré à
chaque release depuis tools/demo/quickstart.fr.tape, et le preflight refuse de
taguer une version que le GIF ne montre pas. Sa jumelle anglaise est sur
README.md.
Pépin est un scanner de posture (CSPM) pour les clouds souverains européens (Exoscale, Outscale, Scaleway). Il évalue la configuration effective d'un tenant contre un référentiel commun ancré sur SCSL, SecNumCloud 3.2, CIS Controls v8 et ISO/IEC 27001:2022 / 27017, et produit un résultat opposable : un statut typé par contrôle, ses références normatives exactes, et un dossier de preuve scellé.
- Souverain d'abord : vocabulaire natif de chaque provider (Net/Subnet/EIM, BSU/OOS, Kapsule…), jamais par comparaison à un hyperscaler non souverain.
- Bilingue, langue détectée : rapports, aide et erreurs sortent en français ou en anglais, de tout l'outil et pas de la moitié. Voir Langue.
- Résultat opposable, pas juste des findings : chaque contrôle est
pass/fail/not-applicable(justifié) /not-evaluated(avec la raison). Un « pass » n'est affirmé que si la donnée nécessaire a réellement été collectée : « aucun finding » n'est jamais confondu avec « conforme ». - Deux sources : collecte live via l'API du provider, ou audit d'un
plan Terraform (
terraform show -json) — sans rien provisionner. - Dossier de preuve :
--sealécrit un bundle horodaté (inventaire évalué, assessment, OSCAL 1.1.2, manifeste à empreintes) quepepin verifyrecontrôle, avec vérification de signature cosign optionnelle.
Les binaires publiés (empreintes, signature, provenance SLSA), l'image de conteneur, l'action GitHub et le modèle GitLab sont documentés dans docs/install.fr.md. Depuis les sources :
# build (Go 1.26+)
go build -o pepin .
# auditer un plan Terraform (aucune ressource provisionnée)
terraform plan -out tfplan && terraform show -json tfplan > plan.json
./pepin scan scaleway --terraform plan.json
# collecte live (identifiants via l'environnement / config native du provider)
./pepin scan outscale --live --region eu-west-2
# dossier de preuve scellé + vérification
./pepin scan scaleway --terraform plan.json --seal ./bundle
./pepin verify ./bundle --pubkey cosign.pubFormats de sortie : --format table|json|assessment|oscal|sarif.
Codes de sortie : 0 conforme · 1 non-conformité · 2 erreur · 3 le scan
n'établit pas la conformité — rien de mesuré, ou une collecte qui n'a pas pu lire tout
le périmètre, ou, avec --strict, écarts medium/low restants · 4 tout écart
critical/high est couvert par une dérogation valide (exploitables en CI). Un scan qui
n'a collecté aucune ressource ne rend jamais 0, et un scan qui n'a pas pu lire une
partie de son périmètre non plus : un résultat vide n'est pas conforme, un résultat
partiel non plus, un résultat dérogé non plus.
Chaque artefact de release est couvert. Une commande pour chacun, et rien à croire sur parole.
V=v0.3.0
gh release download "$V" --repo stephrobert/pepin
# 1. les sommes sont signées, et elles couvrent les binaires ET le SBOM
cosign verify-blob checksums.txt \
--bundle checksums.txt.cosign.bundle \
--certificate-identity-regexp '^https://github\.com/stephrobert/pepin/\.github/workflows/release\.yml@refs/tags/v' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com
# 2. vos fichiers correspondent à ces sommes signées
sha256sum --check checksums.txt --ignore-missing
# 3. le binaire a bien été produit par le workflow de release de ce dépôt (provenance SLSA)
gh attestation verify pepin-linux-amd64 --repo stephrobert/pepinLe SBOM (sbom.cdx.json, CycloneDX) accompagne chaque release. L'étape 1 couvre
le fichier publié ; il est par ailleurs attesté contre les binaires, ce qui est une
affirmation différente — que cet inventaire décrit cette compilation :
gh attestation verify pepin-linux-amd64 --repo stephrobert/pepin \
--predicate-type https://cyclonedx.org/bom
# à donner à l'outil que vous utilisez déjà
osv-scanner --sbom sbom.cdx.jsonPépin parle français et anglais, et choisit tout seul :
--lang=fr|en → PEPIN_LANG → LC_ALL → LANG → repli : enLa première source non vide décide, et toute locale que Pépin ne parle pas
retombe sur l'anglais, sans erreur. Le choix vaut pour tout ce qu'un humain lit
(rapport, verdict, aide, erreurs) et pour les formats parsables : json,
sarif, oscal et assessment portent leur prose dans la langue résolue.
Ce qui est stable d'une langue à l'autre, et ce qui ne l'est pas. Les codes
(CLD-NET-1), les identifiants de check, les sévérités (critical…), les
statuts (pass, fail, not-applicable, not-evaluated), les sujets et les
codes de sortie ne changent jamais avec la langue : c'est sur eux qu'un pipeline
s'appuie. Les titres, messages, remédiations et preuves sont de la prose, et
changent. Figer PEPIN_LANG en CI si vous comparez le texte d'un rapport d'une
exécution à l'autre.
Laquelle fait foi. Le français est la langue de référence du contenu
normatif : le référentiel (referentiel/controles.yaml) et les règles sont
écrits en français d'abord, l'anglais en est la traduction maintenue. Là où une
lecture juridique ou contractuelle est en jeu, c'est la formulation française
d'un contrôle qui fait foi.
- Démarrage rapide : cinq minutes, aucun compte cloud, un échec réel, sa correction, et un second scan qui dit autre chose.
- Lire un scan : un run réel, commenté ligne à ligne, jusqu'au code de sortie.
- Le modèle d'assessment : ce que
pass,fail,not-applicable,not-evaluatedetexemptedaffirment réellement. - Matrice de couverture : ce qui est mesurable, par fournisseur et par source. Générée depuis le référentiel et les descripteurs, vérifiée en CI.
- Carte de qualité de détection : ce que Pépin sait prouver
de ses propres verdicts, et ce qu'il ne sait pas. Générée depuis le registre de véracité,
les tenants de référence et les relevés de canari ; aucun de ses chiffres n'est saisi, et
aucun n'est flatteur.
pepin control explain <code>répond à la même question pour un contrôle donné. - Catalogue des contrôles : une page générée par contrôle, ce qu'il conclut, depuis quelle source, et comment corriger ce qu'il trouve.
- Limites connues : les angles morts, nommés.
- Périmètre et non-objectifs : ce qu'un rapport Pépin n'est pas.
- Plan Terraform contre scan live : choisir la source, et les divergences réelles entre les deux.
- Fournisseurs : Scaleway · Outscale · Exoscale : authentification, appels d'API, permissions minimales en lecture seule, couverture.
- Référence : CLI · Codes de sortie · Formats de sortie · Inventaire normalisé.
- Guides : Remédiation · Configurer les contrôles — le fichier de politique, et ce qu'un assouplissement fait perdre · Le bundle de preuve · Tracer les appels réels : ce qu'un enregistrement prouve, et ce qu'il ne prouve pas · Les tenants de référence : des configurations tierces rejouées à chaque build, et pourquoi une fixture ne peut pas faire leur travail · GitHub Actions · GitLab CI.
- Contribution : Ajouter un contrôle · Ajouter un fournisseur · Architecture.
- Installation · Feuille de route : où va l'effort ensuite.
internal/collect: moteur de collecte déclaratif (specs YAML → modèle normalisé).providers/*.yaml: descripteurs d'un provider (auth, collecte live, mapping Terraform, contrat d'API). Un provider = trois sources dans un seul fichier YAML.internal/commonrules/rules/*.rego: règles communes (OPA/Rego) qui évaluent le modèle normalisé, indépendamment du provider.referentiel/: le référentiel de contrôles (code neutre → sévérité, SCSL, correspondances de normes, fournisseurs). Source de vérité, testée contre l'invention de références.internal/assess: construit l'assessment opposable (statuts, preuves, provenance) et le bundle scellé (OSCAL, empreintes, cosign).
Voir CONTRIBUTING.md pour ajouter un provider ou une règle, et SECURITY.md pour la divulgation de vulnérabilités.
Pépin évalue la configuration d'un tenant (côté commanditaire). Les correspondances normatives citées (SecNumCloud, ISO, CIS) sont indicatives : un rapport Pépin n'est pas une preuve de qualification ou de certification, lesquelles portent sur le prestataire de service cloud, pas sur un scan de tenant.
Apache-2.0 : voir LICENSE et NOTICE.
La marque et ses fichiers sont documentés dans docs/brand.fr.md ; le nom Pépin et le logo ne sont pas couverts par la licence Apache 2.0.