Accueil / Blog / N8N 2.0 Python Imports Security

N8N 2.0 : Sécurité des Imports Python - Guide Complet

Vos imports Python échouent avec "Import not allowed" après la mise à jour vers N8N 2.0 ? Ce guide vous montre comment configurer les variables d'environnement pour autoriser vos modules.

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
Erreur Import not allowed dans N8N 2.0
L'erreur "Import not allowed" apparaît quand une bibliothèque n'est pas dans la liste blanche

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'
Erreur import stdlib json dans N8N 2.0
Le message distingue les erreurs stdlib des erreurs de packages externes

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

Erreur : "ModuleNotFoundError: No module named 'X'"

Causes possibles :

  1. Le module n'est pas dans la liste blanche
  2. 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.

Erreur : "Import not allowed: 'os'"

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
Le workflow fonctionne en test mais échoue en production

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

Pourquoi N8N 2.0 bloque-t-il les imports par défaut ?

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.

Puis-je autoriser tous les modules avec * ?

Techniquement possible mais fortement déconseillé. Cela annule les protections de sécurité de N8N 2.0 et expose votre serveur à des risques.

Les imports sont-ils vérifiés à chaque exécution ?

Oui. Le Native Python Runner vérifie chaque instruction import contre la liste blanche avant d'exécuter le code.

La configuration s'applique-t-elle à tous les workflows ?

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


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


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 :

  1. Configurez N8N_RUNNERS_STDLIB_ALLOW pour les modules standard
  2. Configurez N8N_RUNNERS_EXTERNAL_ALLOW pour les packages pip
  3. Installez les packages tiers dans le conteneur Docker
  4. Appliquez le principe du moindre privilège
  5. 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.

Besoin d'aide avec vos workflows N8N ?

Je peux vous accompagner dans la migration vers N8N 2.0 ou sécuriser vos automatisations Python.

Discutons de votre projet