Saltar a contenido

Sealed Secrets — sellar secretos

Cómo cifrar secretos para commitearlos en Git y que el controlador los des-selle en Secret de Kubernetes.

Sellar un secreto

  1. Instalar kubeseal (brew install kubeseal).
  2. Generar el Secret y sellarlo de una vez (sin escribir el valor en disco):
kubectl create secret generic <nombre> \
  --namespace <ns> \
  --from-literal=<key>="$VALOR" \
  --dry-run=client -o yaml \
  | kubeseal \
      --controller-name sealed-secrets \
      --controller-namespace kube-system \
      --format yaml \
  > clusters/luka/config/cert-manager/<nombre>-sealed.yaml
  1. Commitear el SealedSecret resultante (es seguro: va cifrado).
  2. El controlador lo des-sella en un Secret en <ns>.

Rotar la clave maestra

Rotar invalida todos los SealedSecret existentes: hay que re-sellarlos con la clave nueva. Procedimiento seguro:

  1. Hacer backup de la clave actual (ver sección siguiente).
  2. Borrar la clave y reiniciar (el controlador regenera una nueva):
kubectl -n kube-system delete secret -l sealedsecrets.bitnami.com/sealed-secrets-key
kubectl -n kube-system rollout restart deploy/sealed-secrets
  1. Re-sellar todos los SealedSecret del repo con la clave nueva (sección anterior) y commitearlos.

Backup / restore de la clave maestra

La clave privada está en el Secret con etiqueta sealedsecrets.bitnami.com/sealed-secrets-key en kube-system. Sin ella no se pueden descifrar los SealedSecret (imprescindible para DR).

Backup (fuera del repo, con permisos restrictivos):

mkdir -p ~/.sealed-secrets && chmod 700 ~/.sealed-secrets
kubectl -n kube-system get secret -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml > ~/.sealed-secrets/keys.yaml
chmod 600 ~/.sealed-secrets/keys.yaml

Restore:

kubectl apply -f ~/.sealed-secrets/keys.yaml
kubectl -n kube-system rollout restart deploy/sealed-secrets