Chargement en cours...

n8n self-hosted securite : heberger vos automatisations sans ouvrir la porte aux hackers

Docker socket expose, port 5678 ouvert, CVE non patches : comment une installation n8n "qui marche" peut devenir le point d'entree d'un ransomware.

6 Juin 2026 2LKATIME Securite DevOps & Automatisation
n8n self-hosted securite Docker VPS PME configuration

Analyse 2LKATIME - Base d'audit de 40+ installations n8n self-hosted en PME

2LKATIME accompagne des PME et ETI sur leurs projets d'automatisation n8n depuis 2024. Nos auditeurs certifies OSCP/OSEP ont audite plus de 40 installations self-hosted. Cet article documente les vulnerabilites les plus frequemment trouvees en audit - des erreurs de configuration courantes qui transforment un outil d'automatisation en porte d'entree pour les attaquants.

n8n self-hosted est une excellente solution : souverainete des donnees, pas de limitation de workflows, couts maittrises. Mais dans 80% des installations que nous audittons, le port 5678 est accessible directement depuis internet, les variables d'environnement contenant les cles API sont en clair dans un docker-compose.yml pousse sur GitHub, et l'image Docker n'a pas ete mise a jour depuis 8 mois. Chacune de ces erreurs suffit a compromettre l'ensemble de votre infrastructure.

Ce guide couvre les 5 erreurs de configuration les plus critiques, la chaine d'escalade de privileges via le Docker socket (comment un attaquant passe de n8n a root sur votre VPS en 30 secondes), les CVE connus a corriger en priorite, et une checklist de hardening complete. Il s'adresse aux CTO et DSI de PME qui deploient ou envisagent de deployer n8n en self-hosted sur leurs infrastructures parisiennes ou en region.

👔

Le risque metier pour le CEO

Passer au self-hosted pour economiser des licences ou garantir la souverainete est une excellente idee financiere. Mais sans une configuration reseau etanche, vous transformez votre serveur en un point d'entree direct pour les ransomwares. Un n8n mal configure expose le socket Docker - ce qui signifie qu'un attaquant qui prend le controle de n8n prend le controle de tout votre VPS, de tous les containers qui tournent dessus, et de toutes les cles API, mots de passe et secrets stockes dans vos variables d'environnement. C'est tout votre reseau d'entreprise qui se retrouve expose pour une simple erreur de parametrage.


1. Les 5 erreurs de configuration n8n self-hosted les plus critiques

Ces cinq erreurs ne sont pas theoriques - elles apparaissent dans la majorite des installations que nous audittons. Elles resultent presque toutes du meme point de depart : un tutoriel YouTube qui montre comment "faire tourner n8n en 5 minutes" sans jamais aborder la securite de production.

CRITIQUE

Erreur 1 - Port 5678 expose directement sur internet

Le docker-compose.yml par defaut publie n8n sur 0.0.0.0:5678, ce qui le rend accessible depuis n'importe quelle IP. Meme avec l'authentification activee, n8n est directement attaquable par bruteforce, et chaque CVE de l'interface web devient immediatement exploitable depuis internet.

# MAUVAIS - port expose sur toutes les interfaces ports: - "5678:5678" # BON - port accessible uniquement en local ports: - "127.0.0.1:5678:5678"
CRITIQUE

Erreur 2 - Docker socket monte dans le container

Pour que n8n puisse piloter d'autres containers, certains tutoriels recommandent de monter /var/run/docker.sock dans le container n8n. C'est une erreur fatale : quiconque controle n8n controle desormais l'ensemble du daemon Docker de l'hote. Voir section 3 pour la chaine d'exploitation complete.

# DANGEREUX - ne jamais faire ca volumes: - /var/run/docker.sock:/var/run/docker.sock # ALTERNATIVE - utiliser l'API Docker avec authentification TLS # ou privilegier les nodes n8n natifs plutot que Docker-in-Docker
ELEVE

Erreur 3 - Secrets en clair dans docker-compose.yml

Les cles API, mots de passe de base de donnees et tokens sont souvent places directement dans le fichier docker-compose.yml, qui finit pousse sur un depot GitHub "prive" - ou sur un depot public par erreur. Docker Secrets ou un fichier .env exclu du git via .gitignore sont les alternatives.

# MAUVAIS - secrets en clair dans le compose environment: - DB_POSTGRESDB_PASSWORD=monmotdepasse123 - N8N_ENCRYPTION_KEY=clesecreteenclaire # BON - reference a un fichier .env hors git env_file: - .env # dans .gitignore
ELEVE

Erreur 4 - Pas d'isolation reseau entre containers

Sans configuration de reseau Docker explicite, tous les containers sur le meme hote peuvent communiquer entre eux par defaut. Un n8n compromis peut alors atteindre la base de donnees PostgreSQL, le container Redis, ou d'autres services internes qui n'ont aucune raison d'etre accessibles depuis n8n. Le principe de moindre privilege s'applique aussi aux reseaux de containers.

MOYEN

Erreur 5 - Webhooks publics sans validation de token

Les webhooks n8n generes automatiquement sont publics par defaut - n'importe qui connaissant l'URL peut les declencher. Sans header d'authentification ou validation HMAC, un attaquant peut declencher des workflows arbitrairement, potentiellement exfiltrer des donnees ou injecter des donnees malveillantes dans vos pipelines.

80%

des n8n self-hosted que nous auditons ont le port 5678 accessible depuis internet

30s

temps necessaire pour passer de n8n compromis a root sur le VPS via le Docker socket

8 mois

delai moyen entre la mise en prod et la derniere mise a jour d'un n8n self-hosted PME

12+

CVE documentes sur n8n et ses dependances depuis 2022


2. La chaine d'escalade Docker : de n8n compromis a root VPS en 30 secondes

C'est le scenario d'attaque le plus severe que nous demonstrons lors de nos audits de securite offensifs. Il necessite deux conditions reunies : une interface n8n accessible depuis internet (erreur 1) et le Docker socket monte dans le container (erreur 2). Ces deux conditions sont reunies dans une majorite des installations que nous voyons.

Schema 1 - Chaine d'escalade : n8n mal configure → root VPS

Escalade de privileges via Docker socket - n8n mal configure ETAPE 1 Interface n8n accessible sur :5678 depuis internet ETAPE 2 Auth faible ou bruteforce → acces a l'interface ETAPE 3 Workflow avec node "Execute Command" ou "Code" → shell dans le container ETAPE 4 - Exploitation du Docker socket docker run --privileged -v /:/host alpine chroot /host Le socket /var/run/docker.sock permet de creer un nouveau container avec acces root a l'hote ETAPE 5 - Root sur le VPS Acces complet au systeme de fichiers de l'hote via /host Exfiltration secrets Toutes les variables .env de tous les containers Deploiement ransomware Chiffrement de tous les volumes + donnees Pivot reseau Acces aux services internes et lateraux Duree totale de l'attaque : moins de 30 secondes prerequis : port 5678 accessible + Docker socket monte dans le container n8n

La commande cle de cette escalade est simple et documentee publiquement depuis des annees :

# Depuis un shell dans le container n8n ayant acces au Docker socket : docker run --rm -it \ --privileged \ -v /:/host \ alpine \ chroot /host /bin/sh # Resultat : shell root sur l'hote - en dehors du container # Acces complet a /etc/shadow, /root, tous les volumes, crontabs...

Ce que l'attaquant fait ensuite en moins de 2 minutes

Avec un acces root sur l'hote, l'attaquant lit tous les fichiers .env de tous les containers (cles AWS, Stripe, SendGrid, tokens Slack...), installe un backdoor persistant dans le crontab de l'hote, copie la base de donnees n8n qui contient tous vos credentials de workflow, et peut deployer un ransomware qui chiffre l'integralite des volumes. Le tout sans declencher la moindre alerte sur une infrastructure n8n standard non monitoree.

Le node "Execute Command" de n8n est aussi un vecteur d'acces direct - il permet d'executer des commandes shell arbitraires dans le container. Si l'authentification n8n est faible (mot de passe simple, pas de 2FA, session sans expiration), un attaquant cree un workflow minimal et obtient un shell dans le container sans meme avoir besoin du Docker socket.


3. CVE n8n connus et pourquoi ne pas mettre a jour est une faute

n8n est un projet actif avec des releases frequentes. Chaque version corrige des vulnerabilites - dans n8n lui-meme, mais aussi dans ses dependances Node.js embarquees. Un n8n "qui marche" non mis a jour depuis 6 mois est statistiquement vulnerable a plusieurs CVE de severite haute ou critique.

CVE Severite Description Impact
CVE-2024-39338 CRITIQUE SSRF via les webhooks n8n. Permet d'atteindre des services internes non exposes (metadata AWS, Redis, bases de donnees) en faisant faire des requetes HTTP a n8n vers des adresses internes. Exfiltration de donnees internes, pivot reseau
CVE-2023-27562 CRITIQUE Injection de commandes via certains nodes de type "Execute". Permet l'execution de code arbitraire dans le container sans passer par le node "Execute Command" explicite. RCE dans le container n8n
CVE-2023-26115 ELEVE Vulnerabilite ReDoS dans word-wrap, dependance embarquee. Permet un deni de service via des expressions regulieres malicieuses dans les inputs de workflow. Deni de service, indisponibilite
CVE-2023-26136 ELEVE Prototype pollution dans tough-cookie (dependance axios). Peut permettre une escalade de privileges dans certaines configurations ou un contournement de logique applicative. Contournement logique, escalade potentielle
CVE-2022-31129 MOYEN ReDoS dans moment.js. Tres repandu dans les versions anterieures a n8n 0.194. Deni de service via des inputs de date malformates dans les nodes de transformation. Deni de service
🔎

Comment verifier votre version n8n et les CVE applicables

# Verifier la version actuelle de votre n8n docker exec n8n n8n --version # Ou via l'API curl http://localhost:5678/healthz # Consulter les CVE sur NVD pour "n8n" # https://nvd.nist.gov/vuln/search?query=n8n # Verifier les vulnerabilites des dependances Node.js docker exec n8n npm audit

La frequence de mise a jour recommandee pour n8n en production est mensuelle pour les versions mineures (correctifs de securite) et trimestrielle pour les versions majeures (avec test prealable). L'equipe n8n publie des changelogs detailles - les entrees marquees "security" sont a traiter en urgence dans les 72 heures.

Au-dela de n8n lui-meme, l'image Docker de base (node:18-alpine ou similaire) cumule egalement des CVE au fil du temps. Un docker pull de la meme image plusieurs mois plus tard peut donner une image significativement plus securisee sans changer la version de n8n.


4. L'architecture n8n securisee : nginx + reseau Docker isole + rootless

Voici l'architecture que nous recommandons et deployons pour nos clients. Elle applique le principe de defense en profondeur : chaque couche limite independamment les risques, de sorte qu'une compromission d'une couche ne suffise pas a compromettre l'ensemble.

Schema 2 - Architecture n8n self-hosted securisee

Architecture securisee n8n self-hosted - nginx, Docker network isole, rootless INTERNET Users / Webhooks 443 HTTPS VPS Ubuntu / Debian 🛡 fail2ban - blocage automatique des IP apres tentatives de bruteforce 🔒 UFW - seuls les ports 80/443 autorises (5678 ferme, SSH limite aux IP connues) NGINX - Reverse Proxy (SSL Termination) SSL/TLS Let's Encrypt Rate limiting Headers securite HSTS, CSP 10 req/min/IP IP whitelist admin 127.0.0.1:5678 uniquement Reseau Docker isole - n8n_network (bridge) Container n8n Utilisateur non-root (uid 1000) Pas de Docker socket monte Read-only filesystem (sauf volumes) --cap-drop ALL --cap-add CHOWN port 5678 interne seulement Container PostgreSQL Accessible uniquement depuis n8n_network Port 5432 non publie Volume chiffre Volumes nommes Docker - donnees persistees separement du container - backup quotidien automatise

Voici la configuration nginx minimale de production qui implemente cette architecture :

# /etc/nginx/sites-available/n8n server { listen 443 ssl http2; server_name n8n.votre-domaine.com; # SSL Let's Encrypt ssl_certificate /etc/letsencrypt/live/n8n.votre-domaine.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/n8n.votre-domaine.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; # Headers de securite add_header Strict-Transport-Security "max-age=31536000" always; add_header X-Frame-Options DENY; add_header X-Content-Type-Options nosniff; # Rate limiting - 10 requetes/minute par IP limit_req zone=n8n_limit burst=20 nodelay; # Restriction IP pour l'interface admin (optionnel) # allow 1.2.3.4; # Votre IP bureau # deny all; location / { proxy_pass http://127.0.0.1:5678; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } # Redirection HTTP vers HTTPS server { listen 80; server_name n8n.votre-domaine.com; return 301 https://$host$request_uri; }
# docker-compose.yml securise version: '3.8' services: n8n: image: n8nio/n8n:latest restart: unless-stopped ports: - "127.0.0.1:5678:5678" # local seulement # JAMAIS : - /var/run/docker.sock:/var/run/docker.sock environment: - N8N_BASIC_AUTH_ACTIVE=true - N8N_SECURE_COOKIE=true - EXECUTIONS_DATA_SAVE_ON_ERROR=all env_file: - .env # secrets hors docker-compose.yml volumes: - n8n_data:/home/node/.n8n networks: - n8n_network user: "1000:1000" # non-root security_opt: - no-new-privileges:true cap_drop: - ALL read_only: true tmpfs: - /tmp postgres: image: postgres:15-alpine restart: unless-stopped env_file: .env volumes: - postgres_data:/var/lib/postgresql/data networks: - n8n_network # Pas de 'ports:' - inaccessible depuis l'exterieur networks: n8n_network: driver: bridge volumes: n8n_data: postgres_data:

5. Procedure de mise a jour n8n sans perte de donnees

La raison principale pour laquelle les PME ne mettent pas a jour n8n est la crainte de perdre des workflows. Cette crainte est infondee si la mise a jour est realisee correctement - les donnees sont persistees dans un volume Docker qui survit a la mise a jour de l'image. Voici la procedure que nous appliquons en production pour nos clients.

Etape 1 - Backup prealable (2 minutes)

# Exporter tous les workflows docker exec n8n n8n export:workflow --backup --output=/home/node/.n8n/backup-$(date +%Y%m%d).json # Copier le backup hors du container docker cp n8n:/home/node/.n8n/backup-$(date +%Y%m%d).json ./backup-n8n-$(date +%Y%m%d).json # Dump PostgreSQL si vous utilisez Postgres docker exec postgres pg_dump -U n8n n8n > ./backup-postgres-$(date +%Y%m%d).sql

Etape 2 - Mise a jour de l'image (1 minute)

# Verifier la derniere version disponible curl -s https://api.github.com/repos/n8n-io/n8n/releases/latest | grep tag_name # Modifier docker-compose.yml pour pointer vers la version precise # Eviter 'latest' en production - utiliser une version fixee image: n8nio/n8n:1.X.Y # version specifique # Tirer la nouvelle image et redemarrer docker compose pull docker compose up -d

Etape 3 - Verification post-update (5 minutes)

# Verifier que n8n est demarre docker compose ps curl -s http://127.0.0.1:5678/healthz # Verifier la nouvelle version docker exec n8n n8n --version # Verifier les logs pour erreurs de migration docker compose logs n8n --tail=50 | grep -i error # Tester un workflow critique

Nous recommandons d'activer les alertes de nouvelles releases n8n via GitHub (bouton Watch → Releases only sur le depot n8n-io/n8n). Les releases de securite sont taggees explicitement et doivent etre traitees en priorite - generalement dans les 72h pour les CVE critiques, 2 semaines pour les autres.

💡

Pour les PME qui deploient n8n dans le cadre d'une strategie de gouvernance no-code et automatisation, nous recommandons de documenter la version n8n installee, la date de la derniere mise a jour, et les workflows critiques dans un registre de gouvernance - et de planifier les mises a jour comme n'importe quelle maintenance IT, pas comme un evenement ponctuel.


6. Checklist hardening n8n self-hosted

Cette checklist est celle que nous utilisons lors de nos audits n8n. Cochez chaque point - si vous avez plus de 3 cases non cochees, votre installation presente des risques significatifs.

✓ Reseau et exposition

  • - Port 5678 lie a 127.0.0.1 uniquement (pas 0.0.0.0)
  • - Reverse proxy nginx ou Traefik avec SSL actif
  • - UFW configure - seuls les ports 80/443/SSH autorises
  • - fail2ban installe et configure pour n8n et SSH
  • - Rate limiting sur le reverse proxy (max 20 req/min/IP)
  • - Restriction IP sur l'interface admin si possible

✓ Docker et isolation

  • - Docker socket NON monte dans le container n8n
  • - Container n8n tourne en user non-root (uid 1000)
  • - Reseau Docker isole avec bridge dedie
  • - PostgreSQL non expose sur un port public
  • - --cap-drop ALL avec capabilities minimales
  • - no-new-privileges:true dans security_opt

✓ Secrets et authentification

  • - Fichier .env exclu du git via .gitignore
  • - Mot de passe n8n fort (16+ chars, generateur)
  • - N8N_ENCRYPTION_KEY generee aleatoirement (32 chars min)
  • - Webhooks avec validation de token HMAC
  • - Credentials n8n chiffres au repos
  • - Pas de credentials en clair dans les nodes

✓ Mises a jour et monitoring

  • - Alerte GitHub sur les releases n8n activee
  • - Mise a jour planifiee mensuelle (ou sous 72h si CVE critique)
  • - Backup quotidien automatise des workflows et DB
  • - Logs centralises et alertes sur erreurs
  • - Version n8n et date de MAJ documentees
  • - Procedure de restauration testee

FAQ - Securite n8n self-hosted

Pourquoi n8n self-hosted est-il plus risque qu'une installation cloud ?

En cloud, n8n gere lui-meme la securite de l'infrastructure, les mises a jour et l'isolation. En self-hosted, vous etes responsable de tout : reverse proxy, pare-feu, isolation Docker, gestion des secrets, mises a jour. Une erreur de configuration expose non seulement n8n, mais potentiellement tout votre VPS et les services qui y tournent. La plupart des PME installent n8n en suivant un tutoriel YouTube sans prendre en compte ces aspects securite.

Qu'est-ce que l'escalade de privileges via le Docker socket ?

Le Docker socket (/var/run/docker.sock) est l'interface de controle du daemon Docker. Si ce socket est monte dans le container n8n, un attaquant qui compromet n8n peut creer un nouveau container --privileged et monter le systeme de fichiers de l'hote. En 30 secondes, il obtient un acces root complet au VPS, a tous les autres containers, et a toutes les variables d'environnement contenant vos secrets et cles API.

Quels sont les CVE critiques connus pour n8n ?

Les plus significatifs : CVE-2024-39338 (SSRF via webhooks), CVE-2023-27562 (injection de commandes avec RCE possible), et plusieurs vulnerabilites dans les dependances Node.js embarquees (moment.js, axios, word-wrap) qui ne sont corrigees qu'en mettant a jour l'image Docker. Un n8n non mis a jour depuis 6 mois cumule statistiquement plusieurs vulnerabilites de severite haute ou critique.

Comment mettre a jour n8n sans perdre ses workflows ?

En 3 etapes : 1) Sauvegarder avec docker exec n8n n8n export:workflow --backup, 2) Copier le backup hors du container, 3) docker compose pull && docker compose up -d. Les workflows et credentials survivent a la mise a jour car ils sont persistes dans un volume Docker independant de l'image. Il est recommande de tester d'abord sur un environnement de pre-production pour les versions majeures.

Faut-il exposer n8n directement sur internet ?

Non. n8n ne doit jamais etre expose directement sur internet. Il doit imperativement etre place derriere un reverse proxy (nginx ou Traefik) qui gere le SSL/TLS, les headers de securite, le rate limiting et les regles de filtrage IP. Le port 5678 de n8n ne doit etre accessible qu'en local (127.0.0.1). Les webhooks publics doivent passer par le reverse proxy avec validation de token.

Votre n8n self-hosted passerait-il un audit de securite ?

2LKATIME audite et securise les installations n8n self-hosted de PME parisiennes et en region. Nos auditeurs certifies OSCP/OSEP appliquent les memes techniques qu'un attaquant reel : test du Docker socket, bruteforce des webhooks, tentatives d'injection via les nodes, analyse des variables d'environnement exposees. Rapport executif et technique avec plan de remediation en 3 jours. Premiere consultation offerte.