veza/veza-backend-api/AUDIT_CONFIG.md
okinrev b7955a680c P0: stabilisation backend/chat/stream + nouvelle base migrations v1
Backend Go:
- Remplacement complet des anciennes migrations par la base V1 alignée sur ORIGIN.
- Durcissement global du parsing JSON (BindAndValidateJSON + RespondWithAppError).
- Sécurisation de config.go, CORS, statuts de santé et monitoring.
- Implémentation des transactions P0 (RBAC, duplication de playlists, social toggles).
- Ajout d’un job worker structuré (emails, analytics, thumbnails) + tests associés.
- Nouvelle doc backend : AUDIT_CONFIG, BACKEND_CONFIG, AUTH_PASSWORD_RESET, JOB_WORKER_*.

Chat server (Rust):
- Refonte du pipeline JWT + sécurité, audit et rate limiting avancé.
- Implémentation complète du cycle de message (read receipts, delivered, edit/delete, typing).
- Nettoyage des panics, gestion d’erreurs robuste, logs structurés.
- Migrations chat alignées sur le schéma UUID et nouvelles features.

Stream server (Rust):
- Refonte du moteur de streaming (encoding pipeline + HLS) et des modules core.
- Transactions P0 pour les jobs et segments, garanties d’atomicité.
- Documentation détaillée de la pipeline (AUDIT_STREAM_*, DESIGN_STREAM_PIPELINE, TRANSACTIONS_P0_IMPLEMENTATION).

Documentation & audits:
- TRIAGE.md et AUDIT_STABILITY.md à jour avec l’état réel des 3 services.
- Cartographie complète des migrations et des transactions (DB_MIGRATIONS_*, DB_TRANSACTION_PLAN, AUDIT_DB_TRANSACTIONS, TRANSACTION_TESTS_PHASE3).
- Scripts de reset et de cleanup pour la lab DB et la V1.

Ce commit fige l’ensemble du travail de stabilisation P0 (UUID, backend, chat et stream) avant les phases suivantes (Coherence Guardian, WS hardening, etc.).
2025-12-06 11:14:38 +01:00

7.9 KiB

🔍 AUDIT DE SÉCURITÉ - Configuration Backend Go

Date: 2025-01-XX
Fichiers analysés: internal/config/config.go, internal/api/router.go, internal/middleware/cors.go


1. STRUCTURE ACTUELLE

1.1. Représentation de la configuration

  • Struct principale: config.Config (ligne 24-79 de config.go)

    • Mélange de services initialisés (Database, Redis, Services, Middlewares) et de valeurs de configuration (AppPort, JWTSecret, CORSOrigins, etc.)
    • Pattern: Singleton créé via NewConfig() qui initialise tout (DB, Redis, Services, Middlewares)
  • Initialisation:

    • NewConfig() (ligne 82) : fonction globale qui charge tout
    • Load() (ligne 384) : fonction alternative qui charge seulement EnvConfig (struct plus simple)
    • Problème: Deux chemins de chargement différents, confusion possible
  • Variables globales:

    • Pas de variables globales explicites, mais NewConfig() crée un singleton qui est passé partout
    • Pattern acceptable mais peut être amélioré

1.2. Sources de vérité

Ordre de priorité actuel:

  1. Variables d'environnement système (priorité maximale)
  2. Fichiers .env.{env} (ex: .env.development)
  3. Fichiers .env (fallback)
  4. Valeurs par défaut hardcodées dans le code

Variables critiques chargées:

  • JWT_SECRET: REQUIS (ligne 117) - getEnvRequired() → panic si absent
  • DATABASE_URL: REQUIS (ligne 124) - getEnvRequired() → panic si absent
  • CORS_ALLOWED_ORIGINS: ⚠️ DÉFAUT DANGEREUX (ligne 101) - getEnvStringSlice(..., []string{"*"})wildcard par défaut
  • REDIS_URL: ⚠️ Valeur par défaut "redis://localhost:6379" (ligne 122)
  • APP_PORT: Valeur par défaut 8080 (ligne 113)
  • CHAT_JWT_SECRET: Fallback vers JWT_SECRET si non défini (ligne 121)

Détection d'environnement:

  • DetectEnvironment() (ligne 28 de env_detection.go): Priorité APP_ENV > NODE_ENV > GO_ENV > hostname > development
  • Problème: L'environnement est détecté mais pas utilisé pour différencier les comportements (CORS, validation, etc.)

1.3. Points de risque sécurité identifiés

🔴 CRITIQUE - CORS Wildcard par défaut

  • Ligne 101 de config.go: corsOrigins := getEnvStringSlice("CORS_ALLOWED_ORIGINS", []string{"*"})
  • Impact: Si CORS_ALLOWED_ORIGINS n'est pas défini, toutes les origines sont autorisées
  • Risque: En production, si la variable est oubliée, l'API accepte les requêtes de n'importe quel domaine
  • Ligne 62 de router.go: Fallback vers CORSDefault() si CORSOrigins est vide → double risque

🟠 MOYEN - Pas de validation CORS selon environnement

  • Ligne 483-544 de config.go: Validate() ne vérifie pas que CORS n'est pas "*" en production
  • Impact: Aucune protection contre le wildcard en prod
  • Risque: Configuration dangereuse peut passer inaperçue

🟠 MOYEN - Valeurs par défaut trop permissives

  • REDIS_URL: Valeur par défaut hardcodée (acceptable en dev, dangereux si oublié en prod)
  • APP_PORT: Valeur par défaut (acceptable)
  • Impact: En prod, si variables manquantes, l'app démarre avec des valeurs dev

🟡 FAIBLE - Pas de distinction dev/test/prod

  • L'environnement est détecté mais pas utilisé pour:
    • Changer les defaults CORS
    • Valider différemment selon l'env
    • Refuser de démarrer si config critique manque en prod

🟡 FAIBLE - Debug logs potentiels en prod

  • Ligne 417-420 de config.go: fmt.Printf dans getEnv()logs de debug en production
  • Impact: Fuite d'information sur les valeurs de config (même si masquées ailleurs)

1.4. Configuration CORS

Fichier: internal/middleware/cors.go

  • Fonction CORS(allowedOrigins []string):
    • Accepte une liste d'origines
    • Si "*" est dans la liste → toutes les origines autorisées (ligne 36)
    • Headers autorisés: Authorization, Content-Type (ligne 20)
    • Méthodes autorisées: GET, POST, PUT, DELETE, OPTIONS (ligne 19)
    • Access-Control-Allow-Credentials: true (ligne 21)

Fichier: internal/api/router.go

  • Ligne 59-63:
    if r.config != nil && len(r.config.CORSOrigins) > 0 {
        router.Use(middleware.CORS(r.config.CORSOrigins))
    } else {
        router.Use(middleware.CORSDefault()) // ← DANGER: wildcard par défaut
    }
    

Problèmes identifiés:

  1. Le middleware CORS est bien configuré via la config
  2. Fallback vers CORSDefault() si liste vide → wildcard
  3. Pas de validation que "*" n'est pas utilisé en prod
  4. Pas de distinction dev/prod pour les origines par défaut

2. DESIGN CIBLE PROPOSÉ

2.1. Profils d'environnement

Environnements supportés:

  • development: Logs verbeux, CORS permissif (localhost uniquement)
  • test: Config adaptée aux tests (DB test, pas de side-effects)
  • production: Strict - aucune valeur par défaut dangereuse, validation stricte

2.2. Comportements attendus

Development

  • CORS par défaut: ["http://localhost:3000", "http://127.0.0.1:3000"] si CORS_ALLOWED_ORIGINS non défini
  • Logs: DEBUG/INFO
  • Validation: Permissive (valeurs par défaut acceptées)

Test

  • CORS: Liste vide ou configurée explicitement
  • DB: URL de test requise
  • Validation: Stricte mais adaptée aux tests

Production

  • CORS: CORS_ALLOWED_ORIGINS REQUIS et non vide
  • CORS: Interdiction explicite de "*" en prod
  • Validation: Erreur fatale si variables critiques manquantes
  • Logs: INFO/WARN/ERROR uniquement (pas de DEBUG)

2.3. Chargement de la config

Fonction unique: LoadConfigFromEnv() (*AppConfig, error)

  • Charge depuis variables d'environnement uniquement
  • Valide selon l'environnement détecté
  • Retourne erreur si config invalide en prod

Struct simplifiée (pour la partie config pure):

type AppConfig struct {
    Env                string   // development, test, production
    HttpPort           string
    DatabaseURL        string
    RedisURL           string
    JwtSecret          string
    ChatJWTSecret      string
    CorsAllowedOrigins []string
    // ... autres champs
}

2.4. Validation renforcée

Nouvelle fonction: ValidateForEnvironment(cfg *AppConfig) error

  • En production:
    • CORS_ALLOWED_ORIGINS doit être défini et non vide
    • CORS_ALLOWED_ORIGINS ne doit pas contenir "*"
    • Toutes les variables critiques doivent être présentes
  • En development:
    • Valeurs par défaut acceptées
    • Warning si config incomplète mais démarrage autorisé

3. PLAN D'IMPLÉMENTATION

Étape 1: Refactor config.go

  • Ajouter champ Env dans Config
  • Modifier NewConfig() pour utiliser l'environnement détecté
  • Créer validateForEnvironment() avec règles strictes selon env
  • Modifier defaults CORS selon environnement

Étape 2: Mettre à jour router.go

  • Supprimer fallback CORSDefault()
  • Utiliser strictement config.CorsAllowedOrigins
  • Ajouter validation au démarrage

Étape 3: Tests

  • Test dev avec defaults
  • Test prod avec CORS manquant → erreur
  • Test prod avec CORS="*" → erreur
  • Test prod valide

Étape 4: Documentation

  • Créer docs/BACKEND_CONFIG.md
  • Lister variables d'environnement
  • Expliquer différences dev/prod

4. RÉSUMÉ DES RISQUES

Risque Sévérité Fichier Ligne Action requise
CORS wildcard par défaut 🔴 CRITIQUE config.go 101 Valeur par défaut selon env
Fallback CORSDefault() 🔴 CRITIQUE router.go 62 Supprimer, erreur si vide
Pas de validation CORS prod 🟠 MOYEN config.go 483 Ajouter validation selon env
Debug logs en prod 🟡 FAIBLE config.go 417 Supprimer fmt.Printf
Pas de distinction dev/prod 🟡 FAIBLE config.go 82 Utiliser env détecté

Prochaines étapes: Implémentation des corrections identifiées.