Aller au contenu
Sécurité medium

SOPS : chiffrer vos secrets dans Git

14 min de lecture

Vous devez stocker des credentials dans votre dépôt Git, mais les commiter en clair est impensable ? SOPS résout ce problème en chiffrant uniquement les valeurs de vos fichiers YAML, JSON ou ENV, tout en gardant les clés lisibles. Résultat : vos secrets sont protégés, mais vous pouvez toujours faire des diffs et des reviews sur la structure du fichier.

Contrairement à Ansible Vault qui chiffre le fichier entier (rendant les diffs impossibles), ou à HashiCorp Vault qui nécessite une infrastructure dédiée, SOPS offre un compromis pragmatique : chiffrement fort + workflow Git natif.

  • Installation : installer SOPS et age sur Linux, macOS et Windows
  • Chiffrement : chiffrer des fichiers YAML/JSON avec age ou KMS
  • Multi-clés : configurer plusieurs clés pour une équipe
  • Intégrations : Ansible, Kubernetes, CI/CD

SOPS (Secrets OPerationS) est un éditeur de fichiers chiffrés créé par Mozilla (maintenant maintenu par la communauté sous getsops/sops). Il supporte les formats YAML, JSON, ENV, INI et binaire.

CritèreSOPS + ageAnsible VaultHashiCorp Vault
StockageFichiers GitFichiers GitService centralisé
Diffs lisibles✅ Oui (clés visibles)❌ Non (blob chiffré)N/A
InfrastructureAucuneAucuneServeur + HA
Multi-clés✅ Natif❌ 1 mot de passe✅ Policies avancées
Cloud KMSAWS/GCP/Azure✅ Transit

SOPS ne chiffre que les valeurs, pas les clés. Voici un exemple :

database:
host: db.example.com
username: admin
password: super-secret-123

Avantage : vous pouvez reviewer les changements de structure (nouvelles clés, suppressions) sans avoir accès aux secrets.

SOPS nécessite un backend de chiffrement. Les options sont :

BackendUsage recommandéAvantage
ageÉquipes, projets personnelsSimple, pas de service
AWS KMSProjets AWSIAM intégré
GCP KMSProjets GCPIAM intégré
Azure Key VaultProjets AzureAzure AD intégré
HashiCorp VaultEntrepriseTransit encryption
Fenêtre de terminal
# Télécharger le binaire (v3.11.0)
curl -sLO https://github.com/getsops/sops/releases/download/v3.11.0/sops-v3.11.0.linux.amd64
chmod +x sops-v3.11.0.linux.amd64
sudo mv sops-v3.11.0.linux.amd64 /usr/local/bin/sops
# Vérifier
sops --version
# sops 3.11.0 (latest)
Fenêtre de terminal
# Télécharger age v1.3.0 (avec support post-quantum)
curl -sL https://github.com/FiloSottile/age/releases/download/v1.3.0/age-v1.3.0-linux-amd64.tar.gz | tar xz
sudo mv age/age age/age-keygen /usr/local/bin/
rm -rf age
# Vérifier
age --version
# v1.3.0
  1. Créer le répertoire pour les clés

    Fenêtre de terminal
    mkdir -p ~/.config/sops/age
  2. Générer une clé

    Fenêtre de terminal
    age-keygen -o ~/.config/sops/age/keys.txt
    # Sortie :
    # Public key: age1jk54cwqnaw2utp7uwk6nvehr6rsfwrwulhf8kk9lxcw9qy92cf0qfu6nam
  3. Sauvegarder la clé publique

    Notez la clé publique (age1...), vous en aurez besoin pour chiffrer. La clé privée est dans keys.txt.

Fenêtre de terminal
# Créer un fichier de test
cat > secrets.yaml << 'EOF'
database:
host: db.example.com
username: admin
password: super-secret-123
api:
token: sk-1234567890abcdef
EOF
# Chiffrer avec votre clé publique age
sops encrypt --age age1jk54cwqnaw2utp7uwk6nvehr6rsfwrwulhf8kk9lxcw9qy92cf0qfu6nam \
secrets.yaml > secrets.enc.yaml
# Vérifier le résultat
cat secrets.enc.yaml
Fenêtre de terminal
# SOPS cherche automatiquement dans ~/.config/sops/age/keys.txt
sops decrypt secrets.enc.yaml
# Ou spécifier le fichier de clé
SOPS_AGE_KEY_FILE=~/keys/ma-cle.txt sops decrypt secrets.enc.yaml
Fenêtre de terminal
# Ouvre le fichier déchiffré dans $EDITOR, re-chiffre à la sauvegarde
sops edit secrets.enc.yaml

Pour une équipe, vous voulez que plusieurs personnes puissent déchiffrer les secrets. SOPS supporte plusieurs clés dans un même fichier.

Fenêtre de terminal
# Chiffrer pour 2 personnes
sops encrypt \
--age age1abc...,age1def... \
secrets.yaml > secrets.enc.yaml

Chaque personne peut déchiffrer avec sa propre clé privée.

Pour éviter de spécifier les clés à chaque commande, créez .sops.yaml à la racine du projet :

.sops.yaml
creation_rules:
# Secrets de production : équipe ops + KMS
- path_regex: secrets/prod/.*\.yaml$
key_groups:
- age:
- age1abc... # Alice (ops)
- age1def... # Bob (ops)
kms:
- arn: arn:aws:kms:eu-west-1:123456:key/xxx
# Secrets de dev : équipe dev
- path_regex: secrets/dev/.*\.yaml$
age: age1ghi...,age1jkl...
# Par défaut : clé personnelle
- age: age1mno...

Avec cette configuration :

Fenêtre de terminal
# SOPS applique automatiquement les bonnes clés
sops encrypt secrets/prod/database.yaml > secrets/prod/database.enc.yaml

Pour les projets AWS, utilisez KMS pour bénéficier de l’intégration IAM.

  1. Créer une clé KMS

    Fenêtre de terminal
    aws kms create-key \
    --description "SOPS encryption key" \
    --tags TagKey=Purpose,TagValue=SOPS
    # Noter l'ARN : arn:aws:kms:eu-west-1:123456:key/xxx-xxx
  2. Chiffrer avec KMS

    Fenêtre de terminal
    sops encrypt \
    --kms arn:aws:kms:eu-west-1:123456:key/xxx-xxx \
    secrets.yaml > secrets.enc.yaml
  3. Déchiffrer (les credentials AWS sont utilisés automatiquement)

    Fenêtre de terminal
    sops decrypt secrets.enc.yaml

Vous pouvez utiliser plusieurs backends pour la redondance :

.sops.yaml
creation_rules:
- path_regex: .*\.yaml$
key_groups:
- age:
- age1abc... # Backup local
kms:
- arn: arn:aws:kms:eu-west-1:123456:key/xxx

Si KMS est indisponible, la clé age permet toujours de déchiffrer.

La collection community.sops permet de déchiffrer les fichiers SOPS directement dans vos playbooks.

  1. Installer la collection

    Fenêtre de terminal
    ansible-galaxy collection install community.sops
  2. Utiliser le lookup

    ---
    - name: Déployer avec secrets SOPS
    hosts: all
    tasks:
    - name: Lire les secrets
    ansible.builtin.debug:
    msg: "{{ lookup('community.sops.sops', 'secrets.enc.yaml') }}"
    - name: Utiliser une valeur spécifique
    ansible.builtin.debug:
    msg: "Password: {{ (lookup('community.sops.sops', 'secrets.enc.yaml') | from_yaml).database.password }}"
  3. Exporter la clé pour Ansible

    Fenêtre de terminal
    export SOPS_AGE_KEY_FILE=~/.config/sops/age/keys.txt
    ansible-playbook playbook.yml

L’opérateur sops-secrets-operator déchiffre automatiquement les SopsSecret en Secret Kubernetes.

apiVersion: isindir.github.com/v1alpha3
kind: SopsSecret
metadata:
name: my-secret
spec:
secretTemplates:
- name: my-k8s-secret
stringData:
username: ENC[AES256_GCM,data:...]
password: ENC[AES256_GCM,data:...]
name: Deploy
on: push
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install SOPS
run: |
curl -sLO https://github.com/getsops/sops/releases/download/v3.11.0/sops-v3.11.0.linux.amd64
chmod +x sops-v3.11.0.linux.amd64
sudo mv sops-v3.11.0.linux.amd64 /usr/local/bin/sops
- name: Decrypt secrets
env:
SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}
run: |
sops decrypt secrets.enc.yaml > secrets.yaml
ProblèmeCauseSolution
no such file: keys.txtChemin de clé incorrectVérifier SOPS_AGE_KEY_FILE ou créer ~/.config/sops/age/keys.txt
could not decryptClé privée non correspondanteVérifier que votre clé publique est dans le fichier chiffré
failed to create writer for recipient: pq pluginClé PQ age 1.3.0SOPS ne supporte pas les clés PQ, utilisez age1... standard
yaml: unmarshal errorsFormat invalideVérifier la syntaxe YAML avant chiffrement
MAC mismatchFichier corrompuRestaurer depuis Git
Fenêtre de terminal
# Voir qui peut déchiffrer
sops decrypt --show-all-keys secrets.enc.yaml 2>&1 | grep -E "age|kms"
Fenêtre de terminal
# Ajouter une clé à un fichier existant
sops updatekeys --add-age age1newkey... secrets.enc.yaml
# Retirer une clé
sops updatekeys --rm-age age1oldkey... secrets.enc.yaml
Fenêtre de terminal
# Re-chiffrer avec de nouvelles clés
sops rotate -i secrets.enc.yaml
  • Une clé par personne : chaque membre de l’équipe a sa propre clé age, ce qui facilite la révocation quand quelqu’un part
  • Sauvegarder les clés : stockez les clés privées dans un gestionnaire de mots de passe (perte de clé = secrets irrécupérables)
  • .sops.yaml versionné : committez ce fichier pour que toute l’équipe utilise les mêmes règles
  • KMS en production : combinez age (backup) + KMS (rotation automatique, audit)
  • Répertoireproject/
    • .sops.yaml Configuration des clés
    • Répertoiresecrets/
      • Répertoiredev/
        • database.enc.yaml
      • Répertoireprod/
        • database.enc.yaml
    • README.md Instructions pour l’équipe
  1. SOPS chiffre les valeurs, pas les clés : les diffs Git restent lisibles
  2. age est recommandé : simple, pas de service, compatible partout
  3. PGP est déprécié : migrez vers age pour les nouveaux projets
  4. age 1.3.0 post-quantum : non supporté par SOPS (janvier 2026), utilisez les clés standard
  5. Multi-clés natif : chaque membre de l’équipe a sa clé, révocation facile
  6. .sops.yaml : centralisez la configuration des clés dans le repo
  7. KMS pour la prod : audit, rotation automatique, intégration IAM

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.