Sécurité : suppression du mot de passe root et en-têtes #4

Merged
foXaCe merged 4 commits from hermes/securite into main 2026-10-16 10:06:30 +02:00
Collaborator

Supprime l'authentification par mot de passe root côté configuration et service Python ; seul le jeton d'API Proxmox est accepté. Ajoute des en-têtes de sécurité sur toutes les réponses du service Rust.

Tests : cargo test --release --locked = 48+3+6+24+9+1 tests passés, 0 échec.
Build release sans erreur ni avertissement.
cargo audit (181 dépendances) : aucune vulnérabilité.
npm non applicable (aucun package.json dans ce dépôt).

Supprime l'authentification par mot de passe root côté configuration et service Python ; seul le jeton d'API Proxmox est accepté. Ajoute des en-têtes de sécurité sur toutes les réponses du service Rust. Tests : `cargo test --release --locked` = 48+3+6+24+9+1 tests passés, 0 échec. Build release sans erreur ni avertissement. `cargo audit` (181 dépendances) : aucune vulnérabilité. npm non applicable (aucun package.json dans ce dépôt).
Inventaire des routes de server.py (page /, /icone/<nom>.png, /api/status,
/api/action, 404 nus), de leurs entrees et sorties et des appels amont
Proxmox et Docker, releve le 2026-10-15 sur l'instance en marche
(http://192.168.1.70:8590, LXC 115).

- docs/COMPORTEMENT.md : une section par route, les appels amont, la
  configuration codee en dur a sortir du code et les fragilites observees.
- tests/caracterisation.py : banc stdlib qui interroge une instance en marche
  et la compare au contrat enregistre ; --enregistrer reecrit les fixtures.
  Sortie 0 vert, 1 contrat rompu, 2 service injoignable.
- tests/fixtures/ : reponses de reference anonymisees (vmid renumerotees,
  noms de conteneurs remplaces, volumes generiques).

17 tests, tous verts contre la version Python en marche ; 9 echecs et
6 erreurs quand le banc vise une autre implementation (forgejo:3000), ce qui
montre qu'il distingue reellement les contrats.
feat(socle): client Proxmox typé, service axum et CI Forgejo (2/7)
Some checks failed
CI (backend Rust) / Rust (backend) (push) Failing after 7s
CI (backend Rust) / Rust (backend) (pull_request) Failing after 21s
23093c8703
Ce socle remplace pve_ticket()/pve_api() de server.py : jeton d'API au lieu
d'un mot de passe root, billet gardé une heure au lieu d'une
réauthentification à chaque appel, erreurs typées au lieu du texte brut de
l'exception rendu à la page, et le nom du nœud devient un paramètre au lieu
d'être écrit dans neuf chemins.

- backend/ : espace Cargo à deux membres. pve-client (reqwest/rustls, serde,
  thiserror) porte l'authentification, le cache de billet et les appels ;
  pve-api (axum + tokio) porte le service et la configuration par variables
  d'environnement. Le mode jeton d'API est le mode par défaut ; le mode
  utilisateur/mot de passe reste possible en repli.
- Routes du socle : GET /api/sante (sans toucher Proxmox) et GET /api/status,
  qui ne sert pour l'instant que les blocs pve et lxc du contrat du ticket 1 ;
  disk, docker et temps viendront aux tickets suivants.
- 57 tests : unitaires sur les arrondis, le motif de durée de marche, le cache
  de billet et la configuration ; et, contre un faux Proxmox (wiremock)
  alimenté par les fixtures du relevé, la lecture de l'état du nœud, le
  billet demandé une seule fois, une configuration de conteneur illisible qui
  rend onboot null, et une panne amont qui rend 502 avec un message borné.
- .forgejo/workflows/ci.yml : cargo fmt --check, clippy -D warnings, test, et
  couverture cargo-llvm-cov (seuil 80 % sur la logique métier).
- README, CHANGELOG.md et .env.example mis à jour ; aucun secret dans le
  dépôt, .env.example ne porte que des noms de variables.
feat(api): parité 3/7 — /api/status à cinq blocs et /api/action
All checks were successful
CI (backend Rust) / Rust (backend) (push) Successful in 40s
CI (backend Rust) / Rust (backend) (pull_request) Successful in 40s
9dbf8203c6
CHAMP D'API CHANGÉ : /api/status sert désormais les cinq blocs du contrat
figé au ticket 1 — pve, lxc, docker, disk, temps. Le front (carte 4/7)
en dépend : prévenir `svelte`. La forme suit docs/COMPORTEMENT.md et
tests/fixtures/ ; les blocs ont chacun leur valeur de repli et la
réponse reste 200, comme le veut le contrat.

Cause et remède :

- Cause : le socle ne servait que pve et lxc, sans Docker, sans disque et
  sans températures ; les actions n'existaient pas.
- Remède : docker via /var/run/docker.sock (bollard, version d'API figée
  1.44) ; disk reprend la topologie réelle de server.py (disque physique,
  écrit, alloué, arbre avec l'excédent non récupéré) ; temps lit le
  fichier déposé par l'hôte ; POST /api/action traite nœud, LXC, démarrage
  auto et Docker en rendant toujours 200 ; GET /icone/<nom>.png sert une
  icône du disque avec un nom filtré.

Deux écarts assumés, mesurés :
- /api/status ne rend plus 502 sur panne amont : il reste 200 avec le
  repli du bloc, parce que le contrat du ticket 1 ne distingue pas une
  panne d'un état normal. Les bancs du socle qui figeaient le 502 sont
  mis à jour.
- une action Docker inconnue est refusée (trois actions seulement), là où
  server.py laissait passer la chaîne (fragilité 4 du relevé).

Les valeurs codées en dur de server.py sortent vers l'environnement :
PVE_DOCKER_SOCKET, PVE_TEMPERATURES, PVE_ICONES, PVE_STOCKAGE_RACINE,
PVE_STOCKAGE_POOL, PVE_GROUPE_VOLUMES, PVE_STOCKAGE_PARTAGE,
PVE_PARTAGE_MONTAGE.

Mesures : fmt et clippy verts, cargo build --release et
cargo test --release verts (91 tests), couverture 93,35 % des lignes.
Caractérisation du ticket 1 rejouée contre le service Rust : 16/17, seul
le test de la page HTML échoue (page servie par la carte 4/7).
Suppression de l'usage du mot de passe root et en-têtes de sécurité
All checks were successful
CI (backend Rust) / Rust (backend) (push) Successful in 40s
CI (backend Rust) / Rust (backend) (pull_request) Successful in 40s
dcf77a9981
La configuration n'accepte plus qu'un jeton d'API Proxmox (PVE_TOKEN_ID et
PVE_TOKEN_SECRET) et refuse tout utilisateur ou mot de passe, y compris dans
le service Python historique. Les en-têtes de sécurité (type MIME, cadre,
referrer, politique de contenu) sont ajoutés sur toutes les réponses du service
Rust. Audit cargo audit propre (181 dépendances) et npm non applicable (pas de
dépendance front dans ce dépôt).
foXaCe merged commit 7effbb0348 into main 2026-10-16 10:06:30 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
foXaCe/pve-control!4
No description provided.