O que são segredos e como lidar com eles em Java
Os segredos são cadeias de caracteres que não devem ser compartilhadas com o mundo exterior: eles podem ser senhas de banco de dados, chaves de criptografia privadas, tokens de acesso pessoal etc. Para maior segurança, muitas pessoas também acreditam que qualquer coisa que possa ajudar um invasor deve ser considerada um segredo: por exemplo, a URL do banco de dados de produção pode ser vista como um segredo. Seu banco de dados não deve estar acessível publicamente. A lógica é que esse tipo de informação é confidencial por natureza, e quanto menos informações estão disponíveis no código, melhor.
O que é Confiança Zero e Zero Segredos?
O conceito de Confiança Zero é que não se deve confiar cegamente em ninguém nem conceder permissão a qualquer pessoa para acesso dos recursos da empresa sem que ele seja validado e autorizado.
Esse conceito também se aplica aos aplicativos Web: eles não devem ter segredos armazenados no código nem nos binários finais. Isso é o que chamamos de Zero Segredos.
Os segredos devem ser gerenciados por um sistema externo, com regras de acesso estritas e validação, a fim de reduzir o risco de ataques.
Não coloque os segredos em repositórios Git
Mesmo que o repositório Git seja privado, colocar qualquer segredo no código-fonte é uma prática inadequada:
- Qualquer pessoa que tenha acesso ao repositório conhecerá seus dados confidenciais
- Qualquer pessoa com acesso ao binário do aplicativo pode extrair segredos dele
Além disso, depois que um segredo é armazenado no repositório Git, os invasores sempre podem encontrá-lo observando o histórico do repositório, no qual ele pode ficar esquecido por muito tempo.
Mesmo que isso pareça prático, você nunca deve armazenar segredos no repositório de código-fonte. Para evitar esse problema, use ferramentas automáticas que verificam regularmente seu repositório e enviam avisos caso encontrem uma senha ou uma URL de banco de dados armazenada por engano.
Usando variáveis de ambiente
A solução mais fácil para gerenciar os segredos é usar as variáveis de ambiente. Elas trazem vários benefícios:
- São fáceis de usar
- Funcionam em todos os sistemas (mesmo em sistemas locais)
- Todos as conhecem e entendem como elas funcionam
No entanto, elas não são seguras o suficiente: todos os processos no seu sistema podem lê-las, e elas ficarão facilmente expostas com o uso do JMX (Java Management Extensions) em um sistema Java.
Como resultado, as variáveis de ambiente geralmente são vistas como uma primeira etapa para Confiança Zero: elas são mais seguras do que armazenar os segredos diretamente no código-fonte, mas não têm funcionalidades de gerenciamento e são fáceis de serem acessadas pelos invasores.
Como usar 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 elas usem esses segredos de maneira fácil e eficiente.
Esse mecanismo é mais seguro do que as variáveis de ambiente, pois esses arquivos podem ser lidos somente pelo processo que os exige. Eles também se beneficiam do ecossistema sofisticado do Kubernetes e podem ser gerenciados por várias ferramentas de gerenciamento, incluindo as ferramentas fornecidas pelo 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 não têm funcionalidades avançadas de gerenciamento, dependendo das ferramentas usadas para gerenciar a infraestrutura do Kubernetes.
Como usar um repositório de segredos
Um repositório de segredos, como o Hashicorp Vault ou o Azure Key Vault, é um software especializado para gerenciamento de segredos. Ele oferece um sistema de gerenciamento sofisticado para autorizar usuários, girar chaves de segurança além de validar qual aplicativo pode acessar qual segredo.
Também fornece uma API externa, para que possa ser usada em qualquer sistema. Por exemplo, use o Azure Key Vault em todos os serviços do Azure, incluindo as Máquinas Virtuais, os Serviços de Aplicativos do Azure, os Serviços de Kubernetes do Azure ou os Aplicativos Spring do Azure.
Um repositório de segredos é a solução mais segura para gerenciamento de segredos, mas exige o uso de uma ferramenta dedicada.