Aller au contenu principal

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

MesureConfigurationDétails
SSH par clé uniquementPasswordAuthentication noConnexion par mot de passe désactivée, seule l'authentification par clé publique est autorisée
Fail2banJail sshd activeBannissement automatique des IPs après tentatives de connexion échouées
Ports exposés22 (SSH), 80 (HTTP), 443 (HTTPS)Tous les autres ports sont fermés par le firewall

Isolation par réseaux Docker

RéseauAccès externeRôle
dokploy-networkVia Traefik uniquementServices exposés au reverse proxy
monitor-netNonCommunication Vision ↔ Backend ↔ Monitoring
internalNonRé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 :

ServiceUtilisateurUID:GID
API REST (AdonisJS)nodejs1001:1001
Frontend (my-app)nextjs1001:1001
Showcasenextjsvia addgroup/adduser
Redis Workerappuserdynamique
Camera ManagerrootContrainte driver GPU
Batch InferencerootContrainte 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

ImageUsageAvantage sécurité
node:20-alpineBackend (API)Surface d'attaque réduite (Alpine minimal)
node:22-alpineFrontend, ShowcaseSurface d'attaque réduite (Alpine minimal)
python:3.11-slim-bookwormRedis WorkerImage légère sans outils inutiles
nginx:alpineDocumentationServeur statique minimal
ultralytics/ultralyticsBatch InferenceImage GPU spécialisée (lourde, requise pour YOLO)
ghcr.io/firstbreath/opencv-cudaCamera ManagerImage 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èmeOutilExécution
Node.js (npm/pnpm/yarn)pnpm audit / npm auditChaque pipeline CI
Python (pip)safety checkChaque 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

MesureDétails
Accès réseauMySQL accessible uniquement via le réseau Docker interne
AuthentificationMots de passe via variables d'environnement (.env)
Volumes persistantsDonnées MySQL stockées dans un volume Docker nommé (mysql_data)
AdministrationCloudBeaver accessible uniquement via HTTPS et authentification

Redis

MesureDétails
Authentificationrequirepass obligatoire
MémoireLimite à 256 MB avec politique allkeys-lru (éviction automatique)
Accès réseauNon 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)

MesureDétails
Rate limitingConfigurable via Traefik middleware
Limites de ressourcesCPU/RAM caps sur chaque conteneur
Redis LRUPolitique d'éviction pour éviter l'épuisement mémoire
HealthchecksRedémarrage automatique des services défaillants

Intrusions

MesureDétails
Isolation réseauServices internes non accessibles depuis Internet
Utilisateurs non-rootLimitation des privilèges en cas de compromission
Images minimalesRéduction de la surface d'attaque
TLS obligatoireChiffrement de toutes les communications
Audit CIDé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

6. Conformité et bonnes pratiques

PratiqueImplémentation
Moindre privilègeUtilisateurs non-root, limites de ressources
Chiffrement en transitTLS/HTTPS sur toutes les communications externes
Défense en profondeurRéseau isolé + conteneurs limités + audit CI + revue code
Patch managementDependabot / mises à jour régulières des images Docker
Séparation des environnementsDocker Compose distincts (dev / prod)
LoggingLogs Docker accessibles via docker compose logs et Grafana
MonitoringStack Prometheus/Grafana pour détection d'anomalies