Back

Les fichiers .env et l'art de ne pas exposer ses secrets

Les fichiers .env et l'art de ne pas exposer ses secrets

Avez-vous déjà vu un fichier .env dans un projet et vous êtes-vous demandé à quoi il servait ? Ou peut-être avez-vous entendu parler des dangers d’exposer accidentellement des clés API sur GitHub ? Ce guide vous expliquera tout ce que vous devez savoir sur les fichiers .env – ce qu’ils sont, pourquoi ils sont importants, et comment les utiliser correctement pour protéger vos secrets.

Points clés à retenir

  • Les fichiers .env stockent la configuration spécifique à l’environnement et les secrets séparément de votre code
  • Ne jamais commiter les fichiers .env dans le contrôle de version
  • Utilisez des fichiers .env.example pour documenter les variables requises sans révéler les valeurs réelles
  • Validez les variables d’environnement au démarrage de votre application
  • Envisagez des solutions plus avancées à mesure que votre équipe et votre application grandissent

Que sont les fichiers .env ?

Un fichier .env est un simple fichier texte qui stocke les variables d’environnement dans un format CLÉ=valeur. Ces fichiers servent un objectif critique : ils maintiennent les données de configuration sensibles séparées de votre code.

# Exemple de fichier .env
API_KEY=a1b2c3d4e5f6g7h8i9j0
DATABASE_URL=postgres://username:password@localhost:5432/mydb
DEBUG=false

Les variables d’environnement sont des valeurs qui peuvent affecter le comportement de votre application en cours d’exécution. En les stockant dans un fichier .env au lieu de les coder en dur dans votre application, vous obtenez plusieurs avantages :

  1. Sécurité : Les données sensibles restent en dehors de votre base de code
  2. Flexibilité : Différents environnements peuvent utiliser différentes configurations
  3. Simplicité : Facile à mettre à jour sans changer le code

Pourquoi les fichiers .env existent : Un bref historique

L’approche des fichiers .env a gagné en popularité vers 2012 dans le cadre de la méthodologie Twelve-Factor App, qui recommande de stocker la configuration dans l’environnement. Avant cette standardisation, les développeurs commettaient souvent des erreurs dangereuses :

  • Coder en dur les identifiants de base de données directement dans le code
  • Stocker les clés API dans des fichiers de configuration commitées
  • Utiliser différents mécanismes de configuration selon les environnements

Ces pratiques ont conduit à de graves violations de sécurité. En 2016, Uber a subi une violation massive de données exposant les données de 57 millions d’utilisateurs parce que les développeurs avaient publié des identifiants AWS dans un dépôt GitHub. Le règlement leur a coûté 148 millions de dollars.

Comment fonctionnent les fichiers .env

Les fichiers .env sont simples en concept mais puissants en pratique. Voici comment ils fonctionnent généralement :

  1. Vous créez un fichier .env à la racine de votre projet
  2. Vous ajoutez des variables spécifiques à l’environnement au format CLÉ=valeur
  3. Une bibliothèque dans votre application charge ces variables à l’exécution
  4. Le code de votre application accède à ces valeurs via les variables d’environnement

La partie la plus importante : votre fichier .env ne doit jamais être commité dans le contrôle de version.

Configuration des fichiers .env dans un projet Node.js

Parcourons un exemple pratique utilisant Node.js :

1. Créer un fichier .env

À la racine de votre projet, créez un fichier nommé .env :

# Identifiants API
API_KEY=your_secret_api_key
API_SECRET=your_secret_api_secret

# Configuration de la base de données
DB_HOST=localhost
DB_USER=root
DB_PASS=password
DB_NAME=myapp

# Paramètres de l'application
PORT=3000
NODE_ENV=development

2. Ajouter .env au .gitignore

Créez ou mettez à jour votre fichier .gitignore pour inclure :

# Variables d'environnement
.env
.env.local
.env.*.local

3. Installer le package dotenv

npm install dotenv --save

4. Charger les variables d’environnement dans votre application

Tout en haut de votre fichier d’application principal (avant tout autre code) :

require('dotenv').config();

// Maintenant vous pouvez accéder aux variables en utilisant process.env
const apiKey = process.env.API_KEY;
const port = process.env.PORT || 3000;

console.log(`Démarrage du serveur sur le port ${port}`);

Bonnes pratiques de sécurité

Suivre ces bonnes pratiques vous aidera à éviter les pièges de sécurité courants :

1. Ne jamais commiter les fichiers .env dans le contrôle de version

C’est la règle la plus importante. Vérifiez votre fichier .gitignore pour vous assurer que .env est exclu.

2. Créer un fichier modèle .env.example

Fournissez un modèle avec les variables requises mais sans les valeurs réelles :

# Identifiants API
API_KEY=
API_SECRET=

# Configuration de la base de données
DB_HOST=
DB_USER=
DB_PASS=
DB_NAME=

# Paramètres de l'application
PORT=3000
NODE_ENV=development

Ce fichier doit être commité dans votre dépôt pour aider les autres développeurs à savoir quelles variables ils doivent définir.

3. Valider les variables d’environnement requises

Vérifiez que toutes les variables requises sont présentes au démarrage de votre application :

const requiredEnvVars = ['API_KEY', 'DB_HOST', 'DB_USER', 'DB_PASS'];
const missingEnvVars = requiredEnvVars.filter(
  envVar => !process.env[envVar]
);

if (missingEnvVars.length > 0) {
  throw new Error(`Variables d'environnement requises manquantes : ${missingEnvVars.join(', ')}`);
}

4. Utiliser différents fichiers .env pour différents environnements

Pour des configurations plus complexes, vous pourriez vouloir plusieurs fichiers d’environnement :

  • .env.development - Paramètres de l’environnement de développement
  • .env.test - Paramètres de l’environnement de test
  • .env.production - Paramètres de l’environnement de production

Défis courants et solutions

Défi : Partager les secrets entre les membres de l’équipe

Partager les secrets de manière sécurisée entre les membres de l’équipe est délicat. Évitez d’envoyer les identifiants par email ou chat.

Solutions :

  • Utilisez un gestionnaire de mots de passe avec des capacités de partage
  • Envisagez un service de gestion des secrets comme Doppler ou HashiCorp Vault
  • Pour les petites équipes, des canaux chiffrés sécurisés peuvent être acceptables

Défi : Gérer plusieurs environnements

À mesure que votre application grandit, vous devrez gérer les variables à travers les environnements.

Solutions :

  • Utilisez des fichiers .env spécifiques à l’environnement (.env.development, .env.production)
  • Implémentez une hiérarchie de chargement où .env.local remplace .env
  • Envisagez des outils de gestion des variables d’environnement pour les équipes plus importantes

Défi : Intégration du pipeline CI/CD

Votre pipeline CI/CD a besoin d’accéder aux secrets, mais vous ne pouvez pas commiter les fichiers .env.

Solutions :

  • Utilisez la gestion des secrets de votre fournisseur CI/CD (GitHub Secrets, GitLab CI/CD Variables)
  • Intégrez avec un service de gestion des secrets
  • Générez les fichiers .env pendant le déploiement à partir d’une source sécurisée

Au-delà de l’utilisation de base

Travailler avec TypeScript

Pour les projets TypeScript, vous pouvez ajouter la sécurité de type à vos variables d’environnement :

// src/env.d.ts
declare namespace NodeJS {
  interface ProcessEnv {
    NODE_ENV: 'development' | 'production' | 'test';
    PORT: string;
    API_KEY: string;
    // Ajoutez d'autres variables ici
  }
}

Docker et conteneurisation

Lors de l’utilisation de Docker, vous avez plusieurs options pour gérer les variables d’environnement :

  1. Utilisez le flag --env-file :

    docker run --env-file .env myapp
  2. Définissez les variables dans votre docker-compose.yml :

    services:
      app:
        image: myapp
        env_file:
          - .env

Alternatives aux fichiers .env

Bien que les fichiers .env soient populaires, ils ne sont pas la seule solution :

ApprocheAvantagesInconvénients
Fichiers .envSimple, largement supportéPartage manuel, pas de versioning
Variables d’environnementSupport natif de l’OS, pas de fichiers nécessairesPlus difficile à gérer des ensembles de variables
Serveurs de configurationCentralisé, versionné, contrôle d’accèsConfiguration plus complexe, point de défaillance unique potentiel
Gestionnaires de secretsSécurisé, audité, contrôle d’accèsCoût, dépendance supplémentaire

FAQ

Oui, les commentaires commencent par #.

Les fichiers .env sont chargés par votre application à l'exécution, tandis que les variables d'environnement système sont définies au niveau de l'OS. Les variables .env n'affectent que l'application spécifique qui les charge.

Utilisez des fichiers spécifiques à l'environnement comme .env.development et .env.production, ou utilisez un service de gestion des secrets.

L'impact est négligeable pour la plupart des applications. Le fichier est généralement lu une seule fois au démarrage.

Utilisez un gestionnaire de mots de passe sécurisé ou un outil dédié de gestion des secrets plutôt que l'email ou le chat.

Conclusion

En gardant vos secrets hors de votre base de code avec les fichiers .env, vous franchissez une étape importante vers un développement d’application plus sécurisé. Rappelez-vous : le secret le plus sûr est celui qui ne quitte jamais votre environnement local.

Listen to your bugs 🧘, with OpenReplay

See how users use your app and resolve issues fast.
Loved by thousands of developers