Exercice 02 : Gérer les secrets sans les exposer
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Identifier les risques des secrets hardcodés dans le code
- ✅ Détecter des secrets dans un dépôt avec
gitleaks - ✅ Passer des secrets via
-eet--env-filedans Docker - ✅ Utiliser Docker Secrets pour les stacks Swarm
- ✅ Comprendre le concept de vault de secrets (HashiCorp Vault)
Durée estimée : 20 minutes
Difficulté : ⭐☆☆☆☆ (Débutant)
Prérequis : Docker installé, notions de Git
📖 Contexte
En 2023, plus de 10 millions de secrets ont été détectés sur GitHub par GitGuardian. Un secret commité dans Git est compromis définitivement - même si supprimé, il reste dans l'historique. La règle est simple : les secrets ne doivent jamais toucher le code source ni les images Docker.
📋 Énoncé
Reproduisez les erreurs courantes de gestion de secrets, détectez-les avec gitleaks, puis appliquez les bonnes pratiques.
🧭 Déroulement de l'exercice
Tâche 1 : Identifier les secrets hardcodés
Créez un fichier app.py simulant le problème classique :
# MAUVAISE PRATIQUE - NE JAMAIS FAIRE
DATABASE_URL = "postgresql://admin:motdepasse123@db.prod.example.com/myapp"
API_KEY = "sk-proj-abc123xyz789secretkey"
AWS_SECRET_KEY = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
def connect():
return DATABASE_URLIndice : Ce code contient 3 types de secrets : credentials de base de données, clé d'API, et clé AWS. Si ce fichier est commité et le dépôt rendu public (même 5 minutes), les secrets sont compromis et doivent être immédiatement révoqués.
Vérification : Listez mentalement les 3 secrets et les conséquences d'une fuite pour chacun.
Tâche 2 : Détecter les secrets avec gitleaks
Initialisez un dépôt Git, committez le fichier, puis scannez avec gitleaks.
Indice :
`bash# Installer gitleaks
docker run --rm -v $(pwd):/repo zricethezav/gitleaks:latest detect \
--source="/repo" --no-git
>
# Ou avec installation locale
# brew install gitleaks (macOS)
# https://github.com/gitleaks/gitleaks/releases (Linux)
>
# Scanner un dépôt Git (tout l'historique)
gitleaks detect --source . --verbose
>
# Scanner seulement les fichiers non commités
gitleaks protect --staged
`
Vérification : Gitleaks détecte les 3 secrets dans app.py et affiche les lignes concernées avec le type de secret.
Tâche 3 : Variables d'environnement Docker
Réécrivez app.py pour lire les secrets depuis l'environnement, puis lancez le conteneur correctement :
# BONNE PRATIQUE
import os
DATABASE_URL = os.environ.get("DATABASE_URL")
API_KEY = os.environ.get("API_KEY")
if not DATABASE_URL:
raise ValueError("DATABASE_URL non définie")Lancez avec -e ou --env-file :
Indice :
`bash# Option 1 : passer directement (visible dans ps)
docker run -e DATABASE_URL="postgresql://..." mon-app
>
# Option 2 : fichier .env (à ajouter dans .gitignore !)
# Créez .env :
# DATABASE_URL=postgresql://admin:secret@localhost/myapp
# API_KEY=sk-proj-abc123
docker run --env-file .env mon-app
`
Vérification : .env est dans .gitignore. gitleaks detect ne trouve plus de secrets dans le code Python.
Tâche 4 : Docker Secrets (Swarm)
Créez un secret Docker et montez-le dans un service :
Indice :
`bash# Créer un secret
echo "motdepasse_super_secret" | docker secret create db_password -
>
# Utiliser dans un service Docker Swarm
docker service create \
--name mon-app \
--secret db_password \
mon-image
>
# Dans le conteneur, le secret est disponible dans
# /run/secrets/db_password (fichier en RAM, non loggué)
`
>
Dans le code :
`pythonwith open("/run/secrets/db_password") as f:
password = f.read().strip()
`
Vérification : docker secret ls liste le secret créé. Le secret n'apparaît jamais dans les variables d'environnement (docker inspect).
Tâche 5 : Comprendre les Kubernetes Secrets
Créez un Kubernetes Secret et injectez-le dans un Pod :
Indice :
`yaml# secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
type: Opaque
stringData:
DB_PASSWORD: "motdepasse_secret"
DB_USER: "admin"
`
>
`yaml# pod.yaml
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: DB_PASSWORD
`
>
Attention : les Kubernetes Secrets sont encodés en base64, pas chiffrés. Utilisez Sealed Secrets ou Vault pour chiffrer au repos.
Vérification : kubectl create -f secret.yaml crée le secret. kubectl get secret db-credentials -o yaml montre les valeurs en base64.
🗂️ Mini-Projet
Configurez un hook Git pre-commit qui bloque tout commit contenant des secrets :
# Installer pre-commit
pip install pre-commit
# .pre-commit-config.yaml
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.0
hooks:
- id: gitleakspre-commit install
pre-commit run --all-filesCheckpoints :
gitleaksdétecte les secrets dansapp.py- Le code Python lit les secrets depuis
os.environ .envest dans.gitignoreet non commité- Le hook pre-commit bloque un commit avec un secret
- Vous connaissez la différence entre Docker Secrets et K8s Secrets