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 :
- Générer le nouveau secret et l'activer en parallèle de l'ancien (les deux sont valides)
- Mettre à jour les consommateurs pour utiliser le nouveau secret
- 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 |