Configuração e Segredos
Variáveis de ambiente, config maps, gerenciamento seguro de segredos e ferramentas como o Vault para proteger dados sensíveis.
O princípio: separar configuração do código
Uma das regras fundamentais do deploy moderno é que a configuração não deve viver no código. O mesmo artefato (imagem Docker, binário, bundle) deve poder ser executado em qualquer ambiente — a única coisa que muda é a configuração.
Isso inclui:
- URLs de bancos de dados e serviços externos
- Credenciais e tokens de acesso
- Feature flags e parâmetros de comportamento
- Níveis de logging e timeouts
- Chaves de API de terceiros
Variáveis de ambiente
As variáveis de ambiente são o mecanismo mais básico e universal para injetar configuração em uma aplicação.
Vantagens
- Suportadas por todas as linguagens e plataformas
- Fáceis de configurar em contêineres, CI/CD e provedores de nuvem
- Não exigem bibliotecas adicionais
Boas práticas
# Nombres descriptivos en UPPER_SNAKE_CASE
DATABASE_URL=postgres://user:pass@host:5432/db
REDIS_URL=redis://localhost:6379
LOG_LEVEL=info
API_TIMEOUT_MS=5000
FEATURE_NEW_CHECKOUT=true
- Usar um arquivo
.env.exampleno repositório documentando todas as variáveis necessárias (sem valores reais) - Nunca commitar arquivos
.envcom valores reais - Validar as variáveis ao iniciar a aplicação — falhar rápido se faltar alguma obrigatória
Validação na inicialização
function validateEnv() {
const required = ['DATABASE_URL', 'REDIS_URL', 'JWT_SECRET'];
const missing = required.filter(key => !process.env[key]);
if (missing.length > 0) {
throw new Error(`Missing env vars: ${missing.join(', ')}`);
}
}
ConfigMaps no Kubernetes
No Kubernetes, os ConfigMaps permitem armazenar configuração não sensível como pares chave-valor e montá-los nos pods.
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
LOG_LEVEL: "info"
API_TIMEOUT: "30s"
MAX_CONNECTIONS: "100"
FEATURE_FLAGS: |
{
"newCheckout": true,
"darkMode": false
}
Injetar como variáveis de ambiente
spec:
containers:
- name: my-app
envFrom:
- configMapRef:
name: app-config
Montar como arquivo
spec:
containers:
- name: my-app
volumeMounts:
- name: config-volume
mountPath: /app/config
volumes:
- name: config-volume
configMap:
name: app-config
Gerenciamento de segredos
Os segredos (senhas, tokens, chaves privadas) exigem um tratamento especial. Nunca devem estar em:
- No código-fonte
- Arquivos de configuração commitados
- Logs da aplicação
- Imagens Docker
Kubernetes Secrets
O Kubernetes oferece um recurso Secret para dados sensíveis:
apiVersion: v1
kind: Secret
metadata:
name: app-secrets
type: Opaque
stringData:
DATABASE_PASSWORD: "mi-password-seguro"
JWT_SECRET: "mi-jwt-secret"
API_KEY: "mi-api-key"
Limitação importante: os Secrets do Kubernetes são armazenados no etcd codificados em base64, mas não estão criptografados por padrão. Para maior segurança, habilitar encryption at rest ou usar um gerenciador de segredos externo.
HashiCorp Vault
O Vault é a ferramenta mais popular para gerenciamento centralizado de segredos:
- Armazenamento seguro: os segredos são criptografados em repouso
- Acesso controlado: políticas granulares de quem pode ler quais segredos
- Rotação automática: os segredos podem ser rotacionados sem realizar novo deploy
- Auditoria: registro completo de quem acessou qual segredo e quando
- Segredos dinâmicos: gera credenciais temporárias sob demanda (ex: credenciais de BD que expiram em 1 hora)
Outras ferramentas
- AWS Secrets Manager: gerenciamento de segredos nativo na AWS com rotação automática
- Google Secret Manager: equivalente no GCP
- Azure Key Vault: equivalente no Azure
- SOPS: criptografa arquivos de configuração que podem ser commitados de forma segura
Rotação de segredos
Os segredos devem ser rotacionados periodicamente para minimizar o impacto de um vazamento:
- Gerar novo segredo: criar a nova credencial no gerenciador de segredos
- Atualizar a aplicação: a aplicação lê o novo segredo (idealmente sem reinício)
- Verificar o funcionamento: confirmar que tudo funciona com o novo segredo
- Revogar o segredo anterior: eliminar a credencial antiga
Rotação sem downtime
Para rotacionar segredos sem downtime, a aplicação deve suportar dual credentials temporariamente:
- Aceitar tanto o segredo antigo quanto o novo durante um período de transição
- Uma vez confirmado que tudo funciona, revogar o antigo
Boas práticas gerais
- Princípio do menor privilégio: cada serviço acessa apenas os segredos de que precisa
- Não logar segredos: sanitizar os logs para que nunca exibam credenciais
- Criptografar em trânsito e em repouso: TLS para comunicação, encryption at rest para armazenamento
- Auditar acessos: registrar quem acessa quais segredos e quando
- Automatizar a rotação: não depender de processos manuais para rotacionar credenciais
- Separar configuração de segredos: a configuração não sensível vai em ConfigMaps, os segredos em um gerenciador dedicado
Resumo
A configuração e os segredos são aspectos críticos do deploy. As variáveis de ambiente e os ConfigMaps gerenciam a configuração não sensível, enquanto ferramentas como o Vault, o AWS Secrets Manager ou os Kubernetes Secrets protegem os dados sensíveis. A chave é separar a configuração do código, validar na inicialização e rotacionar segredos periodicamente.