Aller au contenu

Gestion des secrets

Stocker, distribuer et faire tourner les secrets de manière sécurisée dans les systèmes et les pipelines CI/CD.


Le problème des secrets

Un secret est toute donnée qui confere un accès privilegie : mot de passe, clé API, certificat, token OAuth, clé de chiffrement.

Ou se cachent les secrets

Emplacement Risque Fréquence observee
Code source (commits, historique) Très élevé — expose indéfiniment Très courant
Fichiers .env en clair Élevé — synchronisés par erreur Courant
Variables CI/CD en clair Moyen — visible dans les logs si mal configuré Frequent
Notes, wikis, Slack Élevé — pas de TTL, partage incontrole Sous-estime
Images Docker layers Élevé — extractible avec docker history Frequent

Les outils de scanning comme TruffleHog, GitLeaks ou detect-secrets permettent de détecter les secrets commites dans un dépôt Git, y compris dans l'historique.

Secret commite = compromis même après revert

Un git revert ou un git reset ne supprimé pas un secret de l'historique Git. Il reste accessible via git log, les forks, les caches GitHub/GitLab, les backups. La seule action valide après un secret commite est la rotation immédiate du secret, pas sa suppression de l'historique.


Vault HashiCorp

HashiCorp Vault est la référence open source pour la gestion centralisee des secrets. Il offre un plan de contrôle unifie avec authentification, politiques d'accès et audit.

Architecture

  • Secrets engines : backends de stockage des secrets (KV, PKI, database, AWS, SSH...)
  • Auth methods : mécanismes d'authentification (AppRole, Kubernetes, LDAP, JWT...)
  • Policies : règles HCL définissant qui peut lire/écrire quoi
  • Audit devices : journalisation complète de chaque accès

Flux d'accès applicatif

sequenceDiagram
    participant App as Application
    participant Vault as Vault
    participant Backend as Secret Backend

    App->>Vault: Authentification (AppRole / K8s SA)
    Vault-->>App: Token temporaire
    App->>Vault: GET /secret/data/myapp/db
    Vault->>Backend: Lecture / generation
    Backend-->>Vault: Valeur du secret
    Vault-->>App: Secret + lease TTL
    Note over App,Vault: App renouvelle ou re-demande avant expiration

Bonnes pratiques Vault

  • Utiliser des dynamic secrets quand possible (credentials DB générés à la demande, TTL court)
  • Définir des politiques granulaires par application et environnement
  • Activer le seal/unseal avec Shamir Secret Sharing ou auto-unseal (AWS KMS, Azure Key Vault)
  • Superviser l'audit log pour détecter les accès anormaux

SOPS et sealed-secrets

Pour les organisations qui souhaitent stocker des secrets chiffres dans Git, deux approches existent.

SOPS (Secrets Opérations)

SOPS chiffre les valeurs d'un fichier YAML/JSON/ENV tout en laissant les clés en clair. Il supporte AWS KMS, GCP KMS, Azure Key Vault et âge/GPG comme backends de chiffrement.

  • Le fichier chiffre peut être versionne dans Git
  • Le dechiffrement nécessité l'accès au KMS ou à la clé privee
  • Compatible avec Terraform, Helm, Ansible

Sealed Secrets (Kubernetes)

Sealed Secrets (Bitnami) chiffre les Kubernetes Secrets avec la clé publique du contrôleur en cluster. Le secret chiffre (SealedSecret) peut être commite dans Git. Seul le contrôleur en cluster peut le dechiffrer.

Alternative : External Secrets Operator qui synchronisé les secrets depuis Vault, AWS Secrets Manager, Azure Key Vault directement dans des Kubernetes Secrets.


Rotation automatique

Pourquoi faire tourner les secrets

  • Limite la fenêtre d'exploitation en cas de fuite
  • Oblige a tester les mécanismes de rotation (evite les surprises en cas d'urgence)
  • Requis par de nombreux frameworks de conformité (ISO 27001, SOC 2, PCI DSS)

Stratégie double-write

La rotation sans coupure de service suit un pattern en 3 étapes :

  1. Générer le nouveau secret et l'activer en parallèle de l'ancien (les deux sont valides)
  2. Mettre à jour les consommateurs pour utiliser le nouveau secret
  3. Revoquer l'ancien secret après confirmation que tous les consommateurs ont migré

Injection dans les pipelines CI/CD

Plateforme Mécanisme Niveau de sécurité
GitHub Actions Secrets chiffres, masques dans les logs Bon
GitLab CI Variables protegees / masquees Bon
Gitea Actions Variables secrets Correct
Vault + CI Injection dynamique via OIDC/AppRole Excellent

L'injection dynamique depuis Vault via OIDC est la meilleure pratique : le pipeline s'authentifie avec son identité OIDC, obtient un token Vault temporaire, reçoit les secrets avec TTL court. Aucun secret long-lived n'est stocke dans la plateforme CI.


Anti-patterns courants

Anti-pattern Risque Correction
Secret en variable d'environnement système persistante Lisible par tout processus du système Injection à la demande, TTL court
Rotation manuelle sans test Coupure de service lors de la rotation Automatiser et tester régulièrement
Secret partage entre environnements Compromission prod depuis dev Secrets distincts par environnement
Token admin utilisé par une application Accès excessif, pas de traçabilité AppRole / service account dédié
Logs applicatifs contenant des secrets Exposition dans les outils d'observabilité Masquage, scrubbing des logs