HashiCorp Vault Deployment Guide — Docker

Daniel Marques
11 min readJul 12, 2020

--

Nesse artigo vamos aprender sobre o Vault, uma poderosa ferramenta para gerenciamento de API Keys, Password, certificados e outras informações sensíveis de uma aplicação de software.

A internet vem mudando constantemente, neste últimos 20 anos pode se observar uma transformação sem precedentes no que se diz respeito a comunicação, principalmente a online, onde conseguimos observar uma forte confiança exagerada a respeito de dados sensíveis da nossa aplicação. Vejo muitos desenvolvedores, principalmente os iniciantes, com uma confiança exagerada em pensar que seu sistema, banco de dados e/ou websites nunca serão invadidos.

Atualmente vejo o Vault como uma solução de extrema importância para o gerenciamento de chaves no ecossistema blockchain, principalmente corretoras de bitcoin e afins. Nos últimos anos houve uma crescente onda de ciber ataques, principalmente em exchanges centralizadas onde fazem o gerencialmente das private keys e public keys dos seus clientes. Na comunidade blockchain temos uma frase que ilustra bem o perigo de ter uma private key exposta, ela se expressa assim, “ If You Don’t Own Your Keys, You Don’t Own Your Crypto”(se voce não possui suas chaves, você não possui suas moedas), ou seja, obter essa tipo de informação pode custar milhões de dólares dependendo de qual chave privada o criminoso tenha acesso.

Neste tutorial não irei me aprofundar sobre conceitos básicos de criptografia simétrica e assimétrica, caso tenham interesse nessa assunto deixem nos comentários que farei um novo artigo exclusivo para esse tema.

Percebendo todos os problemas citados, resolvi desenvolver esse tutorial com um passo a passo de como configurar, testar e realizar o deploy do Vault em seu servidor.

Vault é uma ferramente open-source gerida pela licença MPL-2.0 com permissão em uso comercial, então, não ha motivos para não usa-la, principalmente se você possui uma exchange de cripto ou trabalha em uma.

Configurações

Nesse tutorial vamos usar o modelo de contêiner no Docker, pois creio que para quem esta iniciando e a maneira mais rápido e fácil instalar, testar e configurar.

Instale o Docker:

Configurar o Ambiente de Desenvolvimento

Acesse link do contêiner ou apenas digite em seu terminal o comando

docker pull vault

Agora você pode receber a seguinte mensagem:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Isso acontece porque o docker nao está inicializado. Localize em seu gerenciador de aplicativos o docker e o inicie.

Configurar Vault em Ambiente de desenvolvimento

Para configurar o Vault, precisamos apenas digitar no terminal a seguinte instrução:

docker run --cap-add=IPC_LOCK -d -e VAULT_ADDR=http://localhost:8200 -p 8200:8200 --name=dev-vault vault

O que cada parâmetro significa:

docker run = Inicia o Container.

cap-add=IPC_LOCK = Esse comando bloqueie a memória. Isso que impede o salvamento em disco, ou seja, quando você desligar o container as informações serao excluído automaticamente.

-e = environment variable

VAULT_ADDR=http://localhost:8200 => Omesmo export dentro do container.

-d = Significa Daemon, irá subir o container com serviço dentro do docker.

— name=dev-vault = nome do container (pode escolher qualquer um da sua escolha).

vault = container.

Verificar a instalação em modo desenvolvimento

Digite no seu terminal o comando:

docker ps

Se tudo ocorreu bem, seu container estará inicializado:

comando docker ps

Outra forma de verificar se Vault está funcionando é abrir seu navegador e digitar:

http://localhost:8200

Você verá uma tela igual à imagem a baixo, se até aqui tudo estiver funcionando podemos continuar, mas se por algum motivo o seu navegador não o exibir essa tela, comece o processo totalmente do zero, pois algum passo não foi seguido corretamente.

UI Vault

Login

Ao acessar a UI do Vault ele solicitará um token, esse token é a chave root, no qual lhe da acessso global a todas as configuração.

Para ter acesso ao token temos que acessar o nosso container, o comando é o seguinte:

docker ps

Acessamos o containers

docker logs [YOUR-CONTAINER-ID]

No meu caso ficou assim:

docker logs 5e6ae499818f

Será mostrado as seguintes informações:

Logo ao final do console você irá perceber duas informações, o primeiro chamado Unseal Key: Essa chave é usada para desbloquear o vault, não é importante por enquanto visto que estamos em ambiente de desenvolvimento.

Outro campo é chamado Root Token, é esta chave que estamos procurando, copie ela com o s, informe ela no Token dentro da UI e depois clique em Sign In.

Vá até o menu Secrets -> Enable a Secrets Engine -> kv -> Path: api -> Version: 1 -> clicar em method opinion

Alterar os campos: seleciona a versão 1 em Default Lease TTL e Max Lease TTL alterar para 7 days.

Clique em Enable Engine para salvar.

Criando, Lendo e Atualizando Chaves

Neste passo vou usar a linguagem JavaScript, mas você pode usar qualquer linguagem que se sentir confortável, veja todas as libs neste link.

Vamos criar um projeto com nodejs, no seu terminal digite:

Criar pasta do projeto

mkdir [Nome do seu projeto ] && cd [Nome do seu projeto ]

Iniciar o projeto

yarn init -y

Adicionar a lib do Vault

yarn add node-vault

Abra seu projeto com o Visual Code, caso voce não o opossua poderá fazer download nesse link

Eu já a adicionei o Visual Code no meu PATH para abrir ele pelo terminal, assim agilizo o processo de desenvolvimento diário, para verificar digite no terminal a seguinte instrução, ou abra-o com o atalho File -> Open

Para abir com o terminal digite:

code ./

Vamos primeiramente estruturar nosso projeto:

mkdir src && cd srcmkdir config && cd config

Dentro da pasta config criaremos nosso primeiro arquivo de conexão do Vault com o nome vault.js. Abra esse arquivo e cole o seguinte codigo:

apiVersion: numero da versão da api, podendo ser v1 ou v2.

endpoint: endpoint de conexão com a api.

token: token de acesso da api.

Voltamos a pasta src:

cd ../

Agora vamos criar nossa pasta services:

mkdir services && cd services

Crie um arquivo com o nome VaultService.js e cole o seguinte código

Neste codigo importamos a instância do Vault e declaramos nossos parâmetros de conexão

Após isso criamos e exportamos uma classe com o nome VaultService.

Por fim, criamos uma método que terá como responsabilidade a inserção dos dados nas chaves definidas, recebendo dois parâmetros path e data. O campo pathrecebe o caminho onde será armazenado os dados contidos em data.

Agora voltamos a pasta srce criar um novo arquivo index.js, inserindo o seguinte código:

Vamos entender o que está acontecendo. Primeiramente nos declaramos uma nova instância chamada vaultService.

Declaramos um método com o nome syncVault que será invocada pelo nodejs na hora da execução do script index.js.

Chamamos o método responsável pela escrita no Vault.

Para rodar o script vamos criar um link. Abrimos o arquivo package.json, criamos uma tag chamada scripts e salvamos.

Agora no terminal digitamos:

yarn dev

Se tudo funcionar será mostrado algo assim:

Existem duas formas de verificar a criação da chave, a primeira é pela própria UI do Vault.

Acesse http://localhost:8200/ insira sua chave e clique em Sign In.

Clique em Secrets -> API:

Secrect API

Outra alternativa é verificar pelo nosso script, vamos abrir novamente nosso arquivo VaultService.js e vamos adicionar o seguinte método:

O arquivo completo será assim:

Abrimos nosso arquivo index.js e chamamos o método que acabamos de criar:

Executamos nosso script novamente e teremos o seguinte retorno:

Caso receba o erro 404, quer dizer que sua chave não foi criada.

VAMOS AO DEPLOY

Nosso deploy será feito totalmente com o docker, pois essa e a forma mais eficiente de ser implementado na minha opinião.

Bem escolham uma VPN ou Amazon ECS, irei utilizar uma VPN nesse exemplo, mas garanto que não há grandes diferencas, pois essa é a filosofia do Docker.

Crie uma pasta no seu projeto chamado docker e dentro dela insira uma pasta chamada vault e outra chamada consul.

Pelo terminal ficará assim:

mkdir docker && cd docker && mkdir vault && mkdir consul && cd vault

Vault

Dentro da pasta vault vamos criar um arquivo chamado Dockerfile, ele será responsável pela configuração do container vault.

Neste arquivo você deverá colar as seguintes configurações:

Devemos criar uma pasta chamada config:

mkdir config && config

Criamos um arquivo com o nome vault-config.json, por padrão o vault vai buscar o arquivo com esse novo para iniciar em modo server.

Nosso arquivo ficará assim:

EXPLICAÇÃO

backend”: definimos o nosso servidor storage no qual será o “consul” com endereço consul:8500 com path: vault/.

“address”: “consul:8500”,

Neste trecho o caminho consul:8500 pode gerar alguma dúvida as pessoas não habituadas ao docker, mas este endereço seria o mesmo que eu definir uma network, exemplo network: consul=127.0.0.1, desta forma posso chamar a rede por consul e todos os container que herdarem essa rede podem chama-la pelo nome e não pelo seu ip.

“listener” : Configura como o Vault atende as solicitações de API, ou seja, fica ouvindo as requisições na porta 8200, após isso é definido as configurações Https, é extremamente recomendado em produção ser implementado com https, eu não preciso dizer o motivo certo 👀?

“tls_disable”: 0 = Define a obrigatoriedade de fornecer o certificado e a privatekey do certificado.

“tls_cert_file”: Define o caminho do certificado dentro do container e nao dentro da sua maquina.

“tls_key_file”: Define o caminho da chave privada dentro do container e nao dentro da sua maquina.

“ui”: true

“ui”: habilita interação com a UI, caso não veja necessidade, informe como false.

IMPORTANTE

caso deseje mudar o nome do arquivo /vault/config/vault-config.json , não esqueça de mudar esse arquivo no Dockerfile ficando assim:

perceba que o /vault/config/vault-config.json continua inalterado, isso porque o vault irá buscar o arquivo padrão de configuração com o nome vault-config.json dentro do container.

Consul

Acesse a pasta Consul e crie um arquivo chamado Dockerfile e dentro dele cole as seguintes configurações:

Agora iremos criar nosso arquivo de configuração, digite no console:

mkdir config && cd config

Dentro dessa pasta criamos um arquivo chamado consul-config.json com as seguintes configurações:

Deploy

Instale o Docker e docker-compose

Instale o certbot

sudo apt-get updatesudo apt-get install software-properties-commonsudo add-apt-repository universesudo add-apt-repository ppa:certbot/certbotsudo apt-get updatesudo apt-get install certbot

E depois de tudo instalado podemos gerar nosso certificado seguindo os passos da própria ferramenta. Vale lembrar que para você gerar um certificado e usar``HTTPS`` deverá primeiro apontar seu domínio para o DNS do servidor ou host.

sudo certbot certonly — standalone

Envie seus dados para o servidor, no meu caso ficou assim:

git clone https://github.com/Dkdaniz/HashiCorp-Vault-post-medium

Agora precisamos acessar a pasta do seu dominio que contém o seu certificado.

cd /etc/letsencrypt/live/[SEU DOMINIO]/

Observação: Esse procedimento precisa de acesso de root a pasta /etc/letsencrypt/live/

Copie os arquivos fullchain.pem e privkey.pem

Voltamos a pasta do nosso projeto e executamos o docker-compose

cd /home/[YOUR-USER]/[NOME-DO-SEU-PROJETO]

Executamos o docker-compose:

docker-compose up -d — build

Abra no navegador e verifique se exibe a tela inicial do vault:

https://YOUR-HOST.com:8200

Você irá ver o Vault em estado sealed, ou seja, nessa etapa precisamos informar quantas chaves são necessarias para realizar o desbloqueio do vault, para esse exemplo irei utilizar 5 keys.

Logo após definir que pretendo usar cinco chaves ele fornecerá o download do json contendo as suas chaves, faça o download clicando em download keyse depois inicie o processo de Unseal.

Você será alertado sobre as keys:

Por favor, distribuir com segurança as chaves abaixo. Quando o cofre for selado de novo, reiniciado ou parado, deverá fornecer pelo menos 5 destas chaves para o voltar a deslindar. O cofre não armazena a chave-mestra. Sem pelo menos 5 chaves, o seu Cofre ficará permanentemente selado.

Clicando em Continue Unseal a UI irá lhe mostrar um tela solicitando as chave:

Informe as keys e apartir desse momento você deverá inserir sua chave de root ou qualquer outra que você tenha criado.

Esse artigo foi util para você? Então compartilhe ele com seus amigos e siga as redes sociais:

Instagram: https://www.instagram.com/dkdaniz

Twitter: https://twitter.com/dkdaniz

Github: https://github.com/Dkdaniz

Project Code: https://github.com/Dkdaniz/HashiCorp-Vault-post-medium

Contribua com o autor:

Bitcoin Wallet: 1LnXZNL93z95u8g7rgWxYhddQT6CZvZE7Z

Ethereum Wallet: 0x999326f69d54cd928b14e24ff8f75ef515caacf4

Nano Wallet: nano_3u7erm493r5rjemu64qfwi1bhns4pukkahkbd1pgchcuum7cubizkapijmt7

--

--

Daniel Marques
Daniel Marques

Written by Daniel Marques

🏆 Win Hackathon NASA Space Apps Curitiba 2017 🌎 Top 5 Finalista Global NASA Space Apps 2017 🔑 Blockchain 💾 Software Developer

No responses yet