Chargement en cours...

n8n self-hosted sécurité : héberger vos automatisations sans ouvrir la porte aux hackers

Docker socket exposé, 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 Sécurité DevOps & Automatisation
n8n self-hosted sécurité 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 certifiés OSCP/OSEP ont audité plus de 40 installations self-hosted. Cet articlé documente les vulnérabilités les plus fréquemment 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 données, pas de limitation de workflows, coûts maittrises. Mais dans 80% des installations que nous audittons, le port 5678 est accèssible directement depuis internet, les variables d'environnement contenant les clés API sont en clair dans un docker-compose.yml pousse sur GitHub, et l'image Docker n'a pas été mise à 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 privilèges via le Docker socket (comment un attaquant passe de n8n à root sur votre VPS en 30 secondes), les CVE connus a corriger en priorité, et une checklist de hardening complete. Il s'adresse aux CTO et DSI de PME qui déploient ou envisagent de déployer n8n en self-hosted sur leurs infrastructures parisiennes ou en region.

👔

Le risque métier pour le CEO

Passer au self-hosted pour economiser des licences ou garantir la souverainete est une excellente idee financiere. Mais sans une configuration réseau etanche, vous transformez votre serveur en un point d'entree direct pour les ransomwares. Un n8n mal configuré exposé le socket Docker - ce qui signifie qu'un attaquant qui prend le contrôle de n8n prend le contrôle de tout votre VPS, de tous les containers qui tournent dessus, et de toutes les clés API, mots de passe et secrets stockés dans vos variables d'environnement. C'est tout votre réseau d'entreprise qui se retrouve exposé 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 majorité des installations que nous audittons. Elles resultent presque toutes du même point de depart : un tutoriel YouTube qui montre comment "faire tourner n8n en 5 minutes" sans jamais aborder la sécurité de production.

CRITIQUE

Erreur 1 - Port 5678 exposé directement sur internet

Le docker-compose.yml par defaut publié n8n sur 0.0.0.0:5678, ce qui le rend accèssible depuis n'importe quelle IP. Même avec l'authentification activee, n8n est directement attaquable par bruteforce, et chaque CVE de l'interface web devient immédiatement exploitable depuis internet.

# MAUVAIS - port exposé sur toutes les interfaces ports: - "5678:5678" # BON - port accèssible 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 contrôle n8n contrôle désormais 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 plutôt que Docker-in-Docker
ELEVE

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

Les clés API, mots de passe de basé de données et tokens sont souvent places directement dans le fichier docker-compose.yml, qui finit pousse sur un dépôt GitHub "prive" - ou sur un dépôt 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=clésecreteenclaire # BON - référence à un fichier .env hors git env_file: - .env # dans .gitignore
ELEVE

Erreur 4 - Pas d'isolation réseau entre containers

Sans configuration de réseau Docker explicite, tous les containers sur le même hote peuvent communiquer entre eux par defaut. Un n8n compromis peut alors atteindre la basé de données PostgreSQL, le container Redis, ou d'autres services internes qui n'ont aucune raison d'être accèssibles depuis n8n. Le principe de moindre privilège s'applique aussi aux réseaux de containers.

MOYEN

Erreur 5 - Webhooks publics sans validation de token

Les webhooks n8n générés automatiquement sont publics par defaut - n'importe qui connaissant l'URL peut les decléncher. Sans header d'authentification ou validation HMAC, un attaquant peut decléncher des workflows arbitrairement, potentiellement exfiltrer des données ou injecter des données malveillantes dans vos pipelines.

80%

des n8n self-hosted que nous auditons ont le port 5678 accèssible depuis internet

30s

temps nécessaire pour passer de n8n compromis à root sur le VPS via le Docker socket

8 mois

délai moyen entre la mise en prod et la dernière mise à 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 à root VPS en 30 secondes

C'est le scenario d'attaque le plus severe que nous demonstrons lors de nos audits de sécurité offensifs. Il nécessite deux conditions reunies : une interface n8n accèssible depuis internet (erreur 1) et le Docker socket monte dans le container (erreur 2). Ces deux conditions sont reunies dans une majorité des installations que nous voyons.

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

Escalade de privilèges via Docker socket - n8n mal configuré ÉTAPE 1 Interface n8n accèssible sur :5678 depuis internet ÉTAPE 2 Auth faible ou bruteforce → accès à l'interface ÉTAPE 3 Workflow avec node "Exécuté Command" ou "Code" → shell dans le container ÉTAPE 4 - Exploitation du Docker socket docker run --privileged -v /:/host alpine chroot /host Le socket /var/run/docker.sock permet de créer un nouveau container avec accès root à l'hote ÉTAPE 5 - Root sur le VPS Accès complet au système de fichiers de l'hote via /host Exfiltration secrets Toutes les variables .env de tous les containers Déploiement ransomware Chiffrement de tous les volumes + données Pivot réseau Accès aux services internes et lateraux Duree totale de l'attaque : moins de 30 secondes prerequis : port 5678 accèssible + Docker socket monte dans le container n8n

La commande clé de cette escalade est simple et documentee publiquement depuis des années :

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

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

Avec un accès root sur l'hote, l'attaquant lit tous les fichiers .env de tous les containers (clés AWS, Stripe, SendGrid, tokens Slack...), installe un backdoor persistant dans le crontab de l'hote, copie la basé de données n8n qui contient tous vos credentials de workflow, et peut déployer un ransomware qui chiffre l'integralite des volumes. Le tout sans decléncher la moindre alerte sur une infrastructure n8n standard non monitoree.

Le node "Exécuté Command" de n8n est aussi un vecteur d'accès direct - il permet d'exécuter 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 créé un workflow minimal et obtient un shell dans le container sans même avoir besoin du Docker socket.


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

n8n est un projet actif avec des releases fréquentes. Chaque version corrige des vulnérabilités - dans n8n lui-même, mais aussi dans ses dependances Node.js embarquees. Un n8n "qui marche" non mis à jour depuis 6 mois est statistiquement vulnérable 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 exposés (metadata AWS, Redis, basés de données) en faisant faire des requêtes HTTP a n8n vers des adresses internes. Exfiltration de données internes, pivot réseau
CVE-2023-27562 CRITIQUE Injection de commandes via certains nodes de type "Exécuté". Permet l'exécution de code arbitraire dans le container sans passer par le node "Exécuté Command" explicite. RCE dans le container n8n
CVE-2023-26115 ELEVE Vulnérabilité ReDoS dans word-wrap, dependance embarquee. Permet un deni de service via des expressions regulieres malicieuses dans les inputs de workflow. Deni de service, indisponibilité
CVE-2023-26136 ELEVE Prototype pollution dans tough-cookie (dependance axios). Peut permettre une escalade de privilèges dans certaines configurations ou un contournement de logique applicative. Contournement logique, escalade potentielle
CVE-2022-31129 MOYEN ReDoS dans moment.js. Très répandu dans les versions antérieures a n8n 0.194. Deni de service via des inputs de date malformates dans les nodes de transformation. Deni de service
🔎

Comment vérifier votre version n8n et les CVE applicables

# Vérifier 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 # Vérifier les vulnérabilités des dependances Node.js docker exec n8n npm audit

La frequence de mise à jour recommandee pour n8n en production est mensuelle pour les versions mineures (correctifs de sécurité) et trimestrielle pour les versions majeures (avec test prealable). L'équipe n8n publié des changelogs détaillés - les entrees marquees "security" sont à traitér en urgence dans les 72 heures.

Au-dela de n8n lui-même, l'image Docker de basé (node:18-alpine ou similaire) cumule également des CVE au fil du temps. Un docker pull de la même image plusieurs mois plus tard peut donner une image significativement plus sécurisée sans changer la version de n8n.


4. L'architecture n8n sécurisée : nginx + réseau Docker isolé + rootless

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

Schema 2 - Architecture n8n self-hosted sécurisée

Architecture sécurisée n8n self-hosted - nginx, Docker network isolé, rootless INTERNET Users / Webhooks 443 HTTPS VPS Ubuntu / Debian 🛡 fail2ban - blocage automatique des IP après tentatives de bruteforce 🔒 UFW - seuls les ports 80/443 autorisés (5678 ferme, SSH limité aux IP connues) NGINX - Reverse Proxy (SSL Termination) SSL/TLS Let's Encrypt Rate limiting Headers sécurité HSTS, CSP 10 req/min/IP IP whitelist admin 127.0.0.1:5678 uniquement Reseau Docker isolé - 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 publié Volume chiffre Volumes nommes Docker - données 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 sécurité 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 requêtes/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 sécurisé 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-privilèges: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:' - inaccèssible depuis l'exterieur networks: n8n_network: driver: bridge volumes: n8n_data: postgres_data:

5. Procedure de mise à jour n8n sans perte de données

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

Étape 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

Étape 2 - Mise à jour de l'image (1 minute)

# Vérifier la dernière 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 précise # Éviter 'latest' en production - utiliser une version fixee image: n8nio/n8n:1.X.Y # version spécifique # Tirer la nouvelle image et redemarrer docker compose pull docker compose up -d

Étape 3 - Vérification post-update (5 minutes)

# Vérifier que n8n est démarré docker compose ps curl -s http://127.0.0.1:5678/healthz # Vérifier la nouvelle version docker exec n8n n8n --version # Vérifier 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 dépôt n8n-io/n8n). Les releases de sécurité sont taggees explicitement et doivent être traitées en priorité - généralement dans les 72h pour les CVE critiques, 2 semaines pour les autres.

💡

Pour les PME qui déploient n8n dans le cadre d'une stratégie de gouvernance no-code et automatisation, nous recommandons de documenter la version n8n installee, la date de la dernière mise à jour, et les workflows critiques dans un registre de gouvernance - et de planifier les mises à jour comme n'importe quelle maintenance IT, pas comme un événement 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 présenté des risques significatifs.

✓ Reseau et exposition

  • - Port 5678 lié à 127.0.0.1 uniquement (pas 0.0.0.0)
  • - Reverse proxy nginx ou Traefik avec SSL actif
  • - UFW configuré - seuls les ports 80/443/SSH autorisés
  • - fail2ban installe et configuré 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 isolé avec bridge dédié
  • - PostgreSQL non exposé sur un port public
  • - --cap-drop ALL avec capabilities minimales
  • - no-new-privilèges: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 générée aleatoirement (32 chars min)
  • - Webhooks avec validation de token HMAC
  • - Credentials n8n chiffres au repos
  • - Pas de credentials en clair dans les nodes

✓ Mises à jour et monitoring

  • - Alerte GitHub sur les releases n8n activee
  • - Mise à 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 - Sécurité n8n self-hosted

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

En cloud, n8n géré lui-même la sécurité de l'infrastructure, les mises à jour et l'isolation. En self-hosted, vous êtes responsable de tout : reverse proxy, pare-feu, isolation Docker, gestion des secrets, mises à jour. Une erreur de configuration exposé 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 sécurité.

Qu'est-ce que l'escalade de privilèges via le Docker socket ?

Le Docker socket (/var/run/docker.sock) est l'interface de contrôle du daemon Docker. Si ce socket est monte dans le container n8n, un attaquant qui compromet n8n peut créer un nouveau container --privileged et monter le système de fichiers de l'hote. En 30 secondes, il obtient un accès root complet au VPS, à tous les autres containers, et à toutes les variables d'environnement contenant vos secrets et clés 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 vulnérabilités dans les dependances Node.js embarquees (moment.js, axios, word-wrap) qui ne sont corrigees qu'en mettant à jour l'image Docker. Un n8n non mis à jour depuis 6 mois cumule statistiquement plusieurs vulnérabilités de severite haute ou critique.

Comment mettre à jour n8n sans perdre ses workflows ?

En 3 étapes : 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 à la mise à 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 être exposé directement sur internet. Il doit imperativement être place derriere un reverse proxy (nginx ou Traefik) qui géré le SSL/TLS, les headers de sécurité, le rate limiting et les règles de filtrage IP. Le port 5678 de n8n ne doit être accèssible 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 sécurité ?

2LKATIME audité et sécurisé les installations n8n self-hosted de PME parisiennes et en region. Nos auditeurs certifiés OSCP/OSEP appliquent les mêmes techniques qu'un attaquant réel : test du Docker socket, bruteforce des webhooks, tentatives d'injection via les nodes, analyse des variables d'environnement exposées. Rapport exécutif et technique avec plan de remédiation en 3 jours. Première consultation offerte.