# Sécurité — guide opérationnel Le modèle de sécurité complet (menaces, décisions, défenses) est dans **`security-model.md`**. Ce document résume l'opérationnel. ## Liste de contrôle de mise en production - [ ] `AUTH_SECRET` unique généré (`openssl rand -hex 32`) - [ ] `OPENROUTER_API_KEY` présente uniquement dans `.env` serveur (gitignoré) - [ ] `APP_URL=https://…` (active cookies `Secure` + vérification d'origine) - [ ] Compte `admin` initial : mot de passe changé, compte personnel créé, puis `DISABLE_INITIAL_ADMIN=true` et compte d'amorçage désactivé - [ ] `SIGNUP_ACCESS_CODE` défini (inscription réservée aux étudiants du cours) - [ ] Budgets ajustés (Admin → Paramètres) - [ ] Sauvegardes planifiées (`scripts/backup.sh` en cron) - [ ] HTTPS (ngrok domaine réservé ou reverse-proxy TLS) ## Rappels clés - Mots de passe : bcrypt coût 12 ; `admin123` refusé comme mot de passe permanent ; 10 caractères min. - Sessions : jeton 256 bits, **haché en base**, httpOnly, SameSite=Lax, 14 jours, révocables. - Anti-bruteforce : 8 échecs / 15 min / (IP+identifiant) + journal `auth_events`. - CSRF : vérification `Sec-Fetch-Site`/`Origin` sur toutes les mutations. - XSS : Markdown rendu sans HTML brut ; en-têtes CSP/nosniff/DENY. - Isolation : espaces de connaissances filtrés en SQL sur chaque requête RAG et chaque accès citation ; matériel d'examen dans `instructor-private`, jamais servi aux étudiants. - Injection de prompt : contenus récupérés et fichiers étudiants encadrés comme **données** ; le serveur ne fournit au modèle que des fragments auxquels l'utilisateur a déjà droit ; citations hors contexte neutralisées. - Vie privée : agrégats professeur ≥ 3 étudiants ; conversations étudiantes non consultables (sauf message signalé par l'étudiant). - Secrets : jamais journalisés ; messages d'erreur client génériques.