Protegendo dados sensíveis com Git-Crypt
Já teve problemas ao pensar em como versionar suas variáveis de ambiente, strings de conexão ou até mesmo seus endereços de IPs e servidores ? Então este artigo é para voce! :D
Trabalhando junto a grandes clientes, entendi que não há um certo padrão adotado para proteger suas chaves e dados sensíveis entre eles. Em um destes clientes, tivemos um fluxo mais ou menos assim:
- Baixar o código do repositório
- Criar um arquivo .env
- Entrar em um de seus repositórios
- Encontrar a chave para o seu repositorio especifico
- Copiar os dados
- Colar no seu arquivo .env
- Rodar o projeto
Qual o problema desta abordagem?
Caso desejar alterar a URL do servidor, ou trocar o banco de dados da aplicação, precisará lembrar de alterar todas as aplicações que utilizam este repositório e lembrar de substituir seus valores um por um. Não parece uma boa certo ?
E se houvesse uma forma simples, de não se preocupar com o conteúdo do seu arquivo e ter a possibilidade de criar versões destas informações sensíveis? Vamos conhecer o git-encrypt :D
Git Crypt
git-crypt permite criptografia e decodificação transparentes de arquivos em um repositório git. Os arquivos que você escolher para proteger são criptografados quando commitados, e descriptografados a partir de uma chave privada. O git-crypt permite que você compartilhe livremente um repositório sem se preoupar com a segurança de seus dados.
Instalação
apt install git-crypt #linuxbrew install git-crypt #mac os
Requisitos
Vamos simular um ambiente real trabalhando com Node.js, uma aplicação com strings de conexão diferentes para cada ambiente. Para isso, é necessário a instalação das seguintes ferramentas:
- Node.js — nodejs.org
- VSCode — https://code.visualstudio.com/
- Git — https://git-scm.com/downloads
- MongoDB — https://docs.mongodb.com/getting-started/shell/installation/
Estrutura Inicial do projeto
Crie uma pasta com o nome post-gitcrypt, em seguida execute o comando git init
para inicializar seu repositório. Execute também npm init -y
para iniciar um projeto Node.js.
Vamos criar nossa pasta de configuração e arquivos a serem criptografados.
config
├── .env.dev
└── .env.prod
Vamos abrir nosso arquivo .env.dev e adicionar nosas informações:
DB=mongodb://localhost:27017/usersDev
No arquivo .env.prod adione as informações para o ambiente de produção:
DB=mongodb://localhost:27017/usersProd
Criação de usuario GPG Linux
Para importar e exportar as keys, precisaremos criar uma assinatura digital GPG (GNU Privacy Guard) no Linux.
apt-get install haveged rng-toolsgpg --gen-key
Veremos um wizard, responda conforme as instruções abaixo
- Enter para selecionar a opção default
- Em keysize coloque
4096
- Enter para selecionar a opção default
y
para expiração- Digite seu nome usado no Github
- Digite seu email usado no Github
- Crie uma senha
Criação de chave de segurança
Vamos inicializar o git-crypt
para gerar as keys.
git-crypt init
Devemos também adicionar nosso usuário GPG ao nosso projeto.
git-crypt add-gpg-user SEU_EMAIL_GPG
Neste ponto, precisamos de um arquivo que será a chave para “destrancar” nossos arquivos, ela não deverá existir em seus repositórios e será compartilhada entre o time de desenvolvimento. NÃO perca esta chave, ela será usada toda vez que precisar descriptografar seus arquivos.
git-crypt export-key MINHA_CHAVE
Ignorando a chave de segurança em commits
É importante não compartilhar a chave privada via respositório, para isso, na raiz do projeto, crie um arquivo com o nome .gitignore
com as informações abaixo. Vamos também ignorar em nosso repositório a pasta de dependências do Node.js e arquivos de configuração do editor.
Filtros de arquivos seguros
Após criar nossas chaves, precisamos definir quem são os arquivos a serem de fato criptografados. Criamos um arquivo chamado .gitattributes
, com o conteúdo abaixo. Aqui definimos os filtros de arquivos que serão criptografados. No exemplo abaixo, queremos todos os arquivos contenham o texto .env
(em nosso caso, nossos arquivos são .env.prod e .env.dev)
.env.* filter=git-crypt diff=git-crypt
Após adicionar o filtro no .gitattributes
, conseguimos entender o que será encriptado.
git-crypt status
Opcional — Criação de projeto teste Node.js
Vamos agora, instalar algumas dependencias em nosso projeto para trabalhar em nosso exemplo.
npm i dotenv mongojs --save
dotenv
— responsável por entender os arquivos .env e ler suas variáveis, adicionando os valores ao process.env do node.jsmongojs
— responsável por conectar-se ao MongoDB
Crie um arquivo index.js e cole o código abaixo
Vá ao arquivo de dependencias do nodejs, package.json
, insira as informações sobre a forma em que nossa aplicação será executada, ambiente de execução e qual o script será chamado. Em seu arquivo, entre na propriedade scripts e deixe-o semelhante ao código abaixo:
Note os scripts com as chaves prod e dev. Criamos variáveis de ambiente informando qual será o ambiente a ser executado, para nossa lib dotenv interpretar e adicionar estes valores de NODE_ENV ao nosso process.env do node.js.
Tudo pronto para a execução! Volte ao terminal e faça um teste, executando em ambiente de desenvolvimento.
npm run dev
Subindo nosso código ao repositório
Vamos agora, subir todo o nosso código ao github, e então, baixar este mesmo repositório em outra pasta, para conferir se a criptografia foi como esperado, para isso, rode os comandos abaixo:
git add .git commit -m "qualquer mensagem heheh"
Em seguida, crie um repositório no github. Vá ao menu superior direito e clique em New Repository (ou novo repositorio).
De um nome ao seu projeto e clique em Create Repository. Note que agora, o github nos mostra algumas informações sobre como subir nosso código ao repositório.
Volte ao seu terminal e copie as linhas da seção “…or push an existing repository from the command line”.
Descriptografando nossos arquivos
Após subir nosso projeto ao github, os arquivos de configuração estão ilegíveis e criptografados pelo git-crypt. Vamos agora fazer o processo reverso. Faça o clone do projeto e entre em sua pasta pelo terminal.
Crie outra pasta fora do projeto que estávamos utilizando e clone o projeto
Copie a chave privada para a pasta, usaremos em seguida. A fim de melhor visualização, dê uma olhada no conteúdo de nossos arquivos.
Vamos agora, descriptografar os arquivos
git-crypt unlock MINHA_CHAVE
Pronto! Veja o resultado, imprima os valores das configurações do seu projeto para confirmar que ocorreu como o esperado
Executando o projeto
Agora que descriptografamos nossas chaves, execute o comando npm install
para restaurar as dependencias do projeto, em seguida, execute npm run prod
.
Conclusão
Bom, foi um longo caminho até aqui, se conseguiu executar todos os passos e chegar ao resultado final, meus parabéns!
Agora, aprendemos uma forma simples e segura de manter nossos arquivos privados, sem se preocupar com gestão dos mesmos. Não perca a oportunidade de tirar suas dúvidas ou deixar aquela sugestão aí nos comentarios :)
See ya !