Uma situação muito comum em boa parte dos times de desenvolvimento de software é a necessidade de compartilhar segredos. Por segredos entenda aquela credencial de acesso a algum produto ou serviço importante, bem como chaves de APIs, qualquer outra informação confidencial e/ou secreta.

Apesar de prático, enviar esses segredos através de mensagens instantâneas, SMS ou e-mail é inseguro!

Dependendo da empresa ou cliente para os quais você trabalha, isso provavelmente viola as políticas de segurança da informação. Ao mesmo tempo, isso não quer dizer que essas empresas e/ou clientes tenham uma solução prática para resolver esse problema.

Existem hoje inúmeras soluções disponíveis para resolver esse problema de modo prático e seguro: desde ferramentas focadas em times, como 1Password for Teams, até ferramentas focadas em gerenciamento de segregos de aplicações, como Hashicorp Vault.

No entanto as soluções previamente mencionadas implicam na aquisição de licenças ou provisionamento, e manutenção, de servidores internos para esse propósito.

Uma solução prática, rápida e segura que estou habituado a utilizar nos times que que trabalho é o git-crypt. Se seu time utiliza Git como ferramenta de controle de versão, então você também pode utilizá-lo para gerenciar seus segredos. O git-crypt utiliza GnuGPG como mecanismo de criptografia.

O que é GPG?

GnuGPG é uma implementação livre do padrão OpenPGP que descreve um mecanismo de chaves públicas e privadas fortes que fornecem segurança para comunicações eletrônicas e armazenamento de dados.

Instalação

O primeiro passo é garantir que você tenha o GnuGPG instalado em seu sistema operacional. Para isso, siga as instruções abaixo:

MacOS X

O modo mais fácil é através do GPG Tools. Se você não deseja toda a suite, você pode instalá-lo executando:

$ brew install gpg

Fedora

Dê uma conferida na documentação oficial do Fedora

$ yum|dnf install gnupg

Debian

A distribuição traz o pacote gnupg. Se necessita de qualquer ajuda, dê uma conferida na documentação oficial do Debian

Gerando uma chave GPG

Depois de instalado, é necessário que você crie uma chave pública e privada. A chave pública deve ser distribuída para todas as pessoas com as quais você queira compartilhar uma mensagem ou segredo. A chave privada, como o próprio nome diz, deve ser guardada em sigilo e nunca compartilhada com ninguém!

Para criar um novo par de chaves, basta executar o seguinte comando:

$ gpg --gen-key

Você terá que responder algumas perguntas. Abaixo estão algumas sugestões de resposta:

  1. Defina o tipo de chave como RSA and RSA (padrão)
  2. Defina o tamanho da chave como 4096
  3. Defina o tempo de validade dessa chave
  4. Defina seu nome real
  5. Defina seu email real
  6. Defina algum comentário (opcional)
  7. Confirme com O
  8. Defina a sua chave de segurança (e repita esse procedimento!)

Uma vez terminado esse processo, você pode verificar as suas chaves executando o seguinte comando:

$ gpg --list-keys.

Publicando sua chave pública (opcional, mas recomendável)

Antes de publicar a sua chave pública, você precisa saber qual o seu identificador. Para isso, execute o seguinte comando:

$ gpg --list-keys <SEU_EMAIL>

Seu identificador tem 8 dígitos. Algo como F30B19B8.

Vamos publicar nossa chave pública no servidor PGP do MIT. Para isso, basta executar:

$ gpg --keyserver pgp.mit.edu --send-key <SEU_IDENTIFICADOR_DE_8_DIGITOS>

Obtendo uma chave pública (em caso de estar dando permissões a um membro do seu time)

Caso você necessite compartilhar um segredo com alguém, é necessário que você conheça a chave pública dessa pessoa. Em linhas gerais, o conteúdo do arquivo é criptografado com a chave pública, e somente pode ser descriptografado com sua respectiva chave privada.

Caso a pessoa membro do seu time também tenha publicado sua chave no servidor PGP do MIT, você pode obter essa chave executando o seguinte comando:

$ gpg --keyserver pgp.mit.edu --recv-key <IDENTIFICADOR_8_DIGITOS>

git-crypt

Instalação

O primeiro passo é garantir que você tenha o git-crypt instalado em seu sistema operacional. Para isso, siga as instruções abaixo:

Mac OS X

O modo mais rápido é através do Homebrew:

$ brew install git-crypt

Fedora

$ sudo yum install openssl-devel gcc-c++
$ cd /tmp && wget https://github.com/AGWA/git-crypt/archive/0.5.0.zip
$ unzip 0.5.0.zip && cd git-crypt-0.5.0/
$ make && sudo make install

Debian

$ sudo apt-get install libssl-dev
$ cd /tmp && wget https://github.com/AGWA/git-crypt/archive/0.5.0.zip
$ unzip 0.5.0.zip && cd git-crypt-0.5.0/
$ make && sudo make install

Gerenciando segredos com git-crypt

Acesse o repositório onde deseja salvar seus segredo e execute o seguinte comando:

git-crypt init

Em seguida, é necessário especificar o padrão de nome dos arquivos que conterão seu segredos. Todos os arquivos que seguirem esse padrão serão criptografados. Para isso, você deve criar um arquivo .gitattributes com o seguinte conteúdo:

secretfile filter=git-crypt diff=git-crypt
*.key filter=git-crypt diff=git-crypts

Isso fará com que todos os arquivos com a extensão .key sejam criptografados de agora em diante. Além disso, o git-crypt garantirá que você nunca envie arquivos com essa extensão descriptografados para seu servidor Git.

Adicionando um novo segredo

Para adicionar um novo segredo a esse repositório, execute os seguintes comandos:

$ git-crypt unlock
$ touch <SEU_ARQUIVO>.key
$ vim|emacs <SEU_ARQUIVO>.key
$ git add <SEU_ARQUIVO>.key
$ git-crypt lock --force

Depois disso, garanta que o arquivo foi criptografado executando os seguintes comandos:

$ git-crypt status
$ cat <SEU_ARQUIVO>.key

Se tudo estiver certo, submeta suas mudanças:

$ git add <SEU_ARQUIVO>.key
$ git commit

Compartilhando um segredo com outra pessoa

É possível compartilhar segredos com outras pessoas, ou com você mesma, desde que você possua a respectiva chave pública GPG.

De posse da chave pública, basta executar o seguinte comando:

$ git-crypt add-gpg-user <IDENTIFICADOR_8_DIGITOS>

Quer saber mais sobre as operações suportadas pelo git-crypt? Dá uma conferida no repositório do projeto.