Olá! Bem-vindo de volta à nossa exploração dos fundamentos do Kubernetes.
Na lição anterior, você dominou o uso de ConfigMaps para gerenciar configurações não confidenciais, um passo crucial para desacoplar a configuração do código da sua aplicação. Enfatizamos que ConfigMaps são ideais para dados que não precisam de proteção. Mas e quanto às senhas de banco de dados, chaves de API, e tokens JWT que suas APIs .NET utilizam? Armazená-los em texto plano em um ConfigMap é uma falha de segurança grave.
O objetivo de hoje é abordar exatamente isso: Gerenciar dados sensíveis usando Secrets.
Nesta lição, vamos mergulhar no objeto Secret do Kubernetes. Você aprenderá a criá-los, consumi-los de diferentes maneiras em seus Pods e, o mais importante, entenderá a realidade da segurança por trás deles e as melhores práticas para protegê-los.
O que é um Kubernetes Secret?
Um Secret é um objeto da API do Kubernetes, muito semelhante a um ConfigMap, projetado especificamente para armazenar pequenas quantidades de dados sensíveis. A intenção é separar informações como senhas, tokens OAuth e chaves SSH do manifesto do seu Pod ou da imagem do contêiner.
Para começar, vamos entender por que os Secrets existem e como eles se comparam ao que você já conhece sobre ConfigMaps e até mesmo sobre o Docker.
Understanding Kubernetes Secrets
Este vídeo do canal "That DevOps Guy" oferece uma excelente introdução ao conceito de Secrets. Ele explica por que eles são necessários e estabelece uma analogia com os mecanismos de passagem de dados sensíveis no Docker, como volumes e variáveis de ambiente, com os quais você já teve contato.
Assista do início até 12:48. Concentre-se nos seguintes pontos: A justificativa para a existência de um objeto separado para dados sensíveis. A analogia com docker run -v (montagem de volume) e docker run -e (variáveis de ambiente) para passar dados para um contêiner. O Kubernetes automatiza esse processo em escala.
A Fina Linha Entre Secret e ConfigMap
Tanto Secrets quanto ConfigMaps funcionam como armazenamentos de chave-valor. A principal diferença não está em como eles armazenam os dados inicialmente, mas em como o Kubernetes é projetado para tratá-los:
- Intenção: Um
Secretsinaliza que os dados são confidenciais. - Tratamento pelo Cluster: O Kubernetes evita exibir dados de
Secretem logs ou na UI do Dashboard sem autorização explícita. - Segurança Adicional: Um cluster pode ser configurado para criptografar os dados de
Secretem repouso (noetcd), algo que geralmente não é feito paraConfigMaps.
A Realidade da Segurança: Codificação vs. Criptografia
Aqui está o ponto mais crítico que você precisa entender desde o início: por padrão, os dados em um Secret do Kubernetes são apenas codificados em Base64, não criptografados.

Base64 é um esquema de codificação para representar dados binários em formato de texto. Qualquer pessoa que possa ler o Secret pode facilmente decodificar seus dados. A segurança real dos Secrets não vem da ofuscação em Base64, mas do controle de acesso (RBAC) e de camadas adicionais de segurança que discutiremos mais adiante.
Effective Kubernetes secrets management: a hands-on guide
Este artigo do Spectrocloud reforça esse ponto crucial e demonstra quão trivial é decodificar um Secret.
Leia a seção "The challenge: Kubernetes secrets are not inherently secure". Preste atenção no comando de uma linha que recupera e decodifica um secret, revelando o conteúdo em texto plano. Isso solidificará sua compreensão de que Base64 não é uma medida de segurança.
Criando Secrets
Assim como ConfigMaps, você pode criar Secrets de forma imperativa (kubectl) ou declarativa (YAML).
Método Declarativo (YAML)
Esta é a abordagem recomendada para infraestrutura como código (IaC). A estrutura do manifesto é muito parecida com a de um ConfigMap.
# db-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: my-app-secrets
type: Opaque # O tipo mais comum, para dados arbitrários
stringData:
# Chaves e valores em texto plano. O Kubernetes irá codificá-los para Base64.
ConnectionStrings__DefaultConnection: "Server=postgres-service;Database=mydotnetdb;User Id=appuser;Password=S3cr3tP@ssw0rd!"
JwtSettings__Key: "uma-chave-secreta-muito-longa-e-segura-para-jwt"
Observe o campo stringData. Ele permite que você forneça os valores em texto plano, o que é muito mais conveniente. Quando você aplica este manifesto, o Kubernetes converte automaticamente esses valores para Base64 e os armazena no campo data.
Para criar o Secret:kubectl apply -f db-secret.yaml
Para inspecioná-lo e ver a versão codificada em Base64:kubectl get secret my-app-secrets -o yaml
Você verá um campo data com valores que parecem aleatórios. Você pode decodificá-los manualmente:echo 'U2VydmVyPW...' | base64 --decode
Consumindo Secrets em Pods
A mecânica de consumo de Secrets é idêntica à de ConfigMaps. Seus contêineres .NET podem acessá-los de duas maneiras principais.

Método 1: Como Variáveis de Ambiente
Esta é uma abordagem muito comum para injetar configurações como connection strings ou chaves de API, que sua aplicação .NET pode ler facilmente através do IConfiguration.
Dado seu background em .NET, o exemplo a seguir será muito familiar. Ele mostra como injetar todos os pares chave-valor do nosso Secret como variáveis de ambiente no contêiner da sua API.
How to Set Up Kubernetes for .NET Applications
Este artigo no OneUptime mostra um exemplo prático e completo para uma aplicação .NET. Ele cobre a criação do Secret, sua injeção no Deployment e como o código C# os consome.
Foque nestas três partes do artigo: Secrets Management: Observe o formato do secrets.yaml, especialmente como as chaves (ConnectionStrings__DefaultConnection) correspondem ao formato de configuração do .NET. Kubernetes Deployment: No deployment.yaml, encontre o bloco envFrom que referencia secretRef. É assim que os segredos são injetados. Using Configuration in .NET: Veja o Program.cs. O método .AddEnvironmentVariables() é o que permite que sua aplicação leia os segredos injetados pelo Kubernetes sem esforço.
No Program.cs de sua aplicação ASP.NET Core, o provedor de configuração de variáveis de ambiente mapeia automaticamente as chaves. Por exemplo, a variável de ambiente ConnectionStrings__DefaultConnection (com dois underscores) é corretamente interpretada como a seção ConnectionStrings e a chave DefaultConnection no appsettings.json.
Lembre-se do ponto crucial da lição anterior: variáveis de ambiente são imutáveis. Se você atualizar o Secret, os Pods em execução não verão a mudança. Você precisaria reiniciá-los.
Método 2: Como Arquivos em um Volume
Este método é ideal para dados que são inerentemente arquivos, como certificados TLS (.crt, .key) ou um arquivo google-credentials.json. Cada chave no Secret se torna um arquivo no diretório montado.
A sintaxe no manifesto do Deployment é a mesma que você viu para ConfigMaps:
spec:
containers:
- name: my-dotnet-api
image: my-registry/my-dotnet-api:v1.0
volumeMounts:
- name: tls-certs-volume
mountPath: "/etc/ssl/certs"
readOnly: true
volumes:
- name: tls-certs-volume
secret:
secretName: my-tls-secret # Nome do Secret contendo os arquivos .crt e .key
A grande vantagem aqui, como vimos com ConfigMaps, é que os arquivos montados a partir de um Secret são atualizados dinamicamente. Se o Secret for atualizado, o Kubernetes propagará a mudança para os arquivos dentro dos Pods em execução após um curto período, sem a necessidade de um reinício.
Teste seu entendimento!
Sua aplicação .NET precisa de uma connection string para o PostgreSQL e de um arquivo de certificado TLS para se comunicar com outro serviço. Você cria um único Secret com duas chaves: DB_CONNECTION e tls.crt. Como você forneceria esses dois dados ao seu Pod e por quê?
Show answer
A abordagem ideal seria usar ambos os métodos de consumo:
- Connection String (
DB_CONNECTION): Injete-a como uma variável de ambiente usandovalueFromesecretKeyRef. Este é um padrão comum e se integra perfeitamente com o provedor de configuraçãoIConfigurationdo .NET (AddEnvironmentVariables). - Certificado (
tls.crt): Monte oSecretcomo um volume em um caminho conhecido dentro do contêiner (ex:/etc/certs/). A aplicação pode então ser configurada para ler o arquivo do certificado diretamente do sistema de arquivos. Tentar injetar o conteúdo de um arquivo de certificado em uma variável de ambiente é impraticável e propenso a erros.
Estratégias de Segurança para Secrets
Como vimos, o Base64 não oferece segurança real. A proteção dos seus Secrets depende de outras camadas.
Understanding Kubernetes Secrets
Para concluir, vamos explorar as estratégias de segurança mais robustas. Este segmento final do vídeo "That DevOps Guy" introduz conceitos mais avançados que são cruciais em ambientes de produção.
Assista de 33:43 até o final. Preste atenção na discussão sobre: Criptografia em Repouso (Encryption at Rest): A capacidade do Kubernetes de criptografar os dados do Secret no etcd. RBAC (Role-Based Access Control): O principal mecanismo para controlar quem pode acessar os Secrets. Gerenciadores de Segredos Externos: A menção de ferramentas como HashiCorp Vault e serviços de nuvem (AWS Secrets Manager, Azure Key Vault), que representam o padrão ouro para o gerenciamento de segredos.
Resumindo as estratégias de segurança para Secrets:
- Controle de Acesso Baseado em Função (RBAC): Esta é a sua primeira e mais importante linha de defesa. Use as políticas do RBAC para garantir que apenas os
ServiceAccountsdos Pods que realmente precisam de umSecrettenham permissão para lê-lo. Siga o princípio do menor privilégio. - Criptografia em Repouso (Encryption at Rest): Configure seu cluster Kubernetes (ou use um serviço gerenciado como EKS, AKS ou GKE que já o faça) para criptografar o conteúdo do
etcd, o banco de dados do cluster. Isso protege seusSecretscaso alguém ganhe acesso direto ao armazenamento doetcd. - Gerenciadores de Segredos Externos: Para a máxima segurança e conformidade, as organizações usam ferramentas externas como HashiCorp Vault ou os gerenciadores de segredos nativos da nuvem (AWS Secrets Manager, Azure Key Vault, Google Secret Manager). Operadores do Kubernetes, como o External Secrets Operator, podem sincronizar esses segredos externos de forma segura para dentro do seu cluster.
Conclusão
Parabéns! Você agora entende como gerenciar dados sensíveis no Kubernetes. Esta é uma habilidade fundamental para qualquer desenvolvedor que trabalha com aplicações em contêineres.
Principais Pontos:
- Secrets são para dados sensíveis: Use-os para senhas, tokens e chaves, em vez de
ConfigMaps. - Base64 NÃO é criptografia: É apenas uma codificação. Qualquer pessoa com acesso pode decodificá-lo.
- Dois métodos de consumo: Injeção como variáveis de ambiente (estático, requer reinício do Pod para atualizar) ou montagem como volumes (dinâmico, atualiza automaticamente).
- A segurança real vem em camadas: A base é o RBAC, fortalecida pela criptografia em repouso e, para necessidades avançadas, por gerenciadores de segredos externos.
Próxima Lição:
Agora que sabemos como gerenciar tanto a configuração (ConfigMaps) quanto os segredos (Secrets), estamos prontos para começar a pensar em implantações no mundo real. A próxima lição, "Deploying .NET Aspire Applications to the Cloud", começará a juntar essas peças, preparando nossa imagem de aplicação para ser implantada em serviços como Render e Amazon ECR, onde o gerenciamento de segredos é uma realidade diária.