diff --git a/docs/beta/runbook-portail-beta.md b/docs/beta/runbook-portail-beta.md index d29e88e..566eaeb 100644 --- a/docs/beta/runbook-portail-beta.md +++ b/docs/beta/runbook-portail-beta.md @@ -1,11 +1,12 @@ # Runbook — portail licence/téléchargement pour bêta contrôlée Portail `app_aivanov` (FastAPI). Objectif : permettre à un **client bêta** de -récupérer la GUI et d'activer sa licence. **Bêta contrôlée, accès restreint.** +récupérer la GUI et d'activer sa licence. -> ⚠️ Pré-requis de déploiement (NON couverts par le code actuel — voir §5) : -> reverse proxy **HTTPS**, **secrets forts**, **accès limité**. Tant que ces -> points ne sont pas en place, rester sur un accès interne/restreint. +> ⚠️ Pré-requis de déploiement (voir §5) : servir derrière un reverse proxy +> **HTTPS** et définir des **secrets forts** (`APP_SECRET_KEY`, `ADMIN_PASSWORD`). +> C'est le niveau adéquat : le portail ne contient **aucune donnée patient** +> (licences + compteurs agrégés uniquement). Pas besoin de VPN/IP allowlist. ## 1. Publier l'installateur GUI comme artefact actif Sur le serveur portail : @@ -32,14 +33,30 @@ Le SHA-256 est recalculé côté serveur — **vérifier qu'il == `8B437346…DE - **Téléchargement authentifié** : `GET /api/v1/download/{version}` exige une **session web connectée** + licence active (ou admin). Vérifier qu'un client connecté avec licence peut télécharger, et qu'un anonyme reçoit 401. - UX : un navigateur anonyme sur une route protégée est redirigé vers `/login` ; le logo renvoie à `/` ; favicon OK (correctifs F1/F2/F3). -## 5. Sécurité avant exposition (rappels — bloquants prod connus) -Ces points sont **hors des commits actuels** (sprint durcissement, GO Dom requis) ; en -attendant, **n'exposer le portail qu'en accès restreint** : -- **HTTPS obligatoire** via reverse proxy ; cookie de session `https_only` à activer hors dev. -- **Secrets forts** en variables d'environnement : `APP_SECRET_KEY`, `ADMIN_PASSWORD` (ne pas laisser les défauts dev `change-me`). -- **CSRF** : pas de protection sur les POST → limiter l'accès / front de confiance tant que non ajouté. -- **Rate-limiting `/login`** : absent → restreindre l'accès réseau (anti-brute-force). -- Retirer l'e-mail admin par défaut (`dom@aivanov.fr`) du code source (→ `.env`). +## 5. Sécurité — niveau proportionné (pas la NASA) +Modèle de menace réel : le portail ne stocke **aucune donnée patient** (tout le +traitement est local au poste client) — uniquement licences, jetons d'activation +et **compteurs d'usage agrégés**. Le seul actif sensible = l'installateur publié +et les actions admin. Le niveau adéquat est donc **HTTPS + login/mot de passe fort**, +pas un durcissement de banque. + +**À faire avant exposition client (cheap, indispensable) :** +- **HTTPS** via reverse proxy (obligatoire). Le cookie de session passe + automatiquement en `Secure` dès que `APP_ENV` ≠ `dev`/`test` (fait — commit `884661a`). +- **Secrets forts** en variables d'environnement : `APP_SECRET_KEY`, `ADMIN_PASSWORD` + (ne **jamais** laisser les défauts dev `dev-change-me-INSECURE` / `change-me`). + C'est le vrai point : un admin compromis pourrait publier un faux installateur. + +**Déjà couvert / non bloquant :** +- **CSRF** : le cookie est en `SameSite=Lax`, ce qui bloque déjà l'envoi du cookie + sur un POST cross-site (l'attaque CSRF classique). Pas de middleware dédié requis + pour une bêta sous login. +- **Rate-limiting `/login`** : *nice-to-have*, se gère au reverse proxy (fail2ban/limit_req) + si besoin ; avec un mot de passe fort + l'approbation manuelle des comptes, le risque + brute-force est marginal. Non bloquant. + +**Hygiène (non urgent) :** sortir l'e-mail admin par défaut (`dom@aivanov.fr`) du +code source vers `.env`. ## 6. Données / RGPD - Le portail ne reçoit **jamais** de contenu patient : uniquement licences, activations de postes, et **compteurs d'usage agrégés** (nb traitements/documents/pages).