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:

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
Wizard parte 1
Wizard parte 2

Criação de chave de segurança

Vamos inicializar o git-cryptpara 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
Executando a função para adicionar usuario ao git-crypt

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.js
  • mongojs — 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
Output do comando executado

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).

Criando um novo repositório

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.

Informações sobre upload de 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.

Clone de projeto do github

Crie outra pasta fora do projeto que estávamos utilizando e clone o projeto

Clone do projeto para ambiente local

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.

Restauração de pacotes e rodando o projeto

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 !

Links

1K

1K claps
Erick Wendel

Written by

Software Consultant, Microsoft MVP, GoogleDevExpert 🇧🇷 @erickwendel_ @nodebr @onerdzao @jssaopaulo #mvpbr #opensource #typescript #nodejs

Training Center

Conectamos pessoas que querem aprender algo relacionado a desenvolvimento de software com gente que pode guiá-las.