KSOPS est un plugin Kustomize qui permet de déchiffrer des secrets Kubernetes chiffrés avec SOPS
Ces outils ont l’énorme avantage de permettre le stockage de secrets Kubernetes (chiffrés) directement dans le dépôt de code.
Prérequis
SOPS et Kustomize doivent être installés :
- SOPS : https://github.com/mozilla/sops
- Kustomize : https://github.com/kubernetes-sigs/kustomize
Installation de KSOPS
Site officiel de KSOPS : https://github.com/viaduct-ai/kustomize-sops
Si elle n’existe pas déjà, définir la variable XDG_CONFIG_HOME
:
echo "export XDG_CONFIG_HOME=\$HOME/.config" >> $HOME/.bashrc
Installer KSOPS
curl -s https://raw.githubusercontent.com/viaduct-ai/kustomize-sops/master/scripts/install-ksops-archive.sh | bash
Le script vient installer le plugin KSOPS pour Kustomize dans le dossier ~/.config/kustomize/plugin
:
$ tree ~/.config/kustomize
/home/me/.config/kustomize/plugin/
└── viaduct.ai
└── v1
└── ksops
├── ksops
├── LICENSE
└── README.md
Utilisation de SOPS, Kustomize et KSOPS
Déclaration de la clé de chiffrement à utiliser
Pour cet exemple nous allons créer une clé gpg pour chiffrer/déchiffrer, mais d’autres types de clés (GPG KMA, AWS KMS, …) sont également utilisables.
Dans l’overlay Kustomize, créer le fichier .sops.yaml
:
creation_rules:
- encrypted_regex: "^(data|stringData)$"
# Specify kms/pgp/etc encryption key
# This tutorial uses a local PGP key for encryption.
# DO NOT USE IN PRODUCTION ENV
pgp: "FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4"
# Optionally you can configure to use a providers key store
# kms: XXXXXX
# gcp_kms: XXXXXX
L’élément pgp
permet d’indiquer l’identifiant d’une clé GPG locale. On peut récupérer cet identifiant à l’aide de la commande :
gpg --list-keys
Chiffrement des secrets avec SOPS
Dans l’overlay Kustomize, créer le secret Kubernetes :
cat <<EOF > secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: wit-secret
annotations:
kustomize.config.k8s.io/needs-hash: "true"
type: Opaque
data:
username: d2l0
password: MTIzNDU2Nzg=
EOF
Chiffrer le secret avec SOPS :
sops -e secret.yaml > secret.enc.yaml
Le fichier généré ressemble à ça :
cat secret.enc.yaml
apiVersion: v1
kind: Secret
metadata:
name: wit-secret
annotations:
kustomize.config.k8s.io/needs-hash: "true"
type: Opaque
data:
username: ENC[AES256_GCM,data:xuJbPw==,iv:ce/ItX4Smcm9VNRAlgoTFEkClaxDe/lnPwP40P/cFXU=,tag:q69fwFE6F1brGPfweJ8Iiw==,type:str]
password: ENC[AES256_GCM,data:Sodl0wmI8oCblJAt,iv:+VFbeA/GCa4HpPZZ07WqFABhkJU2bMvvsIFmrcAEN5k=,tag:+dyJ8iN781omGK3XY+WWSg==,type:str]
sops:
kms: []
gcp_kms: []
azure_kv: []
hc_vault: []
age: []
lastmodified: "2022-03-30T14:28:35Z"
mac: ENC[AES256_GCM,data:Z5UgjrFTwL5vxd6RMZ1+U9d3t/t95YwKLomIFnSqBlmS8ciXq1x4sVgFzgtSTAb8xdS31LhKxJT7rK+qJLNGKja8LLjN2QbPbgE+cZd20aKdyUjNmgN67EOcGtW5OKmDMgMoUX2JcoOM2rp1k3ovs7ZPfaNCrs/55ZqzjzVxaDY=,iv:p2jaOdEfnl0mmNki3xibfRDFLRdTeKz9yBoVEczUcpk=,tag:W6GUskSnJgbCfY+ssWATYw==,type:str]
pgp:
- created_at: "2022-03-30T14:28:35Z"
enc: |-
-----BEGIN PGP MESSAGE-----
wcBMA+Wdz3Sm3y+DAQgAXaSGZkqCqZLSsys7Y4inzLAUNz8oU3t7HKKIt75WKLFS
PJgssJli9aYFXDKeATyGO2tATGtSlXmlToZD20fyIXeHj1M7I/qhg+3wYoIiVY//
s7pmmqsRF4FmjHwuLYzYp+9WMUHfTyYjAubh7VV/pWPKjvSuRwy2H0uxcU8Gqe2u
eXxgi6FWyWF4RJK9fl3tWqPi6I5d1mf947PbmBTOSSTMd7xAVvItW1iXEU4VQe2c
ZxOjzXDK8zXYzPbcboNIU/rIiTNetpFA6XuhZr5bLuM9LJvwKlulUVyWDnwYpzCj
7eoIPmy7eG2HRUeyNzsi0zrxZ9+0ggXoniuqxzaRbdLmAbnLUimQiWz2fq8d9+RQ
0x9A/1HIArJ3NYpoekUBcldpTBzJ+rfgqnHHJBuer5v+uswjHQnynD8DeVje9SB5
u+RJyS+XfbwMyvtPU7gO7+kH4utV4HsA
=SCIW
-----END PGP MESSAGE-----
fp: FBC7B9E2A4F9289AC0C1D4843D16CEE4A27381B4
encrypted_regex: ^(data|stringData)$
version: 3.7.1
Si besoin, le secret peut être déchiffré avec SOPS :
sops -d secret.enc.yaml
Déchiffrement des secrets avec Kustomize et KSOPS
Dans l’overlay Kustomize, créer un fichier pour le generator KSOPS :
cat <<EOF > ksops-secret-generator.yaml
apiVersion: viaduct.ai/v1
kind: ksops
metadata:
name: ksops-secret-generator
files:
- secret.enc.yaml
EOF
Dans le fichier kustomization.yaml
ajouter les lignes suivantes pour déclarer le generator créé précédemment :
generators:
- ksops-secret-generator.yaml
Générer le manifeste yaml à l’aide de kustomize :
kustomize build --enable-alpha-plugins .
Le secret apparaît bien déchiffré :
...
---
apiVersion: v1
data:
password: MTIzNDU2Nzg=
username: d2l0
kind: Secret
metadata:
labels:
app.kubernetes.io/name: wit-stage
name: wit-secret-stage-h98d6bhcm8
type: Opaque
---
...