Probando HashiCorp Vault en Kubernetes
Introducción
Vault asegura, almacena y controla de manera estricta el acceso a tokens, contraseñas, certificados, claves API y otros secretos en la informática moderna. Esto significa que podés almacenar de forma segura todos los secretos de tu aplicación en Vault sin preocuparte más por cómo almacenarlos, proporcionarlos y utilizarlos. Vamos a ver cómo instalar Vault en un clúster de Kubernetes en ejecución, y cómo guardar y leer un secreto por parte de nuestra aplicación. En esta guía, usaremos Vault versión 1.1.1 con secretos dinámicos, lo que significa que cada pod tendrá un secreto diferente, y ese secreto expirará cuando se elimine el pod.
Antes de comenzar, necesitás los binarios cliente de Consul y Vault, así como Minikube o cualquier clúster en funcionamiento. Los archivos utilizados se encuentran en este repo.
Este es el primer artículo de dos en la serie Uso de Vault en Kubernetes.
Preparando el clúster
Primero, iniciamos Minikube y validamos que podemos acceder al clúster con minikube start
y kubectl get nodes
. También puede ser útil iniciar el dashboard de Minikube con minikube dashboard
.
$ minikube start
$ kubectl get nodes
Creando certificados para Consul y Vault
Vault necesita un backend para almacenar datos, que puede ser Consul, etcd, Postgres, y muchos otros. Lo primero que vamos a hacer es crear un certificado para que Consul y Vault se comuniquen de forma segura.
$ consul tls ca create
$ consul tls cert create -server -additional-dnsname server.dc1.cluster.local
$ consul tls cert create -client
Consul
Los siguientes pasos son crear una clave de cifrado para el clúster de Consul y luego crear los recursos de Kubernetes asociados.
$ export GOSSIP_ENCRYPTION_KEY=$(consul keygen)
$ kubectl create secret generic consul \
--from-literal="gossip-encryption-key=${GOSSIP_ENCRYPTION_KEY}" \
--from-file=certs/consul-agent-ca.pem \
--from-file=certs/dc1-server-consul-0.pem \
--from-file=certs/dc1-server-consul-0-key.pem
$ kubectl create configmap consul --from-file=consul/config.json
$ kubectl create -f consul/01-service.yaml
$ kubectl create -f consul/02-statefulset.yaml
$ kubectl port-forward consul-1 8500:8500
$ consul members
Vault
Con Consul en funcionamiento, ahora podemos desplegar Vault, crear los recursos necesarios en Kubernetes y luego inicializar y desbloquear Vault.
$ kubectl create secret generic vault \
--from-file=certs/consul-agent-ca.pem \
--from-file=certs/dc1-client-consul-0.pem \
--from-file=certs/dc1-client-consul-0-key.pem
$ kubectl create configmap vault --from-file=vault/config.json
$ kubectl create -f vault/01-service.yaml
$ kubectl create -f vault/02-deployment.yaml
$ kubectl port-forward vault-6d78b6df7c-z7chq 8200:8200
$ export VAULT_ADDR=https://127.0.0.1:8200
$ export VAULT_CACERT="certs/consul-agent-ca.pem"
$ vault operator init -key-shares=3 -key-threshold=3
Luego de inicializar, debemos desbloquear Vault:
$ vault operator unseal
Iniciar sesión con el token raíz inicial:
$ vault login
Habilitamos el camino /secrets
con el plugin kv
y luego probamos guardar y leer un secreto:
$ vault secrets enable -path=secrets kv
$ vault kv put secrets/hello foo=world
$ vault kv get secrets/hello
Conclusión
Como se puede ver, lleva un tiempo configurar un servidor Vault, pero me gusta mucho el patrón que permite para las aplicaciones que lo utilizan. En el próximo artículo, veremos cómo desbloquearlo automáticamente con Kubernetes y cómo montar los secretos automáticamente en nuestros pods para que nuestras aplicaciones puedan usarlos.
Este artículo fue fuertemente inspirado por este y este.
Errata
Si encontrás algún error o tenés alguna sugerencia, por favor enviame un mensaje para que lo corrija.
No tienes cuenta? Regístrate aqui
Ya registrado? Iniciar sesión a tu cuenta ahora.
-
Comentarios
Online: 0
Por favor inicie sesión para poder escribir comentarios.