Utilizando o External Secrets Operator com o Vault
Neste documento você aprenderá como utilizar o ESO (External Secrets Operator) em conjunto com o Vault, o gerenciador de segredos da HashiCorp, em um cluster Kubernetes local configurado com Kind.
Criação do cluster
Para esse exemplo, utilizaremos um cluster Kubernetes local criado com o Kind. Com a seguinte configuração:
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
nodes:
- role: control-plane
- role: worker
- role: worker
Salve a configuração acima em um arquivo e execute o comando abaixo:
kind create cluster --config <arquivo>
Adicionando Vault ao cluster
Podemos utilizar o Helm para instalar o Vault no cluster.
helm repo add hashicorp https://helm.releases.hashicorp.com
helm install vault hashicorp/vault
Para verificar os recursos criados, execute:
kubectl get all | grep vault
Configurando o Vault
Antes de adicionar o ESO, é necessário configurar o Vault. Um maneira simples de realizar
esse processo é expondo a porta do service/Vault
, utilizando o comando abaixo. Dessa forma, é possível
acessar sua interface web em: http://localhost:8200
.
kubectl port-forward svc/vault --address 0.0.0.0 8200:8200
Preencha os campos Key shares e Key threshold com o valor 1 e clique em Initialize.
Salve a chave gerada e o initial token, pois serão necessárias para desbloquear o Vault. Clique em Continue.
Utilize a key1
para desbloquear o Vault e o root token
para logar.
Engine de Segredos
Na interface web do Vault, clique em Secrets Engines
na barra lateral e em seguida em Enable new engine
.
Selecione a engine de segredos do tipo Key/Value
KV e clique em Enable engine.
Com a engine habilitada, crique em Create secret
e crie um segredo de chave segredo1
com um valor arbitrário.
No campo de Path
insira tutorial/
e clique em Save.
Adicionando o ESO ao cluster
Utilize o helm para instalar o ESO no cluster.
helm repo add external-secrets https://charts.external-secrets.io
helm install external-secrets \
external-secrets/external-secrets \
-n external-secrets \
--create-namespace
Para verificar os recursos criados, execute:
kubectl -n external-secrets get all
Criando um ClusterSecretStore
O ClusterSecretStore é responsável por armazenar as configurações de acesso ao Vault. Para que ele tenha acesso ao Vault, é necessário criar um secret com o token de acesso.
kubectl create secret generic vault-policy-token --from-literal=token=<token>
Para criar o ClusterSecretStore, utilize o arquivo abaixo:
O atributo server precisa ser preenchido com o ClusterIP do Vault.
utilize o comando kubectl get svc vault
para obter o ClusterIP.
apiVersion: external-secrets.io/v1beta1
kind: ClusterSecretStore
metadata:
name: vault-backend
spec:
provider:
vault:
server: "http://<ClusterIP>:8200" # Endereço do ClusterIP
path: kv # Path do segredo criado no Vault
version: "v2"
auth:
tokenSecretRef:
name: "vault-policy-token" # Nome do secret que contém o token
key: "token" # Chave do token no secret
Para criar o recurso, salve a configuração em um arquivo e execute.
kubectl apply -f <arquivo>
Criando um ExternalSecret
O ExternalSecret é responsável por criar a secret no cluster Kubernetes com o segredo do Vault.
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
name: external-secrets
spec:
refreshInterval: 10s # Intervalo de atualização do segredo
secretStoreRef:
name: vault-backend
kind: ClusterSecretStore
target:
name: eso-secret # Nome da secret que será criada
creationPolicy: Owner
data:
- secretKey: segredo1 # Nome da chave do segredo
remoteRef:
key: kv/tutorial
property: segredo1
Para criar o recurso, salve a configuração em um arquivo e execute.
kubectl apply -f <arquivo>
Após a criação do ExternalSecret, a secret pode ser verificada utilizando o comando:
kubectl get secret
Para verificar o conteúdo da secret, utilize o comando:
kubectl get secret eso-secret -o yaml
copie o valor do atributo data.segredo1
no yaml gerado e decodifique utilizando o comando:
echo "<valor-copiado>" | base64 -d
Atualize o segredo no Vault e verifique se a secret foi atualizada no cluster Kubernetes.