Probando HashiCorp Vault en Kubernetes


vault

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.

Iniciar session con GitHub
Iniciar sesion con Google
  • Comentarios

    Online: 0

Por favor inicie sesión para poder escribir comentarios.

by Gabriel Garrido