Sécuriser Mes Workflows n8n : Plongée Profonde dans DNS et TLS

Objectif

Établir un accès fiable et chiffré à n8n (et aux services associés), que ce soit publiquement (défi Let’s Encrypt DNS-01) ou sur le LAN (Split-DNS + certificat local).

Pourquoi Sécuriser n8n ?

n8n est une puissante plateforme d'automatisation qui gère souvent des identifiants sensibles, des clés API et des workflows critiques pour l'entreprise. Sécuriser l'accès avec un DNS et un TLS appropriés assure :

  • Protection des Données : Les connexions chiffrées empêchent l'interception des identifiants
  • Authentification : Les certificats vérifiés empêchent les attaques de l'homme du milieu
  • Conformité : Respecte les meilleures pratiques de sécurité pour l'automatisation des workflows
  • Configuration Professionnelle : Démontre la maturité de l'infrastructure

Aperçu de l'Architecture

Clients Internet/LAN
       ↓
   pfSense (DNS + Firewall)
       ↓
Nginx Proxy Manager (TLS Termination)
       ↓
   n8n Docker Container (5678)

Option A : Domaine Public + Cloudflare + Défi DNS (Let’s Encrypt)

Prérequis

  • Domaine public (peut utiliser des services gratuits comme Freenom)
  • Compte Cloudflare (le niveau gratuit est suffisant)
  • Nginx Proxy Manager déployé
  • n8n fonctionnant dans Docker

Étape 1 : Configuration du Domaine avec Cloudflare

Enregistrer un Domaine Gratuit (Facultatif)

# Visit Freenom.com
# Register domain: my-portfolio.tk (or similar)
# Note: Free domains may have limitations

Ajouter le Domaine à Cloudflare

  1. Créez un compte Cloudflare sur cloudflare.com
  2. Cliquez sur « Add a site » (Ajouter un site)
  3. Entrez votre nom de domaine
  4. Choisissez le plan Gratuit
  5. Copiez les serveurs de noms Cloudflare

Mettre à Jour les Serveurs de Noms chez le Registraire

  1. Connectez-vous à votre registraire de domaine (Freenom, Namecheap, etc.)

  2. Naviguez vers DNS Management (Gestion DNS)

  3. Remplacez les serveurs de noms existants par les serveurs de noms Cloudflare :

    ns1.cloudflare.com
    ns2.cloudflare.com
  4. Attendez la propagation (peut prendre jusqu'à 24 heures)

Étape 2 : Générer le Jeton API Cloudflare

  1. Dans le tableau de bord Cloudflare, cliquez sur l'icône de profil
  2. Naviguez vers « My Profile » (Mon Profil) → « API Tokens » (Jetons API)
  3. Cliquez sur « Create Token » (Créer un Jeton)
  4. Utilisez le modèle : « Edit zone DNS » (Modifier la zone DNS)
  5. Configurez les permissions :
    • **Zone** : DNS Edit (Modification DNS)
    • **Inclure** : Zone spécifique (votre domaine)
  6. Cliquez sur « Continue to summary » (Continuer vers le résumé) → « Create Token » (Créer un Jeton)
  7. **Sauvegardez ce jeton en toute sécurité** - vous ne le verrez qu'une seule fois !

Étape 3 : Configurer Nginx Proxy Manager

Créer un Enregistrement DNS dans Cloudflare

  1. Dans Cloudflare, allez à l'onglet **DNS**
  2. Ajoutez un enregistrement A :
    • **Type** : A
    • **Nom** : n8n (ou @ pour le domaine racine)
    • **Adresse IPv4** : Votre IP publique ou utilisez le proxy Cloudflare
    • **Statut Proxy** : ✓ Proxied (nuage orange)

Ajouter un Hôte Proxy dans NPM

  1. Accédez à Nginx Proxy Manager : http://<npm-ip>:81
  2. Cliquez sur **“Proxy Hosts”** (Hôtes Proxy) → **“Add Proxy Host”** (Ajouter un Hôte Proxy)
  3. **Onglet Détails** :
    • **Noms de Domaine** : n8n.my-portfolio.tk
    • **Schéma** : http
    • **Nom d'hôte/IP de Redirection** : n8n (nom du conteneur Docker) ou IP
    • **Port de Redirection** : 5678
    • **Support Websockets** : ✓ **CRITIQUE pour n8n**
    • **Bloquer les Exploits Courants** : ✓
  4. **Onglet SSL** :
    • Sélectionnez **« Request a new SSL Certificate »** (Demander un nouveau certificat SSL)

    • Basculez **« Use a DNS Challenge »** (Utiliser un Défi DNS)

    • **Fournisseur DNS** : Sélectionnez **Cloudflare**

    • **Contenu du Fichier d'Identifiants** :

      dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN
    • **Adresse E-mail** : Votre e-mail pour Let’s Encrypt

    • Options :

      • ✓ Forcer SSL
      • ✓ Support HTTP/2
      • ✓ HSTS Activé
  5. Cliquez sur **Enregistrer**

Étape 4 : Vérifier l'Accès

# Test de la résolution DNS
nslookup n8n.my-portfolio.tk

# Test de l'accès HTTPS
curl -I https://n8n.my-portfolio.tk

# Accès dans le navigateur
https://n8n.my-portfolio.tk

Avantages et Limitations

✅ Avantages: - Certificat SSL public valide - Renouvellement automatique tous les 90 jours - Pas besoin d'ouvrir les ports 80/443 pour la validation HTTP-01 - Fonctionne de n'importe où avec accès à Internet

⚠️ Limitations: - Nécessite un domaine public et une propagation DNS - Dépend de services externes (Cloudflare, Let’s Encrypt) - Risques potentiels de confidentialité avec l'exposition publique

Option B : DNS Local (pfSense) + Certificat Local

Cas d'Utilisation

Parfait pour : - Accès interne homelab uniquement - Aucun domaine public souhaité - Environnements hors ligne ou isolés - Développement et tests

Étape 1 : Configuration Split-DNS dans pfSense

Configurer les Substitutions d'Hôte du Résolveur DNS

  1. Connectez-vous à l'interface web pfSense
  2. Naviguez vers **Services** → **DNS Resolver** (Résolveur DNS)
  3. Assurez-vous que le DNS Resolver est **activé**
  4. Faites défiler jusqu'à **Host Overrides** (Substitutions d'Hôte)
  5. Cliquez sur **« Add »** (Ajouter) :
    • **Hôte** : n8n
    • **Domaine** : local.home (ou votre choix)
    • **Adresse IP** : IP de l'hôte exécutant NPM
    • **Description** : Plateforme d'automatisation n8n
  6. Cliquez sur **Save** (Enregistrer) → **Apply Changes** (Appliquer les changements)

Tester la Résolution DNS

Depuis un client sur votre réseau :

# Devrait se résoudre à l'IP de votre hôte NPM
nslookup n8n.local.home

# Ou en utilisant dig
dig n8n.local.home

Étape 2 : Générer un Certificat SSL Local

Option A : Certificat Auto-Signé (OpenSSL)

# Generate private key
openssl genrsa -out n8n-local.key 2048

# Generate certificate signing request
openssl req -new -key n8n-local.key -out n8n-local.csr \
  -subj "/C=US/ST=State/L=City/O=Homelab/CN=n8n.local.home"

# Generate self-signed certificate
openssl x509 -req -days 365 -in n8n-local.csr \
  -signkey n8n-local.key -out n8n-local.crt

Pourquoi mkcert ? Fait automatiquement confiance aux navigateurs après l'installation de l'AC.

# Install mkcert
# On Ubuntu/Debian:
sudo apt install libnss3-tools
wget https://github.com/FiloSottile/mkcert/releases/download/v1.4.4/mkcert-v1.4.4-linux-amd64
sudo mv mkcert-v1.4.4-linux-amd64 /usr/local/bin/mkcert
sudo chmod +x /usr/local/bin/mkcert

# Install local CA
mkcert -install

# Generate certificate for n8n
mkcert n8n.local.home "*.local.home"

# This creates:
# n8n.local.home+1.pem (certificate)
# n8n.local.home+1-key.pem (private key)

Étape 3 : Importer le Certificat dans NPM

  1. Dans Nginx Proxy Manager, allez à **SSL Certificates** (Certificats SSL)
  2. Cliquez sur **« Add SSL Certificate »** (Ajouter un certificat SSL) → **« Custom »** (Personnalisé)
  3. Téléchargez les fichiers :
    • **Clé de Certificat** : n8n.local.home+1-key.pem
    • **Certificat** : n8n.local.home+1.pem
  4. Cliquez sur **Enregistrer**

Étape 4 : Créer l'Hôte Proxy

  1. Cliquez sur **“Proxy Hosts”** (Hôtes Proxy) → **“Add Proxy Host”** (Ajouter un Hôte Proxy)
  2. **Onglet Détails** :
    • **Noms de Domaine** : n8n.local.home
    • **Schéma** : http
    • **Nom d'hôte/IP de Redirection** : n8n ou IP du conteneur
    • **Port de Redirection** : 5678
    • **Support Websockets** : ✓
    • **Bloquer les Exploits Courants** : ✓
  3. **Onglet SSL** :
    • **Certificat SSL** : Sélectionnez votre certificat personnalisé
    • **Forcer SSL** : ✓
    • **Support HTTP/2** : ✓
  4. Cliquez sur **Enregistrer**

Étape 5 : Installer l'AC sur les Appareils Clients

Pour mkcert :

Linux:

mkcert -install

Windows:

# Run mkcert installer
mkcert-v1.4.4-windows-amd64.exe -install

macOS:

mkcert -install

Appareils Mobiles: - Exportez le certificat CA depuis mkcert -CAROOT - Transférez vers l'appareil - Installez comme certificat de confiance

Avantages et Limitations

✅ Avantages: - Aucune dépendance externe - Fonctionne hors ligne - Contrôle total sur les certificats - Aucune exposition publique

⚠️ Limitations: - Nécessite l'installation de l'AC sur tous les appareils clients - Renouvellement manuel du certificat - Accessible uniquement sur le réseau local

Dépannage des Problèmes Courants

Problème : n8n nécessite HTTPS pour les cookies sécurisés

Solutions :

# Option 1: Use HTTPS (recommended)
# Suivre les étapes ci-dessus

# Option 2: Disable secure cookie (POUR TEST UNIQUEMENT)
docker run -e N8N_SECURE_COOKIE=false n8nio/n8n

Problème 2 : NPM Ne Peut Pas Résoudre le Nom du Conteneur

Problème : Nginx Proxy Manager ne peut pas atteindre le conteneur n8n

Solutions :

# Option 1: Use Docker network
# Assurez-vous que les deux conteneurs sont sur le même réseau Docker

# Option 2: Use host IP instead of container name
# Dans l'hôte proxy NPM, utilisez: 192.168.x.x au lieu de "n8n"

# Option 3: Use Docker bridge IP
docker inspect n8n | grep IPAddress
# Utilisez cette IP dans la configuration NPM

Problème 3 : Le DNS Interne Ne Résout Pas

Problème : Les clients ne peuvent pas résoudre n8n.local.home

Solutions :

  1. Vérifiez que le DNS Resolver pfSense est en cours d'exécution :

    • Services → DNS Resolver → État
  2. Vérifiez les paramètres DNS du client :

    # Linux/macOS
    cat /etc/resolv.conf
    # Devrait afficher l'IP pfSense
    
    # Windows
    ipconfig /all
    # Vérifiez les Serveurs DNS
  3. Testez depuis pfSense lui-même :

    # Diagnostics → Command Prompt
    nslookup n8n.local.home

Problème 4 : Le Défi DNS-01 de Let’s Encrypt Échoue

Problème : La demande de certificat échoue

Solutions :

  1. Vérifiez les Permissions du Jeton API :

    • Doit avoir **Zone:DNS:Edit** pour la zone spécifique
    • Ne peut pas utiliser la clé API globale
  2. Vérifiez la Propagation de l'Enregistrement TXT :

    dig _acme-challenge.n8n.my-portfolio.tk TXT
  3. Examinez les Journaux NPM :

    docker logs nginx-proxy-manager

Meilleures Pratiques de Sécurité

1. Activer l'Authentification dans n8n

# docker-compose.yml
environment:
  - N8N_BASIC_AUTH_ACTIVE=true
  - N8N_BASIC_AUTH_USER=admin
  - N8N_BASIC_AUTH_PASSWORD=secure_password_here

2. Restreindre l'Accès par IP

Dans NPM, ajoutez une Liste d'Accès : - **Autoriser** : Vos IPs de confiance - **Refuser** : Tous les autres

3. Utiliser des Paramètres Cloudflare Robustes

  • Activez le **Mode Bot Fight**
  • Ajoutez des **Règles de Page** pour la limitation de débit
  • Activez **Toujours Utiliser HTTPS**

4. Surveiller les Journaux d'Accès

# Afficher les journaux d'accès NPM
docker exec -it nginx-proxy-manager tail -f /data/logs/proxy-host-*.log

5. Surveillance Régulière des Certificats

  • Définissez un rappel dans le calendrier pour l'expiration du certificat
  • Surveillez les journaux de renouvellement NPM
  • Testez l'accès après les renouvellements

Liste de Validation

Pour la Configuration de Domaine Public:

Pour la Configuration Locale:

Conclusion

Sécuriser n8n avec une configuration DNS et TLS appropriée transforme une plateforme d'automatisation vulnérable en un système prêt pour la production. Que vous choisissiez l'approche du domaine public avec Let’s Encrypt ou la méthode du certificat local, les deux offrent un chiffrement solide et une gestion d'accès professionnelle.

La clé est de comprendre vos besoins : - **Accès public nécessaire ?** → Option A (Cloudflare + Let’s Encrypt) - **Uniquement interne ?** → Option B (pfSense + Certificats Locaux)

Les deux approches démontrent une maturité de l'infrastructure et une conscience de la sécurité, des compétences essentielles pour tout administrateur de homelab ou professionnel de la sécurité.

Rappel : La sécurité est une question de couches. DNS et TLS ne sont que le début - ajoutez l'authentification, la surveillance et des audits réguliers pour une protection complète.