Aller au contenu

2026-06-16 — Audit « notations de cybersécurité externes applicables au dépôt »

ChampContenu
Date2026-06-16
Typerevue ciblée — quels référentiels de notation cybersécurité s’appliquent à un dépôt d’IaC Kubernetes de recherche, et où le dépôt se situe sur chacun (preuves = fichier:ligne, sorties gh/git, ou absences par grep nul)
Fonderéflexion — alimente une issue parapluie (manques actionnables) et de futurs ADR/plans. Aucune décision ici.
Prolongele passage de maturité du 2026-06-15 (issue #349 — DORA/MLOps/CNCF/SLSA+SAMM) — qu’il ne réécrit pas : ce passage prend l’angle complémentaire des notations cyber chiffrées (Scorecard /10, CIS PASS/FAIL, mapping NIST/ANSSI).
Verdict3 référentiels directement applicables et partiellement déjà couverts : OpenSSF Scorecard (≈ moitié des checks verts sans effort), CIS Benchmarks (Trivy config posé, mode compliance/kube-bench absents), NIST CSF/ANSSI (mapping documentaire à produire).

La question « existe-t-il des notations de cybersécurité qui concernent ce dépôt ? » se heurte au biais adoptif borné (ADR 0061) : une notation n’a de valeur que si elle mesure quelque chose de vrai sur un dépôt d’IaC mono-tenant de recherche sur réseau isolé, et non si elle empile un badge pour le badge. Trois traits du dépôt conditionnent toute lecture (rappelés une fois, repris du passage #349) :

  1. Pas de production permanente télémétrée — catalogue de topologies bench-validé, pas un cluster opéré (ADR 0023). Les notations qui supposent un service rendu (runtime CIS node-level) n’ont de sens que sur le banc, pas en CI statique.
  2. Compromis de sécurité assumés et tracés en ADR (registry HTTP sans auth ADR 0011, RStudio sans auth ADR 0012, pas de chiffrement Ceph ADR 0003) : une notation automatique les comptera comme des défauts. La parade est la grille d’exceptions par ADR déjà pratiquée pour Trivy (.trivyignore.yaml, justifiée par chemin) — cf. ADR 0058.
  3. Mono-mainteneur assumé (CODEOWNERS = * @chasset) : les checks de notation qui exigent une revue par les pairs (Scorecard Code-Review) resteront structurellement bas — choix tenu, pas un manque (SAFEGUARDS.md).

Ce passage ne crédite aucun palier au feeling : chaque ligne cite une preuve ouverte (fichier:ligne, gh api, grep nul re-confirmé au 2026-06-16).

1. OpenSSF Scorecard — santé supply-chain OSS (note /10, automatique)

Section intitulée « 1. OpenSSF Scorecard — santé supply-chain OSS (note /10, automatique) »

Référentiel le plus directement applicable : ~18 checks automatisés sur tout dépôt GitHub public, badge + dashboard. Aligné avec le profil « projet de recherche tracé, citable » (DOI Zenodo, CITATION.cff).

Check ScorecardÉtat au 2026-06-16Preuve
Branch-Protectionpartielerreur de lecture Scorecard (« Resource not accessible by integration ») : lire la protection exige des droits admin que le GITHUB_TOKEN n’a pas → repo_token: SCORECARD_TOKEN ajouté (scorecard.yml). RÉEL (gh api …/branches/main/protection 2026-06-19) : 13 required checks + strict:true mais reviews:0 (mono-mainteneur), enforce_admins:false, linear:false (voulu — merge-commit ADR 0037), signatures:false. La prédiction « vert attendu » du 2026-06-16 était inexacte (token non lisible alors)
Security-PolicyvertSECURITY.md présent (Private Vulnerability Reporting + modèle de menace assumé)
Pinned-Dependenciesvert (partiel)actions GitHub 100 % SHA-pinnées (ADR 0006) ; images : Dagster (#434), MLflow et désormais Marquez (eclipse-temurin:17, node:18-alpine) épinglées par digest d’index multi-arch (banc arm64). Restent NON pinnés (assumé) : pip install/npm install dans les images de build internes — le hash-pinning (--require-hashes + fichiers de hashes ; npm ci + lockfile) est un effort élevé pour un gain net faible sur des images reconstruites en interne (ADR 0061) ; tracé, non câblé
Dependency-Update-Toolvertrenovate.json (pinDigests:true, vulnerabilityAlerts)
CI-Testsvertci.yml 14 jobs / 13 requis
LicensevertLICENSE + NOTICE
Token-Permissionscorrigétous les workflows ont permissions: top-level ; le seul Warn (release.yml contents: write top-level) est confiné au job release-please (#435). ci.yml a bien contents: read
Code-Reviewrouge (assumé)required_approving_review_count:0, mono-mainteneur — choix tenu (SAFEGUARDS.md), pas corrigeable sans 2ᵉ relecteur
Signed-Releasesen courstags non signés à l’origine ; archive source signée cosign keyless + provenance SLSA attachée à chaque release (ADR 0088, release.yml, #366) — vérif. consommateur documentée (bootstrap/RUNBOOK.md)
SASTen coursTrivy fait l’IaC ; CodeQL (Python) câblé (codeql.yml, #367) sur le seul code applicatif réel (nestor/, scripts/ ; suite security-and-quality, tests/ exclus — shell déjà shellcheck, manifestes trivy/kubeconform). Non bloquant d’abord (alertes onglet Security)
Fuzzingen coursproperty-based testing (Hypothesis) sur les fonctions pures de nestor qui parsent une entrée externe (ADR 0087, #367) — N/A levé : ce n’est pas du fuzzing binaire mais de la génération d’entrées ciblée sur invariants
Packagingrouge (assumé)aucun paquet publié (npm/PyPI/registry). nestor est du Python qui pilote CE dépôt (chemins relatifs bench/, topologies/, run-phases.sh ; pyproject : « pas un paquet distribuable », ADR 0017) : un pip install hors dépôt n’aurait rien à piloter. Publier pour le badge = badge décoratif, écarté (ADR 0061/0080). N/A assumé et tracé, comme Code-Review — pas un trou

Effort de câblage : S. Action officielle ossf/scorecard-action + badge README.

Quick-wins réalisés (session 2026-06-18, score de départ 4.9/10).

  • Token-Permissions 0→ : release.yml contents: write ramené au seul job release-please (#435).
  • Pinned-Dependencies 6→ : les 2 Dockerfiles Dagster épinglés par digest d’index multi-arch (#434, dette ADR 0006).
  • SAST rouge→en cours : CodeQL (Python) câblé (#367).
  • Fuzzing N/A→en cours : property-based testing Hypothesis sur les fonctions pures de nestor (ADR 0087, #367).
  • Signed-Releases rouge→en cours : archive source signée cosign keyless + provenance SLSA attachée à chaque release (ADR 0088, #366).
  • Branch-Protection (−1) identifié comme faux négatif : la protection EST configurée (required_status_checks, reviews, signatures, enforce_admins, linear_history) mais le token Scorecard ne peut pas la lire.

Restent assumés : Code-Review (mono-mainteneur, SAFEGUARDS.md), Maintained (dépôt < 90 j, se résout seul), Packaging (N/A tracé : nestor pilote ce dépôt et n’a pas de sens en paquet autonome — cf. ligne du tableau ci-dessus). Fuzzing et Signed-Releases sont sortis de cette liste : property-based testing et signature de release en cours (ADR 0087/0088).

2. CIS Benchmarks — posture de durcissement (PASS/WARN/FAIL par contrôle)

Section intitulée « 2. CIS Benchmarks — posture de durcissement (PASS/WARN/FAIL par contrôle) »

Le référentiel cœur de l’IaC K8s/Linux. Le dépôt en couvre déjà une partie sans le nommer « CIS ».

Composant CISÉtat au 2026-06-16Preuve
CIS Kubernetes (misconfig manifestes)partiel — Trivy configci.yml scan-type: config, HIGH/CRITICAL bloquant, .trivyignore.yaml justifié par chemin (ADR 0010/0011/0012)
CIS K8s mode compliance (rapport par contrôle)absentTrivy lancé en config, pas --compliance k8s-cis → aucun rapport PASS/FAIL par contrôle CIS
CIS K8s node-level (kube-bench)absentgrep kube-bench = nul ; aucune exécution node-level (ne se mesure que sur cluster réel → place naturelle = banc Lima, ADR 0034)
Pod Security Standards (CIS-aligné)présentPSA baseline (ADR 0014) ; Kyverno CLI statique en CI acté (ADR 0075)
CIS Distribution-Independent Linux (durcissement OS)partiel opt-inbootstrap/security/ (auditd, fail2ban, unattended-upgrades) 100 % opt-in (IMPLICATIONS.md) ; non noté contre CIS

Point sensible : un score CIS pénalisera les compromis assumés (HTTP/auth/chiffrement). Tout rapport CIS produit doit donc s’accompagner d’une grille d’exceptions par ADR (modèle .trivyignore.yaml), sinon il lira comme un échec ce qui est une décision.

Effort : M. (a) Étendre Trivy d’un job --compliance k8s-cis (statique, non bloquant d’abord) ; (b) ajouter kube-bench comme assertion de banc dans bench/lima/ (run-phases), pas en CI (nested-virt impossible, cf. bench-freshness.yml:6-9).

3. NIST CSF 2.0 / ANSSI — gouvernance (mapping, pas une note)

Section intitulée « 3. NIST CSF 2.0 / ANSSI — gouvernance (mapping, pas une note) »

Pas un scoring automatique : un mapping contrôle → preuve dans le dépôt. Pertinent pour le contexte universitaire (univ-lehavre). Le dépôt couvre déjà, de fait, plusieurs fonctions du CSF — sans les avoir cartographiées.

Fonction NIST CSF 2.0Couverture de faitPreuve
Governforte76 ADR Nygard, audit-conventions (ADR 0060), SECURITY.md/CODE_OF_CONDUCT.md
Identifymoyenneinventaire composants (docs/composants.md), registre de drifts, matrice de versions (ADR 0006)
Protectfortedurcissement kubeadm/PSA/etcd (ADR 0014), Cilium NetworkPolicies (ADR 0019), cert-manager CA interne (ADR 0021), hardening OS opt-in
Detectmoyenne-fortebootstrap/state.sh (drift 7 couches), auditd, Hubble L3/L4/L7
Respondmoyennerollback par phase/atomique (ADR 0054/0066), rescue Ansible (ADR 0050) — prouvés sur banc, pas en incident réel
Recoverforteetcd snapshot+restore (timer + RUNBOOK), CNPG Barman, Ceph size:3 / EC 2+1

Effort : M (rédaction). Produire une page docs/ (grille de mapping CSF→preuve), sous doctrine ADR 0058 (passage daté). ANSSI (Guide d’hygiène) en second temps si le contexte de financement le demande.

Conformément à ADR 0058, les manques actionnables de ce passage deviennent une issue (parapluie, 3 axes en cases à cocher).

  1. (impact medium · effort S) OpenSSF Scorecard non câblé + ci.yml sans bloc permissions:. Action : workflow scorecard.yml + badge ; permissions: { contents: read } en tête de ci.yml. Preuve : grep scorecard = nul (hors cette note) ; grep -c permissions ci.yml = 0.
  2. (impact medium · effort M) CIS non noté par contrôle. Action : job Trivy --compliance k8s-cis (statique) + kube-bench en assertion de banc, accompagnés d’une grille d’exceptions par ADR. Preuve : ci.yml scan-type: config seul ; grep kube-bench = nul.
  3. (impact low · effort M) Pas de mapping CSF/ANSSI explicite. Action : page docs/ grille CSF→preuve (passage daté ADR 0058). Preuve : grep NIST\|CSF\|ANSSI = nul dans docs/.
  • Preuves vérifiées au 2026-06-16 : grep -c permissions ci.yml = 0 ; git tag -v échoue (tags non signés) ; 76 ADR ; scan-type: config dans ci.yml ; grep nul kube-bench/scorecard/codeql.
  • Scorecard non exécuté réellement : les états « vert/rouge » sont prédits depuis le code et le réglage gh api, pas issus d’un run scorecard-action. Le run réel peut nuancer (ex. Maintained, Dangerous-Workflow).
  • CIS non scoré : aucun rapport kube-bench/Trivy-compliance produit ici — ce passage constate la capacité/absence d’outillage, pas un score CIS.
  • Frontière cluster/atlas : seul cluster est audité ; la posture applicative (SBOM/scan d’image côté atlas) est hors périmètre.
  • Ce passage est figé (ADR 0058) : il décrit l’état au 2026-06-16.