Apply critical security fixes and major improvements to all scripts
Security (CRITICAL): - Add .env.example with strong password generation instructions - Fix path traversal validation in restore.sh (now detects all .. patterns) - Secure .env loading with set -a/set +a in all scripts - Add logs/ to .gitignore to prevent credential leaks Backup & Restore (IMPORTANT): - Add file locking system to prevent concurrent backups - Add disk space verification before backup operations - Generate SHA256 checksums for all backups - Verify checksums before restoration - Create safety database backup before restore - Implement comprehensive logging to ./logs/ directory - Fix BACKUP_RETENTION_DAYS inconsistency - Replace dangerous find -delete with safe iteration Update & Recovery: - Backup docker-compose.yml before updates with auto-rollback - Add version display before/after updates - Increase timeouts to 120s for slow containers - Dynamic backup suggestion in recover.sh Compatibility: - Add Docker Compose v2 support with v1 fallback in all scripts - Standardized log() function across all scripts New Features: - Add check-health.sh: comprehensive system health monitoring - Add SECURITY.md: complete security documentation - Update Makefile with check-health and recover commands - Centralized logging with timestamps and levels 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
227
SECURITY.md
Normal file
227
SECURITY.md
Normal file
@@ -0,0 +1,227 @@
|
||||
# Sécurité et Best Practices
|
||||
|
||||
Ce document décrit les mesures de sécurité et les best practices implémentées dans ce projet Nextcloud.
|
||||
|
||||
## ✅ Corrections de Sécurité Appliquées
|
||||
|
||||
### 🔒 Gestion des Secrets
|
||||
|
||||
#### Fichier .env
|
||||
- ✅ `.env` ajouté au `.gitignore` pour éviter de commiter les secrets
|
||||
- ✅ `.env.example` créé avec des instructions claires
|
||||
- ✅ Instructions pour générer des mots de passe forts (min 32 caractères)
|
||||
- ⚠️ **IMPORTANT**: Changez tous les mots de passe par défaut avec:
|
||||
```bash
|
||||
openssl rand -base64 32
|
||||
```
|
||||
|
||||
#### Gestion des Mots de Passe
|
||||
- ✅ `MYSQL_PWD` utilisé pour éviter l'exposition des mots de passe dans les commandes
|
||||
- ✅ Pas de mots de passe en clair dans les logs
|
||||
- ✅ Variables d'environnement chargées de manière sécurisée avec `set -a`
|
||||
|
||||
### 🛡️ Protection des Scripts
|
||||
|
||||
#### Validation des Entrées
|
||||
- ✅ **backup.sh**: Variables requises validées avec `${VAR:?message}`
|
||||
- ✅ **restore.sh**: Protection contre path traversal améliorée
|
||||
- ✅ **restore.sh**: Validation du type de fichier (gzip)
|
||||
- ✅ **restore.sh**: Utilisation de `realpath` pour résoudre les chemins
|
||||
|
||||
#### Sécurité des Opérations
|
||||
- ✅ `set -euo pipefail` dans tous les scripts
|
||||
- ✅ Protection `${VAR:?}` pour éviter les suppressions accidentelles
|
||||
- ✅ Système de lock pour empêcher les backups simultanés
|
||||
- ✅ Fonctions de cleanup avec `trap` pour gérer les erreurs
|
||||
|
||||
### 📊 Logging et Audit
|
||||
|
||||
#### Traçabilité
|
||||
- ✅ Logs centralisés dans `./logs/` avec timestamps
|
||||
- ✅ Fonction `log()` standardisée dans tous les scripts
|
||||
- ✅ Tous les scripts créent des logs horodatés
|
||||
- ✅ Codes de sortie et erreurs loggés
|
||||
|
||||
#### Monitoring
|
||||
- ✅ Script `check-health.sh` pour vérifier l'état du système
|
||||
- ✅ Vérification de l'espace disque avant backup
|
||||
- ✅ Vérification de l'âge des backups
|
||||
|
||||
### 🔐 Intégrité des Données
|
||||
|
||||
#### Checksums
|
||||
- ✅ Génération automatique de checksums SHA256 pour les backups
|
||||
- ✅ Vérification des checksums avant restauration
|
||||
- ✅ Détection de fichiers corrompus
|
||||
|
||||
#### Backups de Sécurité
|
||||
- ✅ Backup automatique de la DB avant restauration
|
||||
- ✅ Backup du `docker-compose.yml` avant mise à jour
|
||||
- ✅ Option de créer un backup avant restauration
|
||||
|
||||
### 🚀 Docker Compose
|
||||
|
||||
#### Compatibilité
|
||||
- ✅ Support de Docker Compose v2 (`docker compose`)
|
||||
- ✅ Fallback vers Docker Compose v1 (`docker-compose`)
|
||||
- ✅ Détection automatique de la version disponible
|
||||
|
||||
## 📋 Checklist de Sécurité
|
||||
|
||||
### Configuration Initiale
|
||||
|
||||
- [ ] Copier `.env.example` vers `.env`
|
||||
- [ ] Générer des mots de passe forts avec `openssl rand -base64 32`
|
||||
- [ ] Modifier tous les mots de passe dans `.env`:
|
||||
- `MYSQL_ROOT_PASSWORD`
|
||||
- `MYSQL_PASSWORD`
|
||||
- `REDIS_HOST_PASSWORD`
|
||||
- [ ] Vérifier que `.env` n'est PAS dans git: `git status`
|
||||
- [ ] Configurer les paramètres de production (domaine, SSL, etc.)
|
||||
|
||||
### Maintenance Régulière
|
||||
|
||||
- [ ] Exécuter `make check-health` régulièrement
|
||||
- [ ] Vérifier les logs dans `./logs/`
|
||||
- [ ] S'assurer que les backups sont créés (< 24h)
|
||||
- [ ] Vérifier l'espace disque disponible
|
||||
- [ ] Tester les restaurations périodiquement
|
||||
|
||||
### Avant une Mise en Production
|
||||
|
||||
- [ ] Tous les mots de passe sont forts et uniques
|
||||
- [ ] SSL/TLS configuré (via Traefik ou autre)
|
||||
- [ ] Domaine configuré dans `TRUSTED_DOMAINS`
|
||||
- [ ] Backups automatiques configurés (cron)
|
||||
- [ ] Logs configurés et monitorés
|
||||
- [ ] Health checks configurés
|
||||
|
||||
## 🔧 Scripts et Outils
|
||||
|
||||
### Scripts de Maintenance
|
||||
|
||||
| Script | Description | Sécurité |
|
||||
|--------|-------------|----------|
|
||||
| `backup.sh` | Backup complet | Lock, checksum, vérif espace disque |
|
||||
| `restore.sh` | Restauration | Vérif checksum, backup sécurité DB |
|
||||
| `update.sh` | Mise à jour | Backup auto, rollback docker-compose |
|
||||
| `recover.sh` | Récupération d'erreur | Logs, suggestions dynamiques |
|
||||
| `occ.sh` | Wrapper OCC | Support Docker Compose v2 |
|
||||
| `check-health.sh` | Health check complet | Vérifications système complètes |
|
||||
|
||||
### Commandes Make
|
||||
|
||||
```bash
|
||||
make backup # Créer un backup complet
|
||||
make restore <file> # Restaurer un backup
|
||||
make update # Mettre à jour Nextcloud
|
||||
make check-health # Vérifier l'état du système
|
||||
make recover # Récupérer après une erreur
|
||||
```
|
||||
|
||||
## 🚨 Gestion des Incidents
|
||||
|
||||
### En cas d'erreur
|
||||
|
||||
1. **Consulter les logs**:
|
||||
```bash
|
||||
ls -lth ./logs/
|
||||
tail -f ./logs/backup_*.log
|
||||
```
|
||||
|
||||
2. **Vérifier l'état du système**:
|
||||
```bash
|
||||
make check-health
|
||||
```
|
||||
|
||||
3. **Tenter une récupération**:
|
||||
```bash
|
||||
make recover
|
||||
```
|
||||
|
||||
4. **Si nécessaire, restaurer un backup**:
|
||||
```bash
|
||||
make restore backups/nextcloud_backup_YYYYMMDD_HHMMSS.tar.gz
|
||||
```
|
||||
|
||||
### Récupération après Compromission
|
||||
|
||||
Si vous soupçonnez une compromission:
|
||||
|
||||
1. **Arrêter les services immédiatement**:
|
||||
```bash
|
||||
make down
|
||||
```
|
||||
|
||||
2. **Analyser les logs**:
|
||||
```bash
|
||||
docker-compose logs > incident_logs.txt
|
||||
cat ./logs/*.log > app_logs.txt
|
||||
```
|
||||
|
||||
3. **Restaurer depuis un backup propre**:
|
||||
```bash
|
||||
make restore <backup_avant_incident>
|
||||
```
|
||||
|
||||
4. **Changer TOUS les mots de passe**
|
||||
5. **Vérifier les utilisateurs et permissions**
|
||||
6. **Mettre à jour vers la dernière version**
|
||||
|
||||
## 📚 Références
|
||||
|
||||
### Best Practices
|
||||
|
||||
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
|
||||
- [Docker Security Best Practices](https://docs.docker.com/engine/security/)
|
||||
- [Nextcloud Security Hardening](https://docs.nextcloud.com/server/latest/admin_manual/installation/harden_server.html)
|
||||
|
||||
### Commandes Utiles
|
||||
|
||||
```bash
|
||||
# Générer un mot de passe fort
|
||||
openssl rand -base64 32
|
||||
|
||||
# Vérifier les permissions
|
||||
ls -la .env
|
||||
# Devrait être: -rw------- (600)
|
||||
|
||||
# Vérifier qu'aucun secret n'est dans git
|
||||
git grep -i password
|
||||
git grep -i secret
|
||||
|
||||
# Audit de sécurité basique
|
||||
make check-health
|
||||
```
|
||||
|
||||
## 📝 Notes de Version
|
||||
|
||||
### Version actuelle
|
||||
|
||||
**Améliorations de sécurité**:
|
||||
- ✅ Protection des secrets (.env hors git)
|
||||
- ✅ Validation des entrées utilisateur
|
||||
- ✅ Checksums pour intégrité des backups
|
||||
- ✅ Logging complet pour audit
|
||||
- ✅ Protection contre path traversal
|
||||
- ✅ Vérifications d'espace disque
|
||||
- ✅ Backups de sécurité automatiques
|
||||
- ✅ Support Docker Compose v2
|
||||
|
||||
**Bugs corrigés**:
|
||||
- ✅ Incohérence BACKUP_RETENTION_DAYS
|
||||
- ✅ Protection find -delete dangereuse
|
||||
- ✅ Path traversal incomplet
|
||||
- ✅ Pas de vérification checksums
|
||||
- ✅ Pas de backup avant restore
|
||||
|
||||
**Fonctionnalités ajoutées**:
|
||||
- ✅ Script de health check complet
|
||||
- ✅ Système de lock pour backups
|
||||
- ✅ Génération automatique de checksums
|
||||
- ✅ Logs centralisés avec timestamps
|
||||
- ✅ Backup dynamique suggéré dans recover
|
||||
|
||||
---
|
||||
|
||||
**Date de dernière mise à jour**: 2025-12-17
|
||||
Reference in New Issue
Block a user