Exercice 01 : Protéger ses secrets avec .gitignore et .env
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Identifier ce qui constitue un "secret" à ne jamais commiter
- ✅ Créer un
.gitignorequi protège les fichiers sensibles - ✅ Distinguer
.env(privé),.env.example(public) et.gitignore - ✅ Vérifier qu'un fichier est bien ignoré par Git avant de commiter
Durée estimée : 20 minutes
Difficulté : ⭐☆☆☆☆ (Débutant)
Prérequis : Git installé et configuré (commits, push)
📖 Contexte
Git garde une mémoire permanente. Un secret commité, même supprimé le lendemain, reste accessible dans l'historique à quiconque clone le dépôt. GitHub scanne automatiquement les dépôts publics pour détecter les clés API et envoie des alertes - parfois aux providers (AWS, Stripe, etc.) qui révoquent immédiatement la clé.
La protection passe par trois fichiers simples : .env, .env.example, et .gitignore.
📋 Énoncé
Mettez en place la protection des secrets sur un projet de démonstration.
🧭 Déroulement de l'exercice
Tâche 1 : Créer le projet de démonstration
Créez un dossier de travail et initialisez un repository Git :
mkdir demo-securite && cd demo-securite
git initCréez un fichier de code qui utilise des variables d'environnement :
cat > app.py << 'EOF'
import os
# Bonne pratique : lire depuis les variables d'environnement
database_url = os.environ.get("DATABASE_URL")
api_key = os.environ.get("STRIPE_API_KEY")
print(f"Connexion à : {database_url}")
print(f"Clé API : {api_key[:4]}...") # Ne jamais afficher une clé complète
EOFVérification : git status doit afficher app.py comme nouveau fichier non suivi.
Tâche 2 : Créer le fichier .env (privé)
Créez le fichier .env avec de fausses valeurs de démonstration :
cat > .env << 'EOF'
# Variables d'environnement locales - NE JAMAIS COMMITER CE FICHIER
DATABASE_URL=postgres://admin:MonMotDePasse123@localhost:5432/mabase
STRIPE_API_KEY=sk_live_abc123defghijklmnopqrstuvwxyz
JWT_SECRET=super-secret-aleatoire-32-caracteres-minimum
REDIS_URL=redis://localhost:6379/0
EOFIndice : Le
.envcontient les vraies valeurs (ou des valeurs de test réalistes). Il ne doit JAMAIS être versionné.
Vérification : cat .env affiche bien vos variables avec leurs valeurs.
Tâche 3 : Créer le .gitignore
Créez un .gitignore qui protège tous les fichiers sensibles courants :
cat > .gitignore << 'EOF'
# Variables d'environnement - JAMAIS dans Git
.env
.env.local
.env.*.local
.env.production
.env.staging
# Clés et certificats
*.key
*.pem
*.p12
*.pfx
secrets/
credentials/
# Fichiers de config avec secrets
config/production.json
config/secrets.yml
# Dossiers système et IDE
.DS_Store
__pycache__/
*.pyc
.venv/
node_modules/
EOFVérification : git status - le fichier .env ne doit PAS apparaître dans la liste des fichiers non suivis.
Attention : Si
.envapparaît toujours, vérifiez qu'il n'était pas déjà en cache Git. Dans ce cas :git rm --cached .env.
Tâche 4 : Créer le .env.example (public)
Le .env.example sert de documentation pour les autres développeurs. Il liste les variables nécessaires sans leurs valeurs réelles :
cat > .env.example << 'EOF'
# Copiez ce fichier en .env et remplissez vos propres valeurs
# cp .env.example .env
# Base de données PostgreSQL
DATABASE_URL=postgres://USER:PASSWORD@HOST:5432/DB_NAME
# Stripe (récupérer sur https://dashboard.stripe.com/apikeys)
STRIPE_API_KEY=sk_live_VOTRE_CLE_API
# Secret JWT (générer avec : openssl rand -hex 32)
JWT_SECRET=GENEREZ_UNE_CHAINE_ALEATOIRE_FORTE
# Redis (optionnel, laissez vide en dev local)
REDIS_URL=redis://localhost:6379/0
EOFVérification : cat .env.example affiche les variables avec des valeurs placeholder descriptives, pas des vraies valeurs.
Tâche 5 : Commiter correctement
Ajoutez et commitez les bons fichiers :
git add app.py .gitignore .env.example
git statusVérifiez que .env n'apparaît pas dans la liste des fichiers à commiter.
git commit -m "feat: ajouter structure de base avec protection des secrets"
git log --onelineIndice : Si
.envapparaît encore dansgit status(en rouge, fichiers non suivis), c'est normal - Git l'ignore mais l'affiche quand même comme "non suivi". La bonne question est : est-ce qu'il est dans la zone de staging (en vert) ? Il ne doit PAS l'être.
Vérification finale : git show HEAD --name-only doit lister app.py, .gitignore et .env.example, mais PAS .env.
✅ Vérification du résultat
.envcontient les "vraies" valeurs et est ignoré par Git.env.examplecontient les noms de variables avec des valeurs placeholder.gitignorecouvre.env,*.key,*.pemet les fichiers systèmegit logmontre un commit propre sans le.envgit show HEAD --name-onlyne contient PAS.env
💡 À retenir
La règle des 3 fichiers :
| Fichier | Commité ? | Contenu |
|---|---|---|
.env | ❌ Non | Vraies valeurs (secrets) |
.env.example | ✅ Oui | Noms de variables, valeurs placeholder |
.gitignore | ✅ Oui | Liste des fichiers à ignorer |
Un .env.example bien maintenu permet à n'importe quel développeur de rejoindre le projet en sachant exactement quelles variables configurer.
✨ Solution Complète
# Résumé des commandes
mkdir demo-securite && cd demo-securite
git init
echo "DATABASE_URL=postgres://admin:secret@localhost:5432/db" > .env
echo ".env" >> .gitignore
echo "DATABASE_URL=postgres://USER:PASSWORD@HOST:5432/DB_NAME" > .env.example
git add .gitignore .env.example
git commit -m "feat: protection des secrets configurée"