Artigo original: Best practices for securely storing API keys

Escrito por: Bruno Pedro

No passado, vi muita gente usar repositórios do Git para armazenar informações confidenciais relacionadas a seus projetos.

Ultimamente, tenho visto algumas pessoas anunciarem que estão armazenando chaves de API em seus repositórios privados do GitHub. Estou escrevendo este artigo porque as pessoas devem entender os riscos de armazenar chaves de API com seu código.

Este artigo não se destina a ser uma solução permanente para os problemas que você pode ter com o armazenamento de chaves de API. Em vez disso, é minha própria análise do problema e minhas sugestões sobre como corrigi-lo.

Então, qual é exatamente o problema de armazenar informações confidenciais com seu código em um repositório do Git?

Por que você não deve armazenar chaves de API em repositórios do Git

Armazenar chaves de API, ou qualquer outra informação confidencial, em um repositório do git é algo a ser evitado a todo custo. Mesmo que o repositório seja privado, você não deve vê-lo como um local seguro para armazenar informações confidenciais.

Vamos começar analisando por que é uma má ideia armazenar chaves de API em repositórios públicos do git.

Por natureza, um repositório público do git pode ser acessado por qualquer pessoa.

Em outras palavras, qualquer pessoa com uma conexão com a internet pode acessar o conteúdo de um repositório público do git. Não é só isso. Eles também podem navegar por todo o código dentro do repositório e possivelmente até executá-lo. Se você armazenar uma chave de API em um repositório público, estará publicando a céu aberto para que qualquer pessoa possa vê-la.

Uma pesquisa recente por client_secret no GitHub revelou que há mais de 30.000 confirmações que potencialmente expõem uma chave de API e um segredo. Em alguns casos, você só copia e cola o código para acessar imediatamente a API.

Esse problema está se tornando tão sério que algumas empresas investem em recursos para garantir que não haja chaves de API e segredos vazados.

No ano passado, o Slack começou a procurar por tokens de API expostos e a invalidá-los proativamente. Essa ação impede o acesso malicioso às contas do Slack, mas não é possível encontrar todos os tokens vazados.

Então, isso está acontecendo em repositórios públicos do git. Será que também acontece com os repositórios privados? Por que isso é um problema?

Repositórios privados do Git hospedados em serviços como GitHub, GitLab e Bitbucket estão expostos a um tipo diferente de risco. Quando você integra uma aplicação de terceiros com um dos serviços mencionados, você pode estar abrindo seus repositórios privados para esses terceiros. Essas aplicações poderão acessar seus repositórios privados e ler as informações contidas neles.

Embora isso por si só não crie um risco, imagine se uma dessas aplicações se tornar vulnerável a invasores. Ao obter acesso não autorizado a uma dessas aplicações de terceiros, os invasores podem obter acesso aos seus dados confidenciais, incluindo chaves de API e segredos.

Onde, então, devemos armazenar as chaves de API?

Existem muitas alternativas para armazenar chaves de API e segredos com segurança. Algumas delas permitem que você use seu repositório do Git e criptografe os dados confidenciais. Outras ferramentas são mais sofisticadas e descriptografam informações confidenciais como parte de um fluxo de trabalho de implantação. Vejamos algumas das soluções disponíveis.

git-remote-gcrypt

A primeira solução permite criptografar um repositório do Git inteiro. O git-remote-gcrypt faz isso adicionando funcionalidade aos auxiliares remotos do Git para que uma nova camada de transporte criptografada fique disponível. Os usuários só precisam configurar um novo controle remoto criptografado e enviar o código para ele.

Continue lendo se estiver procurando uma solução mais refinada que permita criptografar arquivos individuais.

git-secret

O git-secret é uma ferramenta que funciona em sua máquina local e criptografa arquivos específicos antes de enviá-los para seu repositório. Internamente, o git-secret é um script de shell que usa a GNU Privacy Guard (GPG) para criptografar e descriptografar arquivos que podem ter informações confidenciais.

git-crypt

Outra solução é o git-crypt. É bastante parecido com o git-secret na maneira de operar, mas com algumas diferenças interessantes.

A primeira coisa a se perceber sobre o git-crypt é o fato de ele ser um executável binário, não um script de shell, como o git-secret. Por ser um executável binário, para usá-lo, é preciso primeiro compilá-lo ou encontrar uma distribuição binária para sua máquina.

Se estiver usando um Mac, você está com sorte, pois o HomeBrew oferece um pacote do git-crypt, pronto para ser instalado. Você precisa apenas executar brew install git-crypt em um terminal.

BlackBox

O BlackBox é uma ferramenta criada pelo Stack Overflow. Essa é a empresa por trás das conhecidas comunidades de perguntas e respostas como o próprio Stack Overflow, o Server Fault e o Super User. O BlackBox é uma ferramenta robusta, que funciona com o Git e com outros sistemas de controle de versão, como o Mercurial e o Subversion.

Ele também suporta a criptografia de pequenas cadeias de caracteres e não apenas arquivos inteiros. Ele faz isso ao trabalhar com o Puppet e usa o Hiera, uma ferramenta de busca de chave-valor do Puppet para dados de configuração.

Por ter a capacidade de criptografar e descriptografar strings individuais, o BlackBox é uma ótima solução para garantir a segurança de chaves e segredos de API.

Configuração do Heroku e variáveis de configuração

Se estiver trabalhando com o Heroku, você não deve armazenar informações confidenciais, como chaves e segredos de API, em seus repositórios do Git. O Heroku oferece uma solução que permite que você defina as variáveis de configuração.

Sua aplicação pode acessar o conteúdo dessas variáveis de configuração durante o tempo de execução, acessando as variáveis de ambiente correspondentes. Mesmo que os valores não sejam criptografados, essa solução permite que você evite usar seu repositório do Git para armazenar chaves de API.

O Dokku, uma solução de código aberto, como o Heroku, oferece as mesmas capacidades.

Segredos do Docker

Ao final do espectro de soluções possíveis, temos os segredos do Docker (em inglês, Docker secrets). Essa solução foi apresentada pelo Docker em fevereiro de 2017, tendo ganhado popularidade desde então.

Os segredos do Docker permitem que você defina variáveis criptografadas e que as disponibilize para serviços específicos durante o tempo de execução. Os segredos são criptografados durante o trânsito e em repouso.

Essa abordagem torna os segredos do Docker a solução perfeita para armazenar e usar chaves de API e segredos de maneira segura e criptografada.

Resumo

Agora, você deve estar ciente dos perigos de armazenar informações confidenciais, como chaves de API e segredos em repositórios públicos e privados do Git.

Entender as possíveis maneiras pelas quais seus repositórios podem ser expostos é fundamental para avaliar e reduzir os riscos associados a vazamentos de informações.

Este artigo também propõe algumas soluções diferentes, que permitem criptografar chaves de API e segredos para que você possa usar com segurança seus repositórios de código.

Tenho certeza de que existem mais soluções por aí que podem ajudá-lo a alcançar os mesmos resultados.