Aller au contenu

12 — Plan d'action priorisé

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.

Priorité 1 — Résilience prouvée & sécurité des données (à traiter en premier)

Section intitulée « Priorité 1 — Résilience prouvée & sécurité des données (à traiter en premier) »

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.

#ActionConstat sourceEffort
1Tester la restauration etcd sur le banc (scénario 09-etcd-restore.sh : effacer etcd → etcdctl snapshot restore → vérifier le retour des workloads)02, 08Moyen
2Dé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: true08Moyen
3Copier les snapshots etcd hors-nœud (fetch Ansible ou push S3/autre nœud) + documenter le RPO08Faible
4Qualifier 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 amont08Faible (décision)

Priorité 2 — Objectif néophyte (le critère explicite de votre demande)

Section intitulée « Priorité 2 — Objectif néophyte (le critère explicite de votre demande) »
#ActionConstat sourceEffort
5Cré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 README04Moyen
6Gloser chaque terme à son premier usage et lier vers le glossaire ; marquer les sections « avancé/optionnel »04Moyen
7Page docs/demarrage.md : public visé, prérequis de connaissances, parcours numéroté 1→504Faible

Priorité 3 — Supply chain & gestion du risque OSS

Section intitulée « Priorité 3 — Supply chain & gestion du risque OSS »
#ActionConstat sourceEffort
8Job trivy (image + config IaC) en CI, échec sur HIGH/CRITICAL + allowlist documentée des compromis ADR03, 11Faible
9renovate (ou dependabot npm + Actions), PR groupées mensuelles ; maintient aussi les digests11Faible
10Aligner la toolbox Ceph sur v20.2.1 (idéalement digest), supprimer :v1905, 11Trivial
11Épingler par digest @sha256 les composants critiques (rook/ceph, ceph, registry)11Faible

Priorité 4 — Robustesse des tests & des scripts

Section intitulée « Priorité 4 — Robustesse des tests & des scripts »
#ActionConstat sourceEffort
12bats-core sur les fonctions pures de state.sh (classification passwd, comptage HDD, parsing) — meilleur ROI du dépôt09Moyen
13Corriger les faux-positifs des scénarios 04 et 05 (exit 1 à l’expiration des boucles d’attente)02Faible
14Passer 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 chage09Faible
15Ré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 codes02Moyen

Priorité 5 — Découvrabilité & opérabilité jour 2

Section intitulée « Priorité 5 — Découvrabilité & opérabilité jour 2 »
#ActionConstat sourceEffort
16Justfile racine mince nommant l’existant (bootstrap, state, security-report, test-bench, test-scenarios) + section « Par où commencer » dans le README liant les RUNBOOK10Faible
17Observabilité : a minima metrics-server ; idéalement kube-prometheus-stack + monitoring.enabled: true (alertes Ceph)08Moyen/Élevé
18Runbook + playbook kubeadm upgrade ; renommer upgrade.yamlos-upgrade.yaml08Moyen
19Surveillance SMART NVMe (smartd + alerte, ou couche state.sh)08Faible

Priorité 6 — Sécurité (durcissement defense-in-depth)

Section intitulée « Priorité 6 — Sécurité (durcissement defense-in-depth) »
#ActionConstat sourceEffort
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)06Moyen
21Fait (ADR 0014) — ClusterConfiguration kubeadm : audit-policy + EncryptionConfiguration (Secrets etcd) + PodSecurity admission ; choix tracé en ADR06Moyen
22Fait (platform/network-policies/) — NetworkPolicies de base (default-deny par namespace)06Moyen
23FaitsecurityContext sur RStudio (+ wordpress, mysql) (drop ALL, seccomp, runAsNonRoot)06Trivial
24Fait (ufw.yml) — Jeu de règles UFW K8s/Cilium/Ceph ; SSH restreint ; absence d’UFW signalée comme drift06Moyen
25Fait — Dashboard Ceph en ClusterIP ; Service WordPress en ClusterIP06Trivial
#ActionConstat sourceEffort
26CITATION.cff (DOI cluster, auteurs + ORCID) — important pour la recherche07Trivial
27SECURITY.md + activer Private Vulnerability Reporting07Trivial
28Trancher le versionnement : release-please seul (retirer commit-and-tag-version) ; corriger l’en-tête du CHANGELOG07Faible
29Branch protection rule GitHub (PR + checks requis) — le hook local est contournable07Trivial
30Clarifier la licence du subtree (re-licencier MIT ou NOTICE + SPDX)07Faible
31CODE_OF_CONDUCT.md, templates issue/PR, CODEOWNERS07Faible

Priorité 8 — Hygiène & cohérence (au fil de l’eau)

Section intitulée « Priorité 8 — Hygiène & cohérence (au fil de l’eau) »
#ActionConstat source
32Supprimer bootstrap/bootstrap/ ; harmoniser .env-example/.gitignore/doc01
33editLinkuniv-lehavre ; ignoreDeadLinks → liste ciblée ; socialLinks GitHub ; platform/README.md + apps/README.md04
34Parité lint : jscpd en pre-push, lint:k8s/lint:ansible dans pnpm lint, factoriser les exclusions kubeconform, corriger l’incompat .yamllint/ansible-lint03
35markdownlint + lychee (link-checker) en CI03
36Aligner ADR 0005 et le code (hold containerd) ; figer le patch K8s ; épingler les actions GitHub05
37Compléter la table bootstrap/README.md ; ajouter la table bench/+docs/ au README racine01, 04
38Factoriser bootstrap/lib/ssh-report.sh ; bench/scenarios/lib.sh ; lever la collision SSH_OPTS10

Décisions à formaliser en ADR (transmissibilité / bus-factor)

Section intitulée « Décisions à formaliser en ADR (transmissibilité / bus-factor) »

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.