Je me souviens de la première fois où j'ai trouvé une clé API exposée dans un dépôt public : ça m'a pris quelques secondes de choc, puis une montée d'adrénaline en me disant « il faut agir tout de suite ». Depuis, j'ai développé une méthode simple en cinq étapes que j'applique systématiquement pour repérer, corriger et limiter les dégâts liés à une fuite d'API key dans un dépôt Git public. Dans cet article, je partage cette méthode, des outils concrets et des commandes pratiques pour que vous puissiez réagir rapidement et en sécurité.

Pourquoi une API key exposée est urgente

Une clé API exposée, c'est comme laisser les clefs de la maison sous le paillasson. Selon le service concerné (cloud provider, service de paiement, SMTP, etc.), un acteur malveillant peut :

  • utiliser des ressources payantes à votre place (ex. instances cloud) ;
  • accéder à des données sensibles ;
  • contourner des contrôles d'accès en se faisant passer pour votre application ;
  • compromettre l'intégrité de vos systèmes.
  • C'est pour ça que je traite ces fuites comme des incidents de sécurité nécessitant une action immédiate et structurée.

    Étape 1 : détecter la fuite (recherche rapide)

    Avant toute chose, il faut confirmer la fuite et évaluer sa portée. Voici ce que je fais en priorité :

  • Vérifier l'historique Git du dépôt (tous les commits) avec des outils spécialisés comme truffleHog, GitGuardian ou gitleaks.
  • Rechercher manuellement via grep pour des motifs courants : clés commençant par AKIA (AWS), sk_live_ (Stripe), xoxp- (Slack), etc.
  • Exemples de commandes utiles :

  • gitleaks run --path=. --report-format=json --report-path=leaks.json
  • trufflehog --json https://github.com/mon-compte/mon-repo.git > truffle.json
  • Ces outils scannent l'historique et non seulement la tête du dépôt : c'est crucial car la clé peut avoir été commise puis supprimée, mais elle reste dans l'historique.

    Étape 2 : évaluer l'impact

    Une fois la clé identifiée, je me pose ces questions :

  • Quel service est concerné (AWS, GCP, Azure, Stripe, SendGrid...) ?
  • La clé a-t-elle été utilisée récemment ? (consulter les logs du service)
  • La clé a-t-elle des privilèges élevés ? (admin, pouvoir de création de ressources, paiements)
  • Je consulte les logs du fournisseur : par exemple, pour AWS, CloudTrail permet de savoir si la clé a servi. Pour Stripe, on peut voir les appels API récents. Si je constate des appels suspects, je le signale immédiatement à l'équipe de sécurité et aux parties prenantes.

    Étape 3 : révoquer ou régénérer la clé immédiatement

    Ne perdez pas de temps. La première action que j'exécute est la révocation ou la rotation de la clé compromise :

  • Accédez à la console du service concerné et révoquez la clé. Ensuite, créez une nouvelle clé si nécessaire.
  • Si vous ne pouvez pas révoquer directement (ex. clé partagée), contactez le support du service pour une assistance d'urgence.
  • Ce geste empêche toute personne disposant de la clé exposée d'accéder davantage à vos ressources. La plupart des fournisseurs proposent une rotation facile et des logs pour confirmer l'arrêt des usages malveillants.

    Étape 4 : nettoyer l'historique Git et déployer des correctifs

    Supprimer la clé du commit courant ne suffit pas : elle reste dans l'historique. Voici ma recette pour un nettoyage propre :

  • Utiliser git filter-repo (recommandé, rapide et sûr) ou BFG Repo-Cleaner pour retirer la clé des commits historiques. Évitez git-filter-branch, obsolète et plus compliqué.
  • Exemple (avec git filter-repo) :

  • git clone --mirror https://github.com/mon-org/mon-repo.git
  • cd mon-repo.git
  • git filter-repo --replace-text replacements.txt
  • Dans replacements.txt, vous pouvez indiquer la chaîne exacte à remplacer par une valeur vide ou un placeholder. Après nettoyage :

  • git push --force --all
  • git push --force --tags
  • Attention : le forçage modifie l'historique partagé. Prévenez votre équipe, coordonnez les plans de synchronisation et fournissez des instructions pour que chacun refasse un clone propre ou réinitialise ses branches locales.

    Étape 5 : prévenir et durcir pour éviter une récurrence

    Après l'incident, j'instaure systématiquement des mesures préventives :

  • Mettre en place des scanners automatiques dans le CI (ex. gitleaks, truffleHog, GitGuardian) pour blocker les commits contenant des secrets.
  • Configurer des hooks Git côté client et serveur (pre-commit, pre-receive) qui vérifient la présence de secrets.
  • Utiliser un gestionnaire de secrets centralisé (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault, GitHub Secrets) plutôt que des fichiers commis.
  • Appliquer le principe du moindre privilège : les clés doivent avoir des permissions minimales et une durée de vie courte.
  • Éduquer l'équipe avec des formations rapides et des checklists : comment ne pas commettre de secrets, comment utiliser les variables d'environnement, etc.
  • En pratique, intégrer un check dans votre pipeline CI est, selon moi, la meilleure assurance : si un commit tente d'introduire une clé, la pipeline échoue et le commit n'est pas fusionné.

    Outils que j'utilise et recommande

    OutilUtilité
    gitleaksScan local et CI pour détecter secrets dans l'historique
    truffleHogRecherche profonde d'empreintes de secrets dans commits
    GitGuardianSolution SaaS avec alertes et intégrations pour dépôts publics/privés
    git filter-repo / BFGNettoyage de l'historique Git
    HashiCorp Vault / AWS Secrets ManagerGestion centralisée et sécurisée des secrets

    Je tiens à insister sur deux points pratiques issus de mon expérience :

  • La coordination d'équipe lors d'un git push --force est souvent sous-estimée : documentez la marche à suivre pour récupérer un historique propre (re-cloner, reset --hard, etc.).
  • Même après rotation et nettoyage, surveillez activement les logs des services concernés pendant plusieurs semaines pour détecter des tentatives tardives d'utilisation.
  • Enfin, en cas d'exposition publique (GitHub, GitLab), signalez l'incident aux propriétaires de la plateforme si vous voyez que la clé est exploitée par des tiers ou si votre dépôt a été forké/clone massivement. Certaines plateformes peuvent aider à bloquer les forks ou supprimer des copies litigieuses.

    Si vous voulez, je peux vous fournir un petit script d'exemple pour automatiser un scan initial avec gitleaks ou une checklist imprimable à partager avec votre équipe. Dites-moi quel environnement vous utilisez (GitHub, GitLab, Bitbucket, AWS, Azure...) et j'adapte les commandes.