Sécurité de l'Infrastructure
Ce document présente les mesures de sécurité appliquées à l'infrastructure FirstBreath, conformément aux bonnes pratiques d'administration système et réseau.
Vue d'ensemble des couches de sécurité
1. Sécurité réseau
Sécurité d'accès au VPS
| Mesure | Configuration | Détails |
|---|
| SSH par clé uniquement | PasswordAuthentication no | Connexion par mot de passe désactivée, seule l'authentification par clé publique est autorisée |
| Fail2ban | Jail sshd active | Bannissement automatique des IPs après tentatives de connexion échouées |
| Ports exposés | 22 (SSH), 80 (HTTP), 443 (HTTPS) | Tous les autres ports sont fermés par le firewall |
Isolation par réseaux Docker
| Réseau | Accès externe | Rôle |
|---|
dokploy-network | Via Traefik uniquement | Services exposés au reverse proxy |
monitor-net | Non | Communication Vision ↔ Backend ↔ Monitoring |
internal | Non | Réseau privé du stack Control-Hub |
Principe : les bases de données (MySQL, Redis) et services internes ne sont jamais exposés sur Internet. Seul Traefik est accessible publiquement.
TLS / HTTPS
- Certificats : Let's Encrypt (génération et renouvellement automatiques via Certbot + Traefik)
- Redirection : tout trafic HTTP est redirigé vers HTTPS (
redirect-to-https@file)
- Domaines protégés :
api.firstbreath.fr — API REST et WebSocket
db.firstbreath.fr — CloudBeaver (admin DB)
sonar.firstbreath.fr — SonarQube
Ports exposés
Seuls les ports 80 (HTTP → redirect) et 443 (HTTPS) sont exposés publiquement via Traefik. Les ports internes (3306 MySQL, 6379 Redis, 9090 Prometheus, etc.) ne sont pas accessibles depuis Internet.
2. Sécurité des conteneurs
Utilisateurs non-root
Les conteneurs applicatifs s'exécutent avec des utilisateurs non-root lorsque applicable :
| Service | Utilisateur | UID:GID |
|---|
| API REST (AdonisJS) | nodejs | 1001:1001 |
| Frontend (my-app) | nextjs | 1001:1001 |
| Showcase | nextjs | via addgroup/adduser |
| Redis Worker | appuser | dynamique |
| Camera Manager | root | Contrainte driver GPU |
| Batch Inference | root | Contrainte driver GPU |
Limites de ressources
Chaque conteneur a des limites CPU et mémoire définies (voir Architecture Globale), empêchant un service compromis de consommer toutes les ressources du serveur.
Images de base minimales
| Image | Usage | Avantage sécurité |
|---|
node:20-alpine | Backend (API) | Surface d'attaque réduite (Alpine minimal) |
node:22-alpine | Frontend, Showcase | Surface d'attaque réduite (Alpine minimal) |
python:3.11-slim-bookworm | Redis Worker | Image légère sans outils inutiles |
nginx:alpine | Documentation | Serveur statique minimal |
ultralytics/ultralytics | Batch Inference | Image GPU spécialisée (lourde, requise pour YOLO) |
ghcr.io/firstbreath/opencv-cuda | Camera Manager | Image GPU custom (CUDA + OpenCV, lourde) |
Build multi-étapes
Les Dockerfiles applicatifs (API, Frontend, Showcase, Redis Worker, Documentation) utilisent des builds multi-étapes : seuls les artefacts compilés sont copiés dans l'image finale. Les outils de build (gcc, make, python-dev) ne sont pas présents en production. Les Dockerfiles Vision (Camera Manager, Batch Inference) utilisent des builds mono-étape en raison des images de base GPU spécialisées.
3. Sécurité applicative
Audit de dépendances (CI)
| Écosystème | Outil | Exécution |
|---|
| Node.js (npm/pnpm/yarn) | pnpm audit / npm audit | Chaque pipeline CI |
| Python (pip) | safety check | Chaque pipeline CI (Vision) |
Les pipelines CI échouent si des vulnérabilités critiques sont détectées dans les dépendances.
Analyse statique (SonarQube)
SonarQube détecte automatiquement :
- Security Hotspots : points du code nécessitant une revue sécurité manuelle
- Vulnérabilités : failles de sécurité connues (injection SQL, XSS, etc.)
- Code smells : patterns pouvant mener à des failles
Revue de code
- Chaque Pull Request requiert au minimum une revue par un pair
- Le reviewer vérifie : logique métier, couverture de tests, respect des standards, sécurité
- La branche
main est protégée : merge direct interdit
4. Sécurité des données
Base de données
| Mesure | Détails |
|---|
| Accès réseau | MySQL accessible uniquement via le réseau Docker interne |
| Authentification | Mots de passe via variables d'environnement (.env) |
| Volumes persistants | Données MySQL stockées dans un volume Docker nommé (mysql_data) |
| Administration | CloudBeaver accessible uniquement via HTTPS et authentification |
Redis
| Mesure | Détails |
|---|
| Authentification | requirepass obligatoire |
| Mémoire | Limite à 256 MB avec politique allkeys-lru (éviction automatique) |
| Accès réseau | Non exposé publiquement |
Secrets et variables d'environnement
- Les secrets (mots de passe, tokens API, clés) sont stockés dans des fichiers
.env sur le serveur
- Les
.env sont exclus du contrôle de version (.gitignore)
- Les variables sensibles sont injectées via Dokploy ou l'environnement Docker
5. Protection contre les attaques
Attaques par déni de service (DDoS)
| Mesure | Détails |
|---|
| Rate limiting | Configurable via Traefik middleware |
| Limites de ressources | CPU/RAM caps sur chaque conteneur |
| Redis LRU | Politique d'éviction pour éviter l'épuisement mémoire |
| Healthchecks | Redémarrage automatique des services défaillants |
Intrusions
| Mesure | Détails |
|---|
| Isolation réseau | Services internes non accessibles depuis Internet |
| Utilisateurs non-root | Limitation des privilèges en cas de compromission |
| Images minimales | Réduction de la surface d'attaque |
| TLS obligatoire | Chiffrement de toutes les communications |
| Audit CI | Détection proactive des vulnérabilités |
Registre de conteneurs sécurisé
Les images Docker personnalisées sont hébergées sur GitHub Container Registry (GHCR) :
- Authentification requise (token GitHub)
- Images privées par défaut
- Accès restreint aux membres de l'organisation
| Pratique | Implémentation |
|---|
| Moindre privilège | Utilisateurs non-root, limites de ressources |
| Chiffrement en transit | TLS/HTTPS sur toutes les communications externes |
| Défense en profondeur | Réseau isolé + conteneurs limités + audit CI + revue code |
| Patch management | Dependabot / mises à jour régulières des images Docker |
| Séparation des environnements | Docker Compose distincts (dev / prod) |
| Logging | Logs Docker accessibles via docker compose logs et Grafana |
| Monitoring | Stack Prometheus/Grafana pour détection d'anomalies |