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