[SPIKE] - Instalação e Configuração do Vault para o MSSQL e PostgreSQL
PIPEFY CARD ID 531130456
OBJETIVO
Avaliar a possibilidade de implementação de um serviço de gerenciamento de usúarios e senhas de forma segura nas bases MSSQL e PostgreSQL.
JUSTIFICATIVA
Implementar um gerenciador dinâmico de usúarios e senhas de banco de dados.
ENVOLVIDOS
Desenvolvimento do Estudo:
- Anderson Gomes de Souza - Assessor
Suporte Técnico:
- Juan David Ochoa Saavedra - Assessor
Coordenador de Análise e Gestão de Dados:
- Abdenildo Deividy Sobreira dos Santos
Product Owner:
- Pedro Henrique de Andrade Gomes
GLOSSÁRIO
- O que é o Vault Hashicorp?
- Como funciona?
- Primeiros passos para utilização do Vault
- Conclusão
- Referências
O que é o Vault Hashicorp ?
O Vault HashiCorp é uma ferramenta para acessar segredos (senhas, chaves de APIs, certificados, etc.) de forma segura, através de uma interface comum e com logs detalhados para auditoria.
Tendo algumas funcionalidades como:
- Criptografia
- Geração de segredos dinâmicos com prazo de expiração
- Renovação e revogação de segredos
O Vault ainda conta com vários componentes conectáveis chamados mecanismos de segredos e métodos de autenticação que permitem a integração com sistemas externos. O objetivo desses componentes é gerenciar e proteger seus segredos em infraestrutura dinâmica (por exemplo, credenciais de banco de dados, senhas, chaves de API) sendo o MSSQL e PostgreSQL uma delas.
Como funciona?
O Vault funciona como um gerenciador de tokens e senhas que possui as funções de:
- Armazenamento de segredo seguro: segredos de chave/valor arbitrários podem ser armazenados no Vault. O Vault criptografa esses segredos antes de gravá-los no armazenamento persistente, portanto, obter acesso ao armazenamento bruto não é suficiente para acessar seus segredos. O Vault pode gravar em disco, Console e muito mais.
- Gerenciamento de Segredos dinâmicos: o Vault pode gerar segredos sob demanda para alguns sistemas, como bancos de dados AWS ou SQL. Por exemplo, quando um aplicativo precisa acessar um bucket do S3, ele solicita credenciais ao Vault e o Vault gera um par de chaves da AWS com permissões válidas sob demanda. Depois de criar esses segredos dinâmicos, o Vault também os revogará automaticamente após o término da concessão.
- Criptografia de dados: o Vault pode criptografar e descriptografar dados sem armazená-los. Isso permite que as equipes de segurança definam parâmetros de criptografia e os desenvolvedores armazenem dados criptografados em um local como um banco de dados SQL sem precisar projetar seus próprios métodos de criptografia.
- Arrendamento e renovação: todos os segredos no Vault têm um arrendamento associado a eles. No final da concessão, o Vault revogará automaticamente esse segredo. Os clientes podem renovar concessões por meio de APIs de renovação integradas.
- Revogação: o Vault tem suporte integrado para revogação de segredo. O Vault pode revogar não apenas segredos únicos, mas uma árvore de segredos, por exemplo, todos os segredos lidos por um usuário específico ou todos os segredos de um tipo específico. A revogação auxilia na rolagem de chaves, bem como no bloqueio de sistemas no caso de uma intrusão.
IMPLEMENTAÇÃO - Primeiros passos para utilização do Vault.
Para o início da utilização é necessário instalar o Docker no ambiente, usando o link ao lado (Docker Desktop). O ambiente envolvido será windows, então a instalação será para esse SO.
Após a instalação do ambiente de Conteinerização, é necessário subir as imagens imagens do Vault no docker sendo necessário criar e utilizar um arquivo de configuração chamado de docker-compose.yml (clique no nome para realizar o download) com os seguintes paramêtros.
version: '3'
services:
vault:
image: "docker.io/vault:latest"
environment:
- VAULT_DEV_ROOT_TOKEN_ID=Baymax2022
cap_add:
- IPC_LOCK
ports:
- 8200:8200
Após a criação desse arquivo em uma pasta vamos executar o prompt de comando na mesma e rodar o comando abaixo para subir a imagem no docker.
docker-compose up -d
Após a finalização da conteinerização podemos abrir a interface inicial do Vault pelo docker clicando no botão Open In Browser (conforme ilustrado na imagem abaixo).
Inicialmente o Vault ira solicitar um Token de acesso, nesse caso vamos utilizar o token que configurei no arquivo .yml que é o BAYMAX2022
Observação: Por padrão quando se utiliza o Root Token o Vault não armazena esse token no browse, sendo o mesmo solicitado novamente no próximo login.
Ao entrar no Vault pode ser observado 2 secrets engines padrões que são a cubbyhole/ e a secret/ que servem para armazenar senhas que podem ser gerenciados pelo CLI (Shell) ou pela própria GUI (Interface do Vault).
$ vault wite cubbyhole/teste senha=s3gr3do
$ vault read cubbyhole/teste
Podemos criar outras Secrets Engines por meio do botão "Enable new Engine", inicialmente vamos criar uma engine para conexão com a database MSSQL objeto de estudo deste SPIKE.
Agora com a Engine criada vamos definir a conexão e as Roles sendo que para fins de testes estarei utilizando o 172.16.0.168 (Ambiente QA) e o usúario baymax_test.
Observação: na Connection URL utilizei a porta 1433 (porta padrão do SQL Server) e a váriavel do Vault para pegar o {{username}} e {{password}} que passei durante a configuração de conexão.
Com a conexão feita vamos configurar uma Role estática com um tempo limite de 50 segundos agora, tendo em mente que uma Role (user) pode ser definida em 2 tipos sendo:
- Static → mantém o nome do usúario e fica somente mudando a senha a cada xxx segundos, minutos, horas ou dias conforme o paramêtro definido.
- Dynamic → cria um nome de usúario e senha dinamicamente com expiração definida no tempo de duração conforme o paramêtro definido.
Após a configuração da Role e possível se conectar utilizando a Password que o Vault gera a cada 50 segundos
A role do tipo dinâmica conforme explicado anteriormente pode ser utilizada para gerar usúarios e senhas aleatórias com um tempo limite que são gerenciados pelo Vault Hashicorp, sendo necessário criar Statements criação e remoção de usuários.
CREATE LOGIN [{{name}}] WITH PASSWORD=N'{{password}}', CHECK_EXPIRATION=OFF, CHECK_POLICY=ON
DROP USER [{{name}}]; DROP LOGIN [{{name}}];
Após a criação da Role Dinâmica ela ira gerar um usúario e senha aleátoria para acesso temporário a base selecionada.
CONCLUSÃO
Após estudos e análise da implementação do Vault Hashicorp, verifiquei que esta de fato é uma solução para gerenciamento de tokens dinamicamente eficaz, devido a possibilidade de implementação nos principais SGBD's utilizados por esta Coordenadoria de Análise e Gestão de dados e as infidas Roles (Acessos) que podem ser criados para cada conexão. Sendo que durante alguns testes cheguei a conclusão de que a melhor abordagem que obtive foi utilizar as Databases Engines de instâncias (conexões) separadas para melhor gestão de acessos conforme ilustrado abaixo ↓.
Devo ainda pontuar que devido a mudança constante de usuário e senha da Role do tipo Dinâmica, deve-se observar o uso desta Role para fins de auditoria.