Module 3 — Secrets & gestion d'accès

Coffres mdp, 2FA, comptes nominatifs, rotation tokens, SSO/OAuth scopes, .env, leak detection. Et les anti-patterns qu'on a tous fait.

🔑 Gestionnaire de mots de passe — non négociable

Aucune raison valable en 2026 de ne pas utiliser un gestionnaire de mots de passe. Coût : 3-5 €/mois. Bénéfice : élimination de 80 % des risques de compromission.

Options recommandées

OutilPrixAvantagesInconvénients
Dashlane3-5 €/moisUI propre, dark web monitoring, password health, VPN inclusPas auto-hébergeable
1Password3-5 €/moisRéférence pour les pros, partage équipe propre, intégrations CLIPas auto-hébergeable
BitwardenGratuit / 10 €/anOpen-source, auto-hébergeable (Vaultwarden), apps complètesUI moins polie
KeePass / KeePassXCGratuitLocal-first, total contrôle, OSSSync à gérer soi-même (Dropbox/Drive)

Règles d'usage

JAMAIS : post-it, fichier .txt, "envoyé en clair sur Slack"

Si vous voyez un collègue noter un mot de passe sur post-it ou l'envoyer sur Slack/Teams en clair, c'est rouge. Reformez immédiatement.

📲 2FA / MFA — partout où possible

Le 2FA (authentification à deux facteurs) ajoute une preuve de possession en plus du savoir (mot de passe). Même si un attaquant a votre password, sans le 2e facteur il n'entre pas.

Méthodes 2FA classées par sécurité

MéthodeSécuritéRemarque
SMS⭐ (faible)Vulnérable au SIM swap, OK en dernier recours mais à éviter
Email⭐ (faible)Si l'email est compromis, le 2FA aussi → cercle vicieux
TOTP (Google Auth, Authy, 1Password)⭐⭐⭐Standard, ok pour 95 % des cas
Push notif (Microsoft Auth, Duo)⭐⭐⭐Pratique mais vulnérable au MFA fatigue (spammer jusqu'à ce qu'on accepte)
Yubikey / clé FIDO2⭐⭐⭐⭐⭐Le top, résistant phishing. ~50€/clé, en avoir 2 (perte/casse)

Comptes à protéger en PRIORITÉ avec 2FA

  1. Email principal — racine de tous les reset password
  2. Gestionnaire de mdp
  3. Registrar de domaines (OVH, Cloudflare…)
  4. Hébergeur (Hetzner, Scaleway, AWS…)
  5. GitHub / GitLab
  6. Banque + outils de paiement
  7. SaaS critiques : Zoho, n8n, Mailjet, Stripe, etc.
⚠️
Sauvegarder les codes de secours

Tous les services 2FA fournissent 8-12 codes de secours à usage unique. Stockez-les dans votre coffre. Si vous perdez votre téléphone, ces codes sont votre seul moyen de récupérer.

👤 Comptes nominatifs — la règle d'or

Aucun compte technique partagé entre humains. Chaque personne a son compte avec son email pro et son 2FA.

Pourquoi ?

Anti-pattern fréquent : "compte webmaster"

Vous donnez à un prestataire externe (dev WordPress, agence SEO, freelance) l'accès via un compte webmaster@votre-domaine.com partagé avec vous. Cas vécu Ezway/SoftIAM (cf. mémoire).

Problèmes :

Solution propre : créer un compte presta-acme@votre-domaine.com nominatif pour ce prestataire, avec 2FA obligatoire et permissions limitées. Désactivation immédiate à la fin de la mission.

🌐 SSO et OAuth scopes

SSO — pour 10+ utilisateurs

À partir de 10-20 users, manager les comptes individuels devient lourd. Le Single Sign-On centralise l'auth : un seul login (Google Workspace / Microsoft Entra / Okta) qui donne accès à toutes les apps.

Bénéfices

OAuth scopes — least-privilege

Quand vous générez un token API (Zoho, Google, GitHub, Stripe…), vous choisissez un scope. Ne donnez QUE ce qui est strictement nécessaire.

# Anti-pattern : token Zoho avec full access
ZohoCRM.modules.ALL,ZohoCRM.settings.ALL,ZohoCRM.users.ALL

# Bon pattern : juste ce qu'il faut pour la fonction
ZohoCRM.modules.leads.READ
ZohoCRM.modules.deals.READ

# Si compromission : limites les dégâts à READ leads/deals

📦 Env vars, .env, et secrets en code

Le bon niveau de protection

De pire à mieux pour stocker un secret nécessaire à une app :

  1. Hardcodé dans le code source — visible par tout dev, commité dans git, leak quasi-certain
  2. Fichier config.json commité — pareil que ci-dessus
  3. ⚠️ Fichier .env gitignored — mieux, mais à protéger : chmod 600, ne JAMAIS commit, attention aux backups
  4. Variable d'environnement injectée au runtime (docker-compose, systemd EnvironmentFile, k8s Secret) — pas dans le code, géré par l'infra
  5. ✅✅ Vault dédié (HashiCorp Vault, AWS/GCP Secrets Manager, Zoho Connections, Doppler) — rotation centralisée, audit logs, accès granulaire par app

.env propre

# .gitignore — TOUJOURS
.env
.env.local
.env.production
*.env

# .env.example — committé, sans valeurs réelles
DATABASE_URL=postgresql://user:password@localhost:5432/db
MAILJET_API_KEY=
MAILJET_API_SECRET=
STRIPE_SECRET_KEY=

# .env (réel, non committé)
DATABASE_URL=postgresql://user:VRAI_PASS@db.example.com:5432/prod
MAILJET_API_KEY=abc...
MAILJET_API_SECRET=def...
STRIPE_SECRET_KEY=sk_live_xxx

Permissions fichier

# Le fichier .env ne doit être lisible QUE par son propriétaire
chmod 600 .env
ls -l .env
# -rw------- 1 francois francois 234 May 20 12:00 .env
.env dans un backup non chiffré = leak en attente

Si vous backupez naïvement /home/user/app/ vers un Drive, vous backupez aussi .env en clair. Soit excluez les .env du backup (et backupez-les séparément, chiffrés), soit chiffrez le backup entier (cf. module 4).

🔍 Leak detection — Trufflehog & Gitleaks

Tôt ou tard, quelqu'un commit un secret par accident (git add . && git commit -m "wip" avec un .env oublié). Les outils de leak detection scannent vos repos pour les détecter.

Trufflehog — scan d'un repo

docker run --rm -v "$PWD:/repo" trufflesecurity/trufflehog:latest git file:///repo

Gitleaks — pre-commit hook

# Installer
brew install gitleaks  # macOS
# ou : curl -sSfL https://raw.githubusercontent.com/gitleaks/gitleaks/master/install.sh | sh

# Hook pre-commit : empêche tout commit contenant un secret détecté
cat > .git/hooks/pre-commit << 'EOF'
#!/bin/sh
gitleaks protect --staged --verbose --no-banner
EOF
chmod +x .git/hooks/pre-commit

Action GitHub — scan continu

Activez GitHub Secret Scanning sur tous vos repos (gratuit sur les repos publics, payant sur les privés via GitHub Advanced Security). Détecte automatiquement les leak de tokens connus (AWS, Stripe, GitHub, etc.) et alerte instantanément.

⚠️
Si un secret a leaké : RÉVOQUER, pas effacer

Vous découvrez qu'un token Stripe est dans l'historique git d'un repo. Réécrire l'historique ne suffit pas — quelqu'un a peut-être déjà cloné. La SEULE bonne réaction : révoquer le token immédiatement côté Stripe, en générer un nouveau, l'injecter via vault, et faire un post-mortem (comment c'est arrivé, comment éviter).

🔄 Rotation des secrets

Même sans incident, les secrets doivent être rotatés régulièrement. Plus la rotation est fréquente, moins une compromission silencieuse a d'impact.

Fréquence recommandée

SecretRotation
Master password coffre1× par an + après tout incident
Clés SSH dev1× par an + à chaque départ d'équipe
Tokens API SaaS (Stripe, Zoho, Mailjet)6-12 mois
Database passwords6 mois
Certificats TLSAuto (Let's Encrypt = tous les 60-90 jours)
JWT signing secret app6 mois

Un vault rend la rotation indolore : changez la valeur centralement, les services reprennent automatiquement. Sans vault, vous devez redéployer chaque app après chaque rotation — d'où la tentation de ne jamais rotater.

🔗 Ressources

📋 Quiz de validation

← Module 2 — Nginx/TLS Module 4 — Backups →