Stocker des secrets dans Git, tout le monde le dit : c’est une mauvaise pratique. Mais stocker ses secrets dans un vault et ses fichiers de config dans Git, c’est deux sources de vérité qui finissent par dériver.
sops résout ça : on commit ses secrets chiffrés avec ses fichiers
de config. Un seul dépôt, une seule source de vérité. Au déploiement,
le secret est déchiffré à la volée.
Setup avec age
# Générer une clé age (une ligne)
age-keygen -o ~/.config/sops/age/keys.txt
# Récupérer la clé publique
age-keygen -y ~/.config/sops/age/keys.txt
# → age1ql3z7hjy54p3w6d...
La config minimale .sops.yaml à la racine du dépôt :
creation_rules:
- age: age1ql3z7hjy54p3w6d...
Chiffrer un fichier
sops -e config.yaml > config.enc.yaml
sops chiffre uniquement les valeurs, pas les clés. Résultat :
# config.enc.yaml
database:
host: ENC[AES256_GCM,data:...]
password: ENC[AES256_GCM,data:...]
port: "5432"
Les clés YAML (host, password, port) restent en clair. Seules
les valeurs sensibles sont chiffrées. La structure du fichier survit,
le diff Git reste lisible.
Déchiffrer
sops -d config.enc.yaml
Pas besoin de préciser la clé : sops lit .sops.yaml, trouve la
règle qui matche le fichier, utilise la clé age correspondante.
En CI
# La clé privée age vient d'une variable CI
echo "$AGE_PRIVATE_KEY" > /tmp/key.txt
export SOPS_AGE_KEY_FILE=/tmp/key.txt
sops -d secrets.enc.yaml > secrets.yaml
Le piège
sops modifie le fichier en place. Si on fait sops -e config.yaml
(pas de -o), le fichier est chiffré sur place. Les clés YAML restent
visibles, mais le fichier n’est plus du YAML valide : ArgoCD ou tout
autre outil qui lit du YAML plante.
Toujours utiliser -o pour créer un fichier séparé (config.enc.yaml),
ou versionner le fichier original et le chiffrer seulement dans le
pipeline CI.
Cheatsheet sops
# Chiffrer (sortie séparée)
sops -e config.yaml > config.enc.yaml
# Déchiffrer
sops -d config.enc.yaml > config.yaml
# Éditer en place (déchiffre, ouvre $EDITOR, rechiffre)
sops config.enc.yaml
# Chiffrer avec plusieurs clés age
sops -e --age AGE_KEY1,AGE_KEY2 config.yaml > config.enc.yaml
# Tourner les clés (rechiffrer avec les clés actuelles)
sops updatekeys config.enc.yaml
# Vérifier quelles clés peuvent déchiffrer
sops --list-age-keys