3 min read | by Jordi Prats
The External Secrets Operator can be configured to retrieve secrets from Vault, to demonstrate this we are going to use a test vault running on Kubernetes.
First, we'll need to setup vault, we are going to need a token the allow the External Secrets Operator to retrieve secrets, for this demo we are going to use a helm chart for a test vault where the token is test.
Installing this test vault doesn't take much:
helm repo add testvault https://pet2cattle.github.io/helm-testvault/
helm install testvault testvault/testvault -n testvault --create-namespace
We can use the vaultcli Pod to create the secret we want to store on vault, in this case is going to be s3cr3t:
kubectl exec -it testvault-vaultcli -n testvault -- sh -c \
"echo test | vault login -; vault kv put secret/demo secret=s3cr3t; vault kv get secret/demo"
To install the External Secrets Operator doesn't take much either since we don't need to configure much at the chart level:
helm install external-secrets \
external-secrets/external-secrets \
-n testvault \
--set installCRDs=true
To configure the External Secrets Operator to connect to Vault we'll need to create a Secret with the vault's token and a SecretStore object pointing to Vault:
kubectl apply -f - <<"EOF"
apiVersion: v1
kind: Secret
metadata:
name: vault-token
data:
token: dGVzdA==
---
apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
name: vault-backend
spec:
provider:
vault:
server: "http://testvault.testvault:80"
path: "secret"
version: "v2"
auth:
tokenSecretRef:
name: "vault-token"
key: "token"
EOF
As soon as this SecretStore is available, we can now create an ExternalSecret referencing the SecretStore to retrieve the actual secret:
kubectl apply -f - <<"EOF"
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: vault-example
spec:
refreshInterval: "15s"
secretStoreRef:
name: vault-backend
kind: SecretStore
data:
- secretKey: demo
remoteRef:
key: secret/demo
property: secret
EOF
This ExternalSecret is going to create a Kubernetes Secret containing the data it retrieves from Vault:
$ kubectl get externalsecrets
NAME STORE REFRESH INTERVAL STATUS READY
externalsecret.external-secrets.io/vault-example vault-backend 15s SecretSynced True
NAME AGE STATUS READY
secretstore.external-secrets.io/vault-backend 13s Valid True
$ kubectl get secret vault-example -o yaml
apiVersion: v1
data:
demo: czNjcjN0
immutable: false
kind: Secret
metadata:
(...)
type: Opaque
$ echo "czNjcjN0" | base64 -d
s3cr3t
Posted on 18/10/2022