Toutes les recommandations de l’audit, classées par priorité et par effort.
Le classement combine la gravité vérifiée et le rapport valeur/coût pour un
mainteneur quasi unique en milieu recherche.
Ces points touchent à l’intégrité des données et à la capacité réelle de
récupération. Un seul incident peut être irréversible.
| # | Action | Constat source | Effort |
|---|
| 1 | Tester la restauration etcd sur le banc (scénario 09-etcd-restore.sh : effacer etcd → etcdctl snapshot restore → vérifier le retour des workloads) | 02, 08 | Moyen |
| 2 | Définir une sauvegarde des données applicatives (ADR RPO/RTO + CSI VolumeSnapshots des PVC critiques et/ou réplication des buckets S3) ; basculer les pools précieux en preservePoolsOnDelete: true | 08 | Moyen |
| 3 | Copier les snapshots etcd hors-nœud (fetch Ansible ou push S3/autre nœud) + documenter le RPO | 08 | Faible |
| 4 | Qualifier les datasets twitter/reddit au regard du RGPD (référent/DPO) ; selon le verdict, réviser ADR 0003/0011/0012 ou documenter l’anonymisation amont | 08 | Faible (décision) |
| # | Action | Constat source | Effort |
|---|
| 5 | Créer docs/glossaire.md (Kubernetes, etcd, CNI, CRI, OSD, MON, PVC, RWX, erasure coding, drift, hyperconvergence, Tailscale…), le placer en tête de sidebar, le lier depuis le README | 04 | Moyen |
| 6 | Gloser chaque terme à son premier usage et lier vers le glossaire ; marquer les sections « avancé/optionnel » | 04 | Moyen |
| 7 | Page docs/demarrage.md : public visé, prérequis de connaissances, parcours numéroté 1→5 | 04 | Faible |
| # | Action | Constat source | Effort |
|---|
| 8 | Job trivy (image + config IaC) en CI, échec sur HIGH/CRITICAL + allowlist documentée des compromis ADR | 03, 11 | Faible |
| 9 | renovate (ou dependabot npm + Actions), PR groupées mensuelles ; maintient aussi les digests | 11 | Faible |
| 10 | Aligner la toolbox Ceph sur v20.2.1 (idéalement digest), supprimer :v19 | 05, 11 | Trivial |
| 11 | Épingler par digest @sha256 les composants critiques (rook/ceph, ceph, registry) | 11 | Faible |
| # | Action | Constat source | Effort |
|---|
| 12 | bats-core sur les fonctions pures de state.sh (classification passwd, comptage HDD, parsing) — meilleur ROI du dépôt | 09 | Moyen |
| 13 | Corriger les faux-positifs des scénarios 04 et 05 (exit 1 à l’expiration des boucles d’attente) | 02 | Faible |
| 14 | Passer le parsing ceph en -f json | jq (scénarios 03/05) ; robustifier le passage de données de state.sh (JSON+jq) ; lire getent shadow au lieu de chage | 09 | Faible |
| 15 | Résoudre le drift #9 (CSI) ✅ fait (ROOK_USE_CSI_OPERATOR: "false") → reste : dérouler les 8 scénarios de bout en bout et consigner les exit codes | 02 | Moyen |
| # | Action | Constat source | Effort |
|---|
| 16 | Justfile racine mince nommant l’existant (bootstrap, state, security-report, test-bench, test-scenarios) + section « Par où commencer » dans le README liant les RUNBOOK | 10 | Faible |
| 17 | Observabilité : a minima metrics-server ; idéalement kube-prometheus-stack + monitoring.enabled: true (alertes Ceph) | 08 | Moyen/Élevé |
| 18 | Runbook + playbook kubeadm upgrade ; renommer upgrade.yaml → os-upgrade.yaml | 08 | Moyen |
| 19 | Surveillance SMART NVMe (smartd + alerte, ou couche state.sh) | 08 | Faible |
| # | Action | Constat source | Effort |
|---|
| 20 | ⏸️ REPORTÉ sine die — Matérialiser l’hypothèse réseau : committer le Tailscale operator + ACL et le marquer requis (ou documenter le contrôle réseau réel dans SAFEGUARDS.md) | 06 | Moyen |
| 21 | ✅ Fait (ADR 0014) — ClusterConfiguration kubeadm : audit-policy + EncryptionConfiguration (Secrets etcd) + PodSecurity admission ; choix tracé en ADR | 06 | Moyen |
| 22 | ✅ Fait (platform/network-policies/) — NetworkPolicies de base (default-deny par namespace) | 06 | Moyen |
| 23 | ✅ Fait — securityContext sur RStudio (+ wordpress, mysql) (drop ALL, seccomp, runAsNonRoot) | 06 | Trivial |
| 24 | ✅ Fait (ufw.yml) — Jeu de règles UFW K8s/Cilium/Ceph ; SSH restreint ; absence d’UFW signalée comme drift | 06 | Moyen |
| 25 | ✅ Fait — Dashboard Ceph en ClusterIP ; Service WordPress en ClusterIP | 06 | Trivial |
| # | Action | Constat source | Effort |
|---|
| 26 | CITATION.cff (DOI cluster, auteurs + ORCID) — important pour la recherche | 07 | Trivial |
| 27 | SECURITY.md + activer Private Vulnerability Reporting | 07 | Trivial |
| 28 | Trancher le versionnement : release-please seul (retirer commit-and-tag-version) ; corriger l’en-tête du CHANGELOG | 07 | Faible |
| 29 | Branch protection rule GitHub (PR + checks requis) — le hook local est contournable | 07 | Trivial |
| 30 | Clarifier la licence du subtree (re-licencier MIT ou NOTICE + SPDX) | 07 | Faible |
| 31 | CODE_OF_CONDUCT.md, templates issue/PR, CODEOWNERS | 07 | Faible |
| # | Action | Constat source |
|---|
| 32 | Supprimer bootstrap/bootstrap/ ; harmoniser .env-example/.gitignore/doc | 01 |
| 33 | editLink → univ-lehavre ; ignoreDeadLinks → liste ciblée ; socialLinks GitHub ; platform/README.md + apps/README.md | 04 |
| 34 | Parité lint : jscpd en pre-push, lint:k8s/lint:ansible dans pnpm lint, factoriser les exclusions kubeconform, corriger l’incompat .yamllint/ansible-lint | 03 |
| 35 | markdownlint + lychee (link-checker) en CI | 03 |
| 36 | Aligner ADR 0005 et le code (hold containerd) ; figer le patch K8s ; épingler les actions GitHub | 05 |
| 37 | Compléter la table bootstrap/README.md ; ajouter la table bench/+docs/ au README racine | 01, 04 |
| 38 | Factoriser bootstrap/lib/ssh-report.sh ; bench/scenarios/lib.sh ; lever la collision SSH_OPTS | 10 |
Pour un mainteneur quasi unique, tracer les choix structurants réduit le risque
:
- ADR 0013 — « bash pour l’orchestration de CLIs / JSON+jq pour le parsing /
python3 toléré / bats-core pour les fonctions pures »
(09).
- ADR — stratégie de sauvegarde des données (RPO/RTO)
(08).
- ADR — stratégie d’upgrade K8s (rebuild vs in-place)
(08).
- ADR — choix Rook-Ceph vs Longhorn (compromis assumé)
(11).
- ADR — observabilité (option retenue) (08).
- Compléter les ADR 0003/0011/0012 si la qualification RGPD change la donne.
Note de méthode — Les gravités de ce plan reflètent la vérification
adversariale : plusieurs constats sécurité, initialement « majeurs », ont été
ramenés à « mineur » parce qu’ils correspondent à des risques assumés et
documentés en ADR. Ils restent dans le plan comme durcissements
defense-in-depth, pas comme failles ouvertes. Inversement, les points de
Priorité 1 (résilience non prouvée, RGPD) sont maintenus « majeurs » car ils
ne sont pas couverts par une décision explicite.