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.).
357 lines
10 KiB
Markdown
357 lines
10 KiB
Markdown
# Configuration Backend Veza - Guide de Sécurité
|
|
|
|
**Version**: 1.0
|
|
**Date**: 2025-01-XX
|
|
**Priorité**: P0 - Sécurité
|
|
|
|
---
|
|
|
|
## 📋 Vue d'ensemble
|
|
|
|
Ce document décrit la configuration du backend Go de Veza, avec un focus particulier sur la **sécurisation** selon l'environnement (development, test, production).
|
|
|
|
### Changements de sécurité (P0-SECURITY)
|
|
|
|
- ✅ **CORS sécurisé**: Plus de wildcard `"*"` par défaut en production
|
|
- ✅ **Validation stricte**: Production refuse de démarrer si configuration critique manquante
|
|
- ✅ **Profils d'environnement**: Comportements différents selon `APP_ENV`
|
|
- ✅ **Defaults sécurisés**: Valeurs par défaut adaptées à chaque environnement
|
|
|
|
---
|
|
|
|
## 🔧 Variables d'environnement
|
|
|
|
### Variables requises (tous environnements)
|
|
|
|
| Variable | Description | Exemple | Validation |
|
|
|----------|-------------|---------|------------|
|
|
| `JWT_SECRET` | Secret pour signer les tokens JWT | `your-super-secret-jwt-key-min-32-chars` | **REQUIS**, min 32 caractères |
|
|
| `DATABASE_URL` | URL de connexion PostgreSQL | `postgresql://user:pass@localhost:5432/veza_db` | **REQUIS**, format valide |
|
|
|
|
### Variables optionnelles avec defaults
|
|
|
|
| Variable | Description | Default | Notes |
|
|
|----------|-------------|---------|-------|
|
|
| `APP_PORT` | Port HTTP du serveur | `8080` | 1-65535 |
|
|
| `REDIS_URL` | URL de connexion Redis | `redis://localhost:6379` | Format `redis://` ou `rediss://` |
|
|
| `LOG_LEVEL` | Niveau de log | `INFO` | `DEBUG`, `INFO`, `WARN`, `ERROR` |
|
|
| `UPLOAD_DIR` | Répertoire d'upload | `uploads` | Chemin relatif ou absolu |
|
|
| `STREAM_SERVER_URL` | URL du serveur de streaming | `http://localhost:8082` | URL complète |
|
|
|
|
### Variables spécifiques CORS (P0-SECURITY)
|
|
|
|
| Variable | Description | Default (dev) | Default (prod) | Validation |
|
|
|----------|-------------|---------------|----------------|------------|
|
|
| `CORS_ALLOWED_ORIGINS` | Origines CORS autorisées (séparées par virgules) | `http://localhost:3000,http://127.0.0.1:3000,...` | **REQUIS** | **Non vide en prod**, **pas de `"*"` en prod** |
|
|
|
|
**Format**: Liste séparée par virgules
|
|
```bash
|
|
CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com,https://staging.veza.com
|
|
```
|
|
|
|
---
|
|
|
|
## 🌍 Environnements
|
|
|
|
### Détection automatique
|
|
|
|
L'environnement est détecté automatiquement selon cette priorité :
|
|
|
|
1. `APP_ENV` (priorité maximale)
|
|
2. `NODE_ENV` (compatibilité)
|
|
3. `GO_ENV` (compatibilité Go)
|
|
4. Hostname (si contient "prod" → production)
|
|
5. **Fallback**: `development`
|
|
|
|
### Environnements supportés
|
|
|
|
- `development`: Développement local
|
|
- `test`: Tests automatisés
|
|
- `staging`: Environnement de pré-production
|
|
- `production`: Production
|
|
|
|
---
|
|
|
|
## 🔒 Comportements par environnement
|
|
|
|
### Development (`APP_ENV=development`)
|
|
|
|
**Caractéristiques**:
|
|
- ✅ CORS permissif par défaut (localhost uniquement)
|
|
- ✅ Logs verbeux (DEBUG autorisé)
|
|
- ✅ Valeurs par défaut acceptées
|
|
- ⚠️ Warning si CORS contient `"*"` (mais démarrage autorisé)
|
|
|
|
**Defaults CORS** (si `CORS_ALLOWED_ORIGINS` non défini):
|
|
```
|
|
http://localhost:3000
|
|
http://127.0.0.1:3000
|
|
http://localhost:5173
|
|
http://127.0.0.1:5173
|
|
```
|
|
|
|
**Exemple de configuration minimale**:
|
|
```bash
|
|
APP_ENV=development
|
|
JWT_SECRET=dev-secret-key-minimum-32-characters-long
|
|
DATABASE_URL=postgresql://veza:password@localhost:5432/veza_db
|
|
# CORS_ALLOWED_ORIGINS optionnel - defaults locaux utilisés
|
|
```
|
|
|
|
### Test (`APP_ENV=test`)
|
|
|
|
**Caractéristiques**:
|
|
- ✅ CORS vide par défaut (peut être configuré explicitement)
|
|
- ✅ Validation adaptée aux tests
|
|
- ✅ Pas de side-effects externes (SMTP, etc.)
|
|
|
|
**Exemple de configuration**:
|
|
```bash
|
|
APP_ENV=test
|
|
JWT_SECRET=test-secret-key-minimum-32-characters-long
|
|
DATABASE_URL=postgresql://veza:password@localhost:5432/veza_test
|
|
# CORS_ALLOWED_ORIGINS optionnel - liste vide par défaut
|
|
```
|
|
|
|
### Production (`APP_ENV=production`)
|
|
|
|
**Caractéristiques**:
|
|
- 🔴 **CORS_ALLOWED_ORIGINS REQUIS** et non vide
|
|
- 🔴 **Wildcard `"*"` INTERDIT** en production
|
|
- 🔴 **LOG_LEVEL=DEBUG INTERDIT** en production
|
|
- 🔴 **Erreur fatale** si configuration critique manquante
|
|
|
|
**Validation stricte**:
|
|
- Si `CORS_ALLOWED_ORIGINS` est vide → **Erreur fatale, serveur ne démarre pas**
|
|
- Si `CORS_ALLOWED_ORIGINS` contient `"*"` → **Erreur fatale, serveur ne démarre pas**
|
|
- Si `LOG_LEVEL=DEBUG` → **Erreur fatale, serveur ne démarre pas**
|
|
|
|
**Exemple de configuration requise**:
|
|
```bash
|
|
APP_ENV=production
|
|
JWT_SECRET=production-super-secret-key-minimum-32-characters-long
|
|
DATABASE_URL=postgresql://veza:secure-password@db.veza.com:5432/veza_prod
|
|
CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com
|
|
LOG_LEVEL=INFO
|
|
REDIS_URL=rediss://redis.veza.com:6379
|
|
```
|
|
|
|
**❌ Configuration INVALIDE en production**:
|
|
```bash
|
|
# ❌ CORS_ALLOWED_ORIGINS manquant
|
|
APP_ENV=production
|
|
JWT_SECRET=...
|
|
DATABASE_URL=...
|
|
# → Erreur: "CORS_ALLOWED_ORIGINS is required in production"
|
|
|
|
# ❌ Wildcard dans CORS
|
|
CORS_ALLOWED_ORIGINS=*
|
|
# → Erreur: "CORS wildcard '*' is not allowed in production"
|
|
|
|
# ❌ DEBUG en production
|
|
LOG_LEVEL=DEBUG
|
|
# → Erreur: "LOG_LEVEL=DEBUG is not allowed in production"
|
|
```
|
|
|
|
---
|
|
|
|
## 🚀 Démarrage du serveur
|
|
|
|
### Development
|
|
|
|
```bash
|
|
# Option 1: Via fichier .env
|
|
echo "APP_ENV=development" > .env
|
|
echo "JWT_SECRET=dev-secret-key-minimum-32-characters-long" >> .env
|
|
echo "DATABASE_URL=postgresql://veza:password@localhost:5432/veza_db" >> .env
|
|
go run cmd/api/main.go
|
|
|
|
# Option 2: Variables d'environnement
|
|
export APP_ENV=development
|
|
export JWT_SECRET=dev-secret-key-minimum-32-characters-long
|
|
export DATABASE_URL=postgresql://veza:password@localhost:5432/veza_db
|
|
go run cmd/api/main.go
|
|
```
|
|
|
|
### Production
|
|
|
|
```bash
|
|
# Configuration requise
|
|
export APP_ENV=production
|
|
export JWT_SECRET=production-super-secret-key-minimum-32-characters-long
|
|
export DATABASE_URL=postgresql://veza:secure-password@db.veza.com:5432/veza_prod
|
|
export CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com
|
|
export LOG_LEVEL=INFO
|
|
export REDIS_URL=rediss://redis.veza.com:6379
|
|
|
|
# Démarrage
|
|
./veza-backend-api
|
|
```
|
|
|
|
**Si une variable critique manque en production**, le serveur **refusera de démarrer** avec un message d'erreur explicite.
|
|
|
|
---
|
|
|
|
## 🔍 Validation de la configuration
|
|
|
|
### Validation automatique
|
|
|
|
La configuration est validée automatiquement au démarrage via `ValidateForEnvironment()` :
|
|
|
|
1. **Validation de base** (tous environnements):
|
|
- Port valide (1-65535)
|
|
- JWT secret ≥ 32 caractères
|
|
- DatabaseURL et RedisURL format valide
|
|
- LogLevel dans la liste autorisée
|
|
|
|
2. **Validation spécifique production**:
|
|
- `CORS_ALLOWED_ORIGINS` non vide
|
|
- Pas de wildcard `"*"` dans CORS
|
|
- `LOG_LEVEL` ≠ `DEBUG`
|
|
|
|
### Messages d'erreur
|
|
|
|
**Production - CORS manquant**:
|
|
```
|
|
ERROR: Configuration validation failed
|
|
Error: CORS_ALLOWED_ORIGINS is required in production environment and must not be empty
|
|
```
|
|
|
|
**Production - Wildcard détecté**:
|
|
```
|
|
ERROR: Configuration validation failed
|
|
Error: CORS wildcard '*' is not allowed in production environment. Please specify explicit origins in CORS_ALLOWED_ORIGINS
|
|
```
|
|
|
|
**Production - DEBUG interdit**:
|
|
```
|
|
ERROR: Configuration validation failed
|
|
Error: LOG_LEVEL=DEBUG is not allowed in production environment for security reasons
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 Fichiers de configuration
|
|
|
|
### Ordre de chargement
|
|
|
|
1. Variables d'environnement système (priorité maximale)
|
|
2. `.env.{APP_ENV}` (ex: `.env.development`, `.env.production`)
|
|
3. `.env` (fallback)
|
|
4. Valeurs par défaut (selon environnement)
|
|
|
|
### Exemple de fichiers
|
|
|
|
**`.env.development`**:
|
|
```bash
|
|
APP_ENV=development
|
|
JWT_SECRET=dev-secret-key-minimum-32-characters-long
|
|
DATABASE_URL=postgresql://veza:password@localhost:5432/veza_db
|
|
REDIS_URL=redis://localhost:6379
|
|
LOG_LEVEL=DEBUG
|
|
# CORS_ALLOWED_ORIGINS optionnel - defaults locaux utilisés
|
|
```
|
|
|
|
**`.env.production`**:
|
|
```bash
|
|
APP_ENV=production
|
|
JWT_SECRET=production-super-secret-key-minimum-32-characters-long
|
|
DATABASE_URL=postgresql://veza:secure-password@db.veza.com:5432/veza_prod
|
|
CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com
|
|
LOG_LEVEL=INFO
|
|
REDIS_URL=rediss://redis.veza.com:6379
|
|
```
|
|
|
|
**⚠️ IMPORTANT**: Ne jamais commiter les fichiers `.env.production` avec des secrets réels dans le repository.
|
|
|
|
---
|
|
|
|
## 🧪 Tests
|
|
|
|
### Exécuter les tests de configuration
|
|
|
|
```bash
|
|
cd veza-backend-api
|
|
go test ./internal/config/... -v
|
|
```
|
|
|
|
### Tests de sécurité (P0-SECURITY)
|
|
|
|
Les tests suivants valident la sécurisation :
|
|
|
|
- `TestLoadConfig_DevDefaults`: Vérifie les defaults dev
|
|
- `TestLoadConfig_ProdMissingCritical`: Vérifie que prod refuse si CORS manquant
|
|
- `TestLoadConfig_ProdWildcard`: Vérifie que prod refuse le wildcard
|
|
- `TestLoadConfig_ProdValid`: Vérifie qu'une config prod valide passe
|
|
|
|
---
|
|
|
|
## 🔐 Bonnes pratiques de sécurité
|
|
|
|
### ✅ À FAIRE
|
|
|
|
1. **Production**: Toujours définir `CORS_ALLOWED_ORIGINS` explicitement
|
|
2. **Production**: Utiliser `LOG_LEVEL=INFO` ou supérieur
|
|
3. **Secrets**: Stocker les secrets dans des variables d'environnement, jamais dans le code
|
|
4. **Validation**: Vérifier la configuration avant chaque déploiement
|
|
5. **Documentation**: Documenter les variables d'environnement requises
|
|
|
|
### ❌ À ÉVITER
|
|
|
|
1. **Production**: Ne jamais utiliser `CORS_ALLOWED_ORIGINS=*`
|
|
2. **Production**: Ne jamais utiliser `LOG_LEVEL=DEBUG`
|
|
3. **Secrets**: Ne jamais hardcoder des secrets dans le code
|
|
4. **Git**: Ne jamais commiter des fichiers `.env` avec des secrets
|
|
5. **Defaults**: Ne pas compter sur les valeurs par défaut en production
|
|
|
|
---
|
|
|
|
## 🐛 Dépannage
|
|
|
|
### Le serveur refuse de démarrer en production
|
|
|
|
**Erreur**: `CORS_ALLOWED_ORIGINS is required in production`
|
|
|
|
**Solution**: Définir `CORS_ALLOWED_ORIGINS` avec une liste explicite d'origines :
|
|
```bash
|
|
export CORS_ALLOWED_ORIGINS=https://app.veza.com,https://www.veza.com
|
|
```
|
|
|
|
### Erreur de validation CORS wildcard
|
|
|
|
**Erreur**: `CORS wildcard '*' is not allowed in production`
|
|
|
|
**Solution**: Remplacer `"*"` par une liste explicite d'origines autorisées.
|
|
|
|
### Erreur LOG_LEVEL=DEBUG en production
|
|
|
|
**Erreur**: `LOG_LEVEL=DEBUG is not allowed in production`
|
|
|
|
**Solution**: Utiliser `LOG_LEVEL=INFO` ou supérieur :
|
|
```bash
|
|
export LOG_LEVEL=INFO
|
|
```
|
|
|
|
---
|
|
|
|
## 📚 Références
|
|
|
|
- [Audit de sécurité](./AUDIT_CONFIG.md) - Rapport d'audit détaillé
|
|
- [Middleware CORS](../internal/middleware/cors.go) - Implémentation CORS
|
|
- [Validation de config](../internal/config/validator.go) - Validateur de configuration
|
|
|
|
---
|
|
|
|
## 📞 Support
|
|
|
|
Pour toute question sur la configuration, consulter :
|
|
- Le code source: `internal/config/config.go`
|
|
- Les tests: `internal/config/config_test.go`
|
|
- Ce document: `docs/BACKEND_CONFIG.md`
|
|
|
|
---
|
|
|
|
**Dernière mise à jour**: 2025-01-XX
|
|
**Auteur**: Équipe Veza
|
|
**Priorité**: P0 - Sécurité
|
|
|