Melhores Práticas para Gerenciar Segredos e Dados Sensíveis em Clusters Kubernetes
Proteja Segredos do Kubernetes com RBAC, criptografia etcd, montagens seguras, armazenamentos externos de segredos, CSI Driver e rotação.
Melhores Práticas para Gerenciar Segredos e Dados Sensíveis em Clusters Kubernetes
Os Segredos do Kubernetes são convenientes, mas não são automaticamente seguros apenas porque o objeto é chamado de Secret. Se seu RBAC for muito amplo ou o etcd não estiver criptografado, um token vazado pode expor senhas de banco de dados, chaves de API e certificados privados em todo o seu cluster.
Use os Segredos do Kubernetes como uma camada, depois adicione criptografia, controle de acesso, padrões de injeção mais seguros e armazenamentos externos de segredos onde o risco justificar.
Entendendo os Segredos do Kubernetes: O Mecanismo Padrão
O Kubernetes introduz o objeto Secret projetado especificamente para armazenar informações sensíveis. Embora útil, é crucial entender suas limitações e comportamento padrão em relação à segurança.
Comportamento Padrão e Riscos
Por padrão, os Segredos do Kubernetes não são criptografados em repouso dentro do etcd, o armazenamento de apoio do cluster para todos os dados de configuração. Eles são apenas codificados em Base64, o que oferece nenhuma criptografia real. Qualquer pessoa com acesso ao banco de dados etcd (por exemplo, administradores do cluster, nós comprometidos) pode decodificar facilmente esses valores.
Aviso: Nunca confie apenas no objeto Secret padrão do Kubernetes para dados altamente sensíveis sem aplicar medidas de criptografia.
Codificação Base64 vs. Criptografia
É um equívoco comum pensar que a codificação Base64 fornece segurança. Base64 é um esquema de codificação, não um esquema de criptografia. É facilmente reversível:
# Exemplo de decodificação de um valor de Secret do Kubernetes
echo 'c3VwZXItc2VjcmV0Cg==' | base64 -d
# Saída: super-secret
Camada 1: Protegendo Segredos em Repouso (Criptografia etcd)
O passo mais fundamental para proteger Segredos é garantir que eles estejam criptografados na camada de armazenamento (etcd). Isso protege os dados mesmo se o banco de dados subjacente for acessado diretamente.
Habilitando Criptografia em Repouso
A criptografia em repouso é configurada através do servidor de API do Kubernetes usando um objeto EncryptionConfiguration. Esta configuração especifica quais provedores devem ser usados para criptografar vários tipos de dados armazenados no etcd, incluindo secrets.
Componentes Chave da Configuração de Criptografia:
kind: EncryptionConfiguration: Declara o tipo de recurso.resources: Especifica quais recursos da API devem ser criptografados.providers: Define o mecanismo de criptografia. Provedores comuns incluemaescbc,aesgcme provedores KMS (como AWS KMS ou GCP KMS).
Melhor Prática: Use um provedor KMS quando sua plataforma suportar. Se você usar chaves locais, gerencie a rotação de chaves cuidadosamente e mantenha chaves antigas disponíveis até que os dados existentes tenham sido re-criptografados.
Camada 2: Protegendo Segredos em Trânsito e em Uso
Enquanto a criptografia etcd resolve o problema 'em repouso', os Segredos ainda são descriptografados pelo Kubelet quando montados em um Pod. Devemos controlar como e onde esses segredos aparecem.
Estratégia 1: Montagem de Volume de Segredos
A maneira padrão de injetar dados de Secret em um contêiner é montando-o como um volume (muitas vezes resultando em um arquivo no sistema de arquivos do contêiner).
apiVersion: v1
kind: Pod
metadata:
name: secure-app
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/config/db"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: my-sensitive-secret
Consideração de Segurança: Volumes de Secret montados são geralmente apoiados por tmpfs em nós Linux, mas os valores ainda são visíveis para o processo do contêiner e para qualquer pessoa com acesso suficiente ao nó ou Pod. Use readOnly: true, evite despejar variáveis de ambiente ou arquivos de configuração em logs e restrinja o acesso ao shell em Pods de produção.
Estratégia 2: Variáveis de Ambiente (Desencorajado para Alta Sensibilidade)
Embora conveniente, usar variáveis de ambiente originadas de Segredos é geralmente desencorajado para segredos de alto valor. Variáveis de ambiente podem ser facilmente vazadas através de:
- Logs de contêiner gerados por aplicações mal configuradas.
- Leitura de
/proc/1/environde dentro do contêiner ou de outros contêineres privilegiados. - Ferramentas de inspeção de contêiner.
Use variáveis de ambiente apenas para dados de configuração de baixa sensibilidade, se for necessário usá-las.
Camada 3: Gerenciamento Avançado com Armazenamentos Externos de Segredos
O padrão mais seguro envolve manter dados sensíveis totalmente fora do plano de controle do Kubernetes (etcd) e recuperá-los dinamicamente em tempo de execução usando ferramentas especializadas.
Usando Operadores de Segredos Externos
Os Operadores de Segredos Externos preenchem a lacuna entre um segredo armazenado com segurança em um cofre dedicado (como HashiCorp Vault, AWS Secrets Manager, Azure Key Vault) e o objeto Secret nativo do Kubernetes.
- Armazenamento: O segredo real vive apenas no cofre externo.
- Sincronização/Injeção: Um operador observa um recurso personalizado (como
ExternalSecret) e busca os dados do cofre. - Criação: O operador então cria um objeto
Secretpadrão do Kubernetes localmente, que pode então ser montado nos Pods.
Benefício: A fonte da verdade permanece fora do cluster, o que melhora a rotação e a auditabilidade. No entanto, o Secret sincronizado do Kubernetes ainda existe no cluster, então você ainda precisa de RBAC, criptografia etcd e isolamento de namespace.
Usando o Driver CSI do Secrets Store
Para aplicações que precisam de acesso direto e efêmero sem armazenar o segredo localmente no etcd, o Driver CSI do Secrets Store é a escolha superior.
- O driver utiliza um provedor (por exemplo, provedor Vault, provedor Azure).
- Ele monta o segredo diretamente do armazenamento externo no sistema de arquivos do Pod como um volume temporário, evitando a necessidade de escrever os dados do segredo no etcd.
Isso oferece o mais alto nível de segurança, eliminando completamente o segredo do banco de dados etcd.
Melhores Práticas Operacionais para Gerenciamento de Segredos
Além dos mecanismos técnicos de armazenamento, a higiene operacional é crucial para manter uma postura segura.
1. Princípio do Menor Privilégio (PoLP)
Garanta que a Conta de Serviço associada a um Pod tenha apenas permissões para ler o Secret específico de que precisa, e nenhum outro. Use o Controle de Acesso Baseado em Funções (RBAC) para restringir rigidamente as permissões.
2. Rotacione Segredos Frequentemente
Implemente cronogramas de rotação automatizados para todas as credenciais. Segredos de longa duração aumentam a janela de oportunidade para comprometimento. Ferramentas integradas com cofres externos geralmente lidam com essa rotação automaticamente.
3. Audite e Monitore o Acesso
Configure o registro de auditoria para rastrear quem lê ou modifica objetos Secret. Ferramentas que se integram com cofres externos (como Agentes Vault ou drivers CSI) também devem registrar tentativas de acesso ao armazenamento externo.
4. Nunca Comprometa Segredos no Git
Esta é uma regra fundamental. Nunca armazene segredos brutos ou mesmo codificados em Base64 em repositórios Git, mesmo em privados. Use ferramentas como git-secrets ou ferramentas de modelagem de gerenciamento de configuração (como Helm ou Kustomize) combinadas com mecanismos externos de injeção de segredos para gerenciar manifestos de implantação.
Exemplo usando Kustomize (Referência Externa):
Ao usar modelagem, você pode usar espaços reservados em seus arquivos de manifesto e confiar em uma etapa de construção ou pipeline CI/CD para injetar os valores reais do segredo recuperados com segurança de um cofre antes de aplicar o YAML ao cluster.
Comparação de Estratégias de Gerenciamento
| Estratégia | Nível de Segurança | Exposição etcd? | Complexidade | Melhor Para |
|---|---|---|---|---|
| Secret K8s Padrão (Sem criptografia etcd) | Muito Baixo | Sim (Texto Simples) | Baixa | Apenas testes temporários |
| Secret K8s com Criptografia etcd | Médio | Sim (Criptografado) | Médio | Dados de configuração gerais |
| Operador de Segredos Externos | Alto | Sim (Secret gerenciado pelo Operador) | Alto | Padronização do gerenciamento de segredos |
| Driver CSI do Secrets Store | Mais Alto | Não (Montagem Direta) | Alto | Credenciais e tokens altamente sensíveis |
Comece habilitando a criptografia etcd e apertando o RBAC. Depois decida se cada carga de trabalho pode usar Segredos sincronizados, montagens CSI diretas ou credenciais dinâmicas de um cofre externo. A melhor configuração é aquela que limita quem pode ler o segredo, onde ele é armazenado e por quanto tempo permanece útil após a exposição.