docs(beta): runbook portail — sécurité proportionnée (pas de VPN/IP allowlist)

Recalibre la section sécurité au modèle de menace réel : portail sans
donnée patient (licences + compteurs agrégés) → HTTPS + login/mot de
passe fort suffisent. Retire la recommandation VPN/IP allowlist (overkill).
CSRF déjà couvert par SameSite=Lax ; rate-limiting /login = nice-to-have
au proxy. https_only désormais implémenté (app_aivanov 884661a).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-18 15:07:57 +02:00
parent c64162a936
commit 471a8a4c62

View File

@@ -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).