TL;DR
N8N 2.0 bloque par défaut tous les imports Python dans le Native Python Runner pour des raisons de sécurité. Si votre code utilise import json, import pandas ou toute autre bibliothèque, vous obtiendrez une erreur "Import not allowed".
La solution : configurez les variables d'environnement N8N_RUNNERS_STDLIB_ALLOW (bibliothèques standard) et N8N_RUNNERS_EXTERNAL_ALLOW (packages tiers).
# ❌ Erreur en N8N 2.0 par défaut import json # ModuleNotFoundError ou "Import not allowed" import pandas as pd # ✅ Fonctionne après configuration des variables d'environnement # N8N_RUNNERS_STDLIB_ALLOW=json,datetime,re # N8N_RUNNERS_EXTERNAL_ALLOW=pandas,numpy import json import pandas as pd
Le Problème : Imports Python Bloqués
Symptômes
Après la mise à jour vers N8N 2.0, vos Python Code Nodes échouent dès la première ligne d'import. Messages d'erreur typiques :
ModuleNotFoundError: No module named 'json'
Ou :
SecurityError: Import of module 'pandas' is not allowed
Ou encore :
Import not allowed: 're'
Pourquoi ce comportement ?
Le Native Python Runner de N8N 2.0 fonctionne dans un environnement sandboxé avec une politique de sécurité stricte :
| Aspect | N8N 1.x (Pyodide) | N8N 2.0 (Native Runner) |
|---|---|---|
| Imports | Limités aux modules Pyodide | Tous bloqués par défaut |
| Sécurité | Isolation WebAssembly | Whitelist explicite |
| Configuration | Non configurable | Variables d'environnement |
| Performance | Lente | Rapide (Python natif) |
Philosophie de sécurité : N8N 2.0 applique le principe du moindre privilège. Par défaut, aucun module n'est accessible. L'administrateur doit explicitement autoriser chaque bibliothèque utilisée.
La Solution : Variables d'Environnement
Vue d'ensemble
N8N 2.0 introduit deux variables d'environnement pour contrôler les imports Python :
| Variable | Description | Exemple |
|---|---|---|
N8N_RUNNERS_STDLIB_ALLOW |
Modules de la bibliothèque standard Python | json,datetime,re,os.path |
N8N_RUNNERS_EXTERNAL_ALLOW |
Packages tiers (pip) | pandas,numpy,requests |
Étape 1 : Identifier les imports nécessaires
Analysez vos Python Code Nodes pour lister tous les imports :
# Imports standard (stdlib) import json import datetime import re from collections import defaultdict # Imports tiers (external) import pandas as pd import numpy as np import requests
Étape 2 : Configurer les variables d'environnement
Docker Compose (recommandé)
# docker-compose.yml services: n8n: image: n8nio/n8n:latest environment: - N8N_RUNNERS_STDLIB_ALLOW=json,datetime,re,collections,os.path,math,hashlib - N8N_RUNNERS_EXTERNAL_ALLOW=pandas,numpy,requests,openpyxl # ... autres configurations
Docker Run
docker run -d \ -e N8N_RUNNERS_STDLIB_ALLOW="json,datetime,re,collections" \ -e N8N_RUNNERS_EXTERNAL_ALLOW="pandas,numpy" \ n8nio/n8n:latest
Fichier .env
# .env
N8N_RUNNERS_STDLIB_ALLOW=json,datetime,re,collections,os.path,math,hashlib,base64
N8N_RUNNERS_EXTERNAL_ALLOW=pandas,numpy,requests,openpyxl,xlrd
Étape 3 : Redémarrer N8N
# Docker Compose docker-compose down && docker-compose up -d # Vérifier les logs docker-compose logs -f n8n
Modules Couramment Utilisés
Bibliothèque Standard (stdlib)
N8N_RUNNERS_STDLIB_ALLOW=json,datetime,re,collections,os.path,math,hashlib,base64,csv,io,uuid,typing,functools,itertools
| Module | Usage typique |
|---|---|
json |
Parsing/sérialisation JSON |
datetime |
Manipulation de dates |
re |
Expressions régulières |
collections |
Structures de données avancées |
os.path |
Manipulation de chemins (lecture seule) |
math |
Fonctions mathématiques |
hashlib |
Hachage (MD5, SHA) |
base64 |
Encodage/décodage |
csv |
Traitement de fichiers CSV |
uuid |
Génération d'identifiants uniques |
Packages Tiers (external)
N8N_RUNNERS_EXTERNAL_ALLOW=pandas,numpy,requests,openpyxl,xlrd,beautifulsoup4,lxml
| Package | Usage typique |
|---|---|
pandas |
Analyse de données, DataFrames |
numpy |
Calculs numériques |
requests |
Appels HTTP |
openpyxl |
Lecture/écriture Excel (.xlsx) |
xlrd |
Lecture Excel (.xls) |
beautifulsoup4 |
Parsing HTML |
Bonnes Pratiques de Sécurité
1. Principe du moindre privilège
N'autorisez que les modules réellement utilisés par vos workflows :
# ❌ Trop permissif N8N_RUNNERS_STDLIB_ALLOW=* N8N_RUNNERS_EXTERNAL_ALLOW=* # ✅ Restrictif et sécurisé N8N_RUNNERS_STDLIB_ALLOW=json,datetime N8N_RUNNERS_EXTERNAL_ALLOW=pandas
2. Évitez les modules sensibles
Certains modules de la bibliothèque standard présentent des risques de sécurité :
| Module | Risque | Alternative |
|---|---|---|
os |
Accès système complet | os.path (lecture seule) |
subprocess |
Exécution de commandes | Éviter |
socket |
Connexions réseau directes | requests |
pickle |
Désérialisation dangereuse | json |
Attention : N'autorisez jamais os, subprocess, eval ou exec sauf si absolument nécessaire et dans un environnement contrôlé.
3. Documentez vos autorisations
Maintenez une liste des modules autorisés et leur justification dans votre documentation.
Installation des Packages Python
Dans le conteneur Docker
Pour que les packages tiers fonctionnent, ils doivent être installés dans le conteneur N8N :
# Dockerfile personnalisé
FROM n8nio/n8n:latest
USER root
RUN pip install pandas numpy openpyxl xlrd requests beautifulsoup4
USER node
Via docker-compose
# docker-compose.yml services: n8n: image: n8nio/n8n:latest command: > sh -c "pip install pandas numpy openpyxl && n8n start" # ...
Vérification des packages installés
docker-compose exec n8n pip list | grep -E "pandas|numpy|openpyxl"
Troubleshooting
Causes possibles :
- Le module n'est pas dans la liste blanche
- Le package n'est pas installé dans le conteneur
Solution : Ajoutez le module à la variable appropriée ET installez-le si c'est un package externe.
Cause : Le module os complet est bloqué pour des raisons de sécurité.
Solution : Utilisez uniquement les sous-modules nécessaires :
# Au lieu de os, utilisez os.path
N8N_RUNNERS_STDLIB_ALLOW=os.path
Cause : Les variables d'environnement ne sont pas appliquées correctement.
Vérification :
# Vérifier les variables dans le conteneur docker-compose exec n8n printenv | grep N8N_RUNNERS # Redémarrer pour appliquer les changements docker-compose down && docker-compose up -d
FAQ
Pour des raisons de sécurité. Le Native Python Runner exécute du code Python réel sur le serveur (contrairement à Pyodide qui utilisait WebAssembly isolé). Autoriser tous les imports par défaut permettrait à un workflow malveillant d'accéder au système de fichiers, d'exécuter des commandes, ou d'établir des connexions réseau non contrôlées.
Techniquement possible mais fortement déconseillé. Cela annule les protections de sécurité de N8N 2.0 et expose votre serveur à des risques.
Oui. Le Native Python Runner vérifie chaque instruction import contre la liste blanche avant d'exécuter le code.
Oui. Les variables N8N_RUNNERS_STDLIB_ALLOW et N8N_RUNNERS_EXTERNAL_ALLOW s'appliquent globalement à tous les Python Code Nodes de l'instance N8N.
Checklist de Migration
- Auditer tous les Python Code Nodes pour lister les imports
- Séparer les imports stdlib des imports tiers
- Ajouter
N8N_RUNNERS_STDLIB_ALLOWavec les modules standard nécessaires - Ajouter
N8N_RUNNERS_EXTERNAL_ALLOWavec les packages tiers nécessaires - Installer les packages tiers dans le conteneur Docker
- Redémarrer N8N pour appliquer la configuration
- Tester chaque workflow Python
- Documenter les modules autorisés et leur justification
Configuration Recommandée
Pour la plupart des cas d'usage en entreprise, voici une configuration de base équilibrée :
# docker-compose.yml services: n8n: image: n8nio/n8n:latest environment: # Modules standard essentiels - N8N_RUNNERS_STDLIB_ALLOW=json,datetime,re,collections,math,hashlib,base64,csv,io,uuid # Packages tiers courants (assurez-vous qu'ils sont installés) - N8N_RUNNERS_EXTERNAL_ALLOW=pandas,numpy,openpyxl,requests
Ressources
-
N8N 2.0 Release Notes
Changelog officiel
-
N8N Python Code Node Documentation
Documentation officielle
-
N8N Task Runners Configuration
Configuration avancée des runners
-
N8N Community Forum
Support communautaire
Conclusion
La sécurité renforcée des imports Python en N8N 2.0 représente un changement majeur de paradigme : de "tout est permis" à "tout est interdit par défaut". Cette approche whitelist offre un meilleur contrôle mais nécessite une configuration explicite.
Points clés à retenir :
- Configurez
N8N_RUNNERS_STDLIB_ALLOWpour les modules standard - Configurez
N8N_RUNNERS_EXTERNAL_ALLOWpour les packages pip - Installez les packages tiers dans le conteneur Docker
- Appliquez le principe du moindre privilège
- Documentez et auditez régulièrement vos autorisations
Sécurité : Le blocage par défaut des imports est une bonne pratique. Prenez le temps de configurer correctement plutôt que de tout autoriser.