O que é o Vault e pra que serve?
Vault é uma ferramenta desenvolvida pela HashiCorp, essa ferramenta tem como objetivo fazer um armazenamento inteligente de “segredos”, podem ser eles, chaves de ssh, dados de acesso a um banco e dados, api tokens e assim por diante.
minikube com vault e consul instalados em um mesmo namespace.
-
Criando um namespace chamado postgres.
$ kubectl create namespace postgres
-
Verificando seus pods.
$ kubectl get pods -n postgres
-
Criando um pod com base no postgre.yml.
$ kubectl apply -f postgre.yml -n postgres
-
Fazendo login com o usuario root do vault.
$ kubectl exec -ti vault-0 -n vault -- vault login
-
Dizendo ao vault que a secret será um database.
$ kubectl exec -ti vault-0 -n vault -- vault secrets enable database
-
Checando pods do vault e postgress.
$ kubectl get pods -n vault $ kubectl get pods -n postgres
-
Acessando o postgres.
$ kubectl exec -it -n postgres $(kubectl get pods -n postgres --selector "app=postgres" -o jsonpath="{.items[0].metadata.name}") -c postgres -- bash -c 'PGPASSWORD=password psql -U postgres'
-
Pegar o ip do namespace postgres.
$ kubectl get services -n postgres
-
Declarando url de conexão com o banco. Na url de conexão foi colocado postgres.postgres isso é importante pois não precisamos colocar o ip do namespace postgres, só precisamos dizer o namespace e o service. Nesse caso tanto o namespace quanto o service contem o mesmo nome.
$ kubectl exec -ti vault-0 -n vault -- vault write database/config/dev plugin_name=postgresql-database-plugin allowed_roles="*" connection_url="postgresql://{{username}}:{{password}}@postgres.postgres:5432/dev?sslmode=disable" username="postgres" password="password"
-
Declarando uma regra.
$ kubectl exec -ti vault-0 -n vault -- vault write database/roles/dev db_name=dev creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; \ GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" revocation_statements="ALTER ROLE \"{{name}}\" NOLOGIN;" default_ttl="1h" max_ttl="24h"
-
Delegando ao vault o gerenciamento da senha e do nome de usuário.
$ kubectl exec -ti vault-0 -n vault -- vault write --force /database/rotate-root/dev
-
Tentando acessar o banco do postgre. Aqui o vault irá bloquear o acesso, pois é necessário solicitar um usuário e senha para ele.
$ kubectl exec -it -n postgres $(kubectl get pods -n postgres --selector "app=postgres" -o jsonpath="{.items[0].metadata.name}") -c postgres -- bash -c 'PGPASSWORD=password psql -U postgres'
-
Com o comando abaixo o vault irá criar um username e password criptografados. Esse acesso irá atender as regras especificadas.
$ kubectl exec -ti vault-0 -n vault -- vault read database/creds/dev
-
Entrando com o password e username dados pelo vault.
$ kubectl exec -it -n postgres $(kubectl get pods -n postgres --selector "app=postgres" -o jsonpath="{.items[0].metadata.name}") -c postgres -- bash -c 'PGPASSWORD=A1a-3af2yrGLTL3bRoeC psql -U v-root-dev-bhedY39fUUzZHPtmy2Sy-1609169341 dev'