O que são segredos e como lidar com eles em Java
Segredos são cadeias de caracteres que não devem ser compartilhadas com o mundo exterior: podem ser senhas de banco de dados, chaves de criptografia privadas, tokens de acesso pessoal e assim por diante. Para maior segurança, muitas pessoas também consideram que qualquer coisa que possa ajudar um invasor deve ser considerada um segredo: por exemplo, a URL do seu banco de dados de produção pode ser vista como um segredo. Seu banco de dados não deve ser acessível publicamente. A lógica é que esse tipo de informação é sensível por natureza, e quanto menos informações estiverem disponíveis em seu código, melhor.
O que é Zero Trust e Zero Secrets?
O conceito de Zero Trust é que ninguém deve ser cegamente confiável e ter permissão para acessar os recursos da empresa sem ser validado e autorizado.
Este conceito também se aplica a aplicativos Web: eles não devem ter segredos armazenados em seu código ou em seus binários finais. É o que chamamos de Zero Segredos.
Os segredos devem ser geridos por um sistema externo, com regras de acesso e validação rigorosas, para reduzir o risco de ataque.
Não coloque segredos em repositórios Git
Mesmo que seu repositório Git seja privado, colocar qualquer segredo em seu código-fonte é uma má prática:
- Qualquer pessoa com acesso ao seu repositório conhecerá seus dados confidenciais
- Qualquer pessoa com acesso ao binário do seu aplicativo pode extrair segredos dele
Além disso, uma vez que um segredo é armazenado em um repositório Git, os invasores sempre podem encontrá-lo procurando no histórico do repositório, onde ele pode ser esquecido depois de muito tempo.
Mesmo que pareça prático fazê-lo, você nunca deve armazenar nenhum segredo em seu repositório de código-fonte. Para evitar esse problema, você pode usar ferramentas automáticas que verificam regularmente seu repositório e enviam avisos se encontrarem uma senha ou URL de banco de dados armazenada por engano.
Usando variáveis de ambiente
A solução mais fácil para gerenciar segredos é usar variáveis de ambiente. Têm vários benefícios:
- Eles são fáceis de usar
- Eles funcionam em todos os sistemas (mesmo em sistemas locais)
- Todos os conhecem e compreendem como funcionam
No entanto, eles não são seguros o suficiente: todos os processos em seu sistema podem lê-los, e eles são facilmente expostos usando Java Management Extensions (JMX) em um sistema Java.
Como resultado, as variáveis de ambiente são frequentemente vistas como um primeiro passo para o Zero Trust: elas são mais seguras do que armazenar segredos diretamente no código-fonte, mas não têm recursos de gerenciamento e são fáceis de acessar para invasores.
Usando segredos do Kubernetes
O Kubernetes tem uma noção de secrets
, que é outra boa solução. Esses segredos podem ser carregados como um arquivo no sistema de arquivos do aplicativo: um programa Java pode ler esse arquivo no momento da inicialização, para acessar esses segredos. Ferramentas como o Spring Frameworks até têm suporte padrão para esse mecanismo, permitindo que eles usem esses segredos de forma fácil e eficiente.
Esse mecanismo é mais seguro do que as variáveis de ambiente, pois esses arquivos podem ser lidos apenas pelo processo que os exige. Eles também se beneficiam do rico ecossistema Kubernetes e podem ser gerenciados por várias ferramentas de gerenciamento, incluindo as ferramentas fornecidas pelo seu provedor de nuvem.
Embora os segredos do Kubernetes sejam uma boa solução para o Kubernetes, eles também estão limitados ao Kubernetes e carecem de recursos avançados de gerenciamento, dependendo das ferramentas usadas para gerenciar a infraestrutura do Kubernetes.
Usando uma loja de segredos
Uma loja de segredos, como o Hashicorp Vault ou o Azure Key Vault, é um software especializado para gerenciar segredos. Ele oferece um sistema de gerenciamento avançado para autorizar usuários, girar chaves de segurança e validar qual aplicativo pode acessar qual segredo.
Eles também fornecem uma API externa, para que possam ser usados em qualquer sistema. Por exemplo, você pode usar o Azure Key Vault em todos os serviços do Azure, incluindo Máquinas Virtuais, Serviços de Aplicativo do Azure, Serviços de Kubernetes do Azure ou Aplicativos Azure Spring.
Uma loja de segredos é a solução mais segura para gerenciar segredos, mas eles exigem o uso de uma ferramenta dedicada.