Files
team-tryouts/audit/plan-remediation.md
T
GGThedandClaude Opus 5 fa0a378827 docs(audit): audit securite, maintenabilite et standards de la stack
Revue statique de l'ensemble du code Python, de la configuration CI/nginx,
du .gitignore et des dependances. 44 constats documentes avec references
fichier:ligne, impact et correctif propose.

- audit/01-securite.md         19 constats (4 critiques)
- audit/02-maintenabilite.md   15 constats
- audit/03-standards-stack.md  10 ecarts aux conventions Flask/SQLAlchemy
- audit/plan-remediation.md    ordre de traitement en 6 lots

Points critiques : secrets de production reels committes dans
app/.env.exemple, seed automatique en production avec mot de passe
password, CORS ouvert a toutes les origines avec credentials par
defaut, token du bot Discord imprime sur stdout au demarrage.

Aucune modification du code applicatif.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-08-07 13:02:54 -04:00

7.7 KiB

Plan de remédiation

Ordre proposé. Les lots sont séquentiels : chacun lève des blocages du suivant.


Lot 0 — Aujourd'hui, avant tout commit

Ces actions ne sont pas du code. Elles sont urgentes parce que les secrets sont exposés dès maintenant.

# Action Réf.
0.1 Révoquer le token du bot Discord (Developer Portal → Bot → Reset Token) SEC-01
0.2 Faire tourner le mot de passe PostgreSQL sur Render SEC-01
0.3 Générer une nouvelle SECRET_KEY — invalide toutes les sessions, c'est voulu SEC-01
0.4 Vérifier en production si les comptes admin, manager1/2, coach1/2/3, scout1 existent avec le mot de passe password ; les désactiver ou changer leur mot de passe SEC-02
0.5 Consulter les logs Discord et PostgreSQL pour détecter un éventuel accès non autorisé SEC-01

0.1 à 0.3 sont indépendantes du code et peuvent être faites immédiatement. La purge de l'historique git (0.6, ci-dessous) vient après, et ne remplace pas la révocation : les secrets ont pu être clonés.


Lot 1 — Correctifs critiques

# Action Réf. Effort
1.1 Vider app/.env.exemple de ses valeurs réelles, le renommer .env.example, ajouter .env* au .gitignore SEC-01 15 min
1.2 Purger l'historique git (git filter-repo), prévenir l'équipe de recloner SEC-01 1 h
1.3 Conditionner le seed à SEED_DEMO_DATA ; générer les mots de passe de démo aléatoirement SEC-02 30 min
1.4 Refuser le démarrage si CORS_ALLOWED_ORIGINS est vide hors développement SEC-03 20 min
1.5 Supprimer print(DISCORD_BOT_TOKEN)discord_bot.py:25 SEC-04 2 min
1.6 Ajouter un scan de secrets (gitleaks) à la CI SEC-01 30 min

Lot 2 — Débloquer l'outillage

À faire tôt : sans CI fiable et sans tests, les lots suivants ne peuvent pas être validés.

# Action Réf. Effort
2.1 Réencoder requirements.txt en UTF-8, ajouter .gitattributes MNT-02 15 min
2.2 Corriger .gitignore (*.html, docs/), vérifier les fichiers déjà perdus MNT-01 30 min
2.3 Corriger le chemin de security_scan.py dans la CI et lui fournir DATABASE_URL MNT-04 20 min
2.4 Ajouter pyproject.toml avec la configuration Ruff, formater en un commit isolé MNT-06 2 h
2.5 Retirer dotenv, login, discord ; psycopg2psycopg2-binary MNT-05 30 min
2.6 Créer tests/, avec les tests de la matrice de permissions ; activer réellement le job CI MNT-03 1 j

Lot 3 — Sécurité applicative

# Action Réf. Effort
3.1 Appliquer ProxyFix, corriger HOST (wsgi.py) et proxy_pass (nginx.conf) SEC-05 · STD-06 1 h
3.2 Brancher CreateUserSchema, EditUserSchema, EditProfileSchema sur leurs routes SEC-06 3 h
3.3 Adosser Flask-Limiter à Redis ou PostgreSQL ; réévaluer les seuils SEC-08 2 h
3.4 Restreindre view_user et réduire les données transmises au template SEC-15 2 h
3.5 Valider les téléversements de contrats signés SEC-11 1 h
3.6 Uniformiser les messages de login, égaliser les temps de réponse SEC-12 1 h
3.7 Corriger nl2br (échapper avant Markup) ou le supprimer SEC-09 15 min
3.8 Masquer l'erreur brute de /health SEC-14 10 min
3.9 Alimenter le logger team_tryouts.auth SEC-19 2 h
3.10 Contrôler la cohérence tryout/équipe dans add_to_team SEC-17 30 min
3.11 Remplacer les int() nus par request.form.get(..., type=int) SEC-16 2 h

Lot 4 — Fondations structurelles

Ce lot débloque des correctifs de sécurité qui exigent des changements de schéma.

# Action Réf. Effort
4.1 Introduire Flask-Migrate, flask db stamp head sur la base existante STD-01 3 h
4.2 Objets de configuration par environnement ; un seul load_dotenv() STD-05 4 h
4.3 Sortir les effets de bord de create_app() (create_all, seed, bot) STD-02 3 h
4.4 Séparer le bot Discord en processus distinct STD-03 1 j
4.5 (dépend de 4.1) Unicité sur discord_user_id + vérification de possession SEC-07 1 j
4.6 (dépend de 4.1) Cascades FK sur OrgTeam ; corriger delete_team MNT-11 3 h
4.7 (dépend de 4.1) Migrer vers datetime.now(timezone.utc) et DateTime(timezone=True) MNT-13 4 h
4.8 Journaliser sur stdout ; handlers fichier optionnels STD-07 1 h

Lot 5 — Dette de conception

Sans urgence. À traiter au fil des évolutions plutôt qu'en chantier dédié.

# Action Réf.
5.1 Découper users.py en cinq blueprints MNT-08
5.2 Choisir une approche de validation unique ; retirer Flask-WTF ou WTForms STD-04
5.3 Extraire les utilitaires date/heure MNT-12
5.4 Résorber les N+1 sur view_tryout et api_events MNT-10
5.5 Blueprint /api avec ses propres gestionnaires d'erreur STD-09
5.6 Extraire une couche de services STD-08
5.7 Durcir la CSP (nonces, scripts externalisés) SEC-10
5.8 Réinitialisation de mot de passe par courriel ; MFA sur les rôles d'encadrement SEC-18
5.9 Remplacer le CAPTCHA par une validation du courriel institutionnel SEC-13
5.10 Réparer backup.py (pg_dump) ou le restreindre aux documents MNT-07
5.11 Pagination des listes MNT-14
5.12 Dockerfile + docker-compose.yml STD-10
5.13 Réécrire le README ; renommer supporting_scritssupporting_scripts MNT-15

Dépendances entre lots

Lot 0 (révocation)
   └─→ Lot 1 (correctifs critiques)
          └─→ Lot 2 (outillage : CI verte, premiers tests)
                 ├─→ Lot 3 (sécurité applicative)
                 └─→ Lot 4 (migrations, configuration)
                        ├─→ 4.5 unicité discord_user_id   (bloqué par 4.1)
                        ├─→ 4.6 cascades FK                (bloqué par 4.1)
                        └─→ 4.7 datetimes conscients       (bloqué par 4.1)
                               └─→ Lot 5 (dette de conception)

Le Lot 2 est délibérément placé avant les lots 3 et 4 : sans tests sur la matrice de permissions, les modifications d'autorisation du Lot 3 ne peuvent pas être validées autrement qu'à la main.