Gerenciamento de segredos avançado
LidoNesta aula avançada sobre gerenciamento de segredos, você aprenderá a implementar vaults, rotação automática, injeção segura e auditoria em ambientes DevOps. Serão apresentados conceitos, ferramentas e exemplos práticos para proteger credenciais e dados sensíveis, garantindo conformidade e segurança.
O gerenciamento de segredos é uma área crítica em DevOps, pois envolve a proteção de credenciais, chaves de API, tokens e outras informações sensíveis utilizadas por aplicações e infraestrutura. Em um ambiente moderno, onde a automação e a escalabilidade são essenciais, gerenciar segredos de forma eficaz e segura é fundamental para evitar vazamentos e ataques.
Nesta aula, vamos explorar conceitos avançados de gerenciamento de segredos, incluindo a utilização de vaults (cofres), estratégias de rotação automática, técnicas de injeção segura em aplicações e a importância da auditoria para rastrear o acesso e o uso de segredos. Você verá exemplos práticos e ferramentas como HashiCorp Vault, AWS Secrets Manager e Kubernetes Secrets, além de boas práticas para implementar em seus projetos.
Vaults
Um vault (cofre) é um sistema centralizado para armazenar, acessar e gerenciar segredos de forma segura. Ele fornece uma interface unificada para armazenar credenciais, chaves, tokens e outros dados sensíveis, com controle de acesso baseado em políticas e criptografia forte em repouso e em trânsito. Ao contrário de armazenar segredos em variáveis de ambiente ou arquivos de configuração, um vault permite que você centralize a gestão, reduza a exposição e implemente práticas como rotação e auditoria.
Uma das ferramentas mais populares é o HashiCorp Vault, que oferece recursos como segredos dinâmicos, criptografia como serviço, e integração com diferentes backends de armazenamento. Outros exemplos incluem AWS Secrets Manager, Azure Key Vault e Google Cloud Secret Manager. A escolha do vault depende do seu ambiente e necessidades, mas os princípios são semelhantes.
Exemplo de configuração do Vault para armazenar um segredo estático:
# Inicializar o Vault (primeira vez)
vault operator init
# Desbloquear o Vault (com as chaves geradas)
vault operator unseal <chave1>
vault operator unseal <chave2>
vault operator unseal <chave3>
# Autenticar (com token root)
vault login <token_root>
# Habilitar o KV (Key-Value) secrets engine
vault secrets enable -path=secret kv-v2
# Armazenar um segredo
vault kv put secret/minha-aplicacao DATABASE_PASSWORD="senha_super_secreta"
# Ler o segredo
vault kv get secret/minha-aplicacao
Com o Vault, você pode criar políticas de acesso granulares, como permitir que apenas determinados serviços leiam certos segredos. Isso é feito através de arquivos de política em HCL:
# política.hcl
path "secret/data/minha-aplicacao" {
capabilities = ["read"]
}
E aplicar com:
vault policy write minha-politica politica.hcl
Rotação automática
Rotação automática é o processo de substituir segredos periodicamente ou sob demanda, sem intervenção manual. Isso reduz o risco de comprometimento, pois mesmo que um segredo vaze, ele tem validade curta. Em ambientes DevOps, a rotação pode ser integrada ao ciclo de vida da aplicação, garantindo que as credenciais sejam atualizadas automaticamente.
Ferramentas como Vault oferecem segredos dinâmicos, como credenciais de banco de dados geradas sob demanda com TTL (time-to-live). Quando o TTL expira, o segredo é revogado automaticamente. Exemplo com Vault e PostgreSQL:
# Configurar o backend de banco de dados no Vault
vault secrets enable database
vault write database/config/minha-db \
plugin_name=postgresql-database-plugin \
allowed_roles="meu-role" \
connection_url="postgresql://{{username}}:{{password}}@localhost:5432/mydb" \
username="vault" \
password="senha_vault"
# Criar um role que gera credenciais com TTL
vault write database/roles/meu-role \
db_name=minha-db \
creation_statements="CREATE USER \"{{name}}\" WITH PASSWORD '{{password}}' VALID UNTIL '{{expiration}}';" \
default_ttl="1h" \
max_ttl="24h"
# Gerar credenciais dinâmicas
vault read database/creds/meu-role
Para segredos estáticos, a rotação pode ser feita via scripts ou ferramentas de automação (como Ansible, Terraform). Por exemplo, no AWS Secrets Manager, você pode configurar a rotação automática com uma função Lambda:
# Exemplo de CLI da AWS para listar rotação
aws secretsmanager describe-secret --secret-id minha-senha
É importante definir políticas de rotação adequadas: frequência, janelas de manutenção e integração com os consumidores para que eles busquem o novo valor.
Injeção segura
Injeção segura refere-se à forma como os segredos são entregues às aplicações em tempo de execução, sem expô-los em logs, código-fonte ou imagens de contêiner. O objetivo é fornecer segredos apenas quando necessário e de forma controlada, minimizando a superfície de ataque.
Existem várias técnicas de injeção:
- Variáveis de ambiente: embora comum, não é a mais segura, pois podem ser visíveis em processos e logs.
- Arquivos montados em volumes: segredos são montados como arquivos em contêineres, com permissões restritas.
- Agentes sidecar: um contêiner auxiliar que busca segredos do vault e os injeta na aplicação principal.
- APIs de segredos: a aplicação consulta o vault diretamente, usando autenticação mútua.
No Kubernetes, você pode usar volumes de segredos ou a integração com o Vault via CSI (Container Storage Interface). Exemplo de pod com volume de segredos:
apiVersion: v1
kind: Pod
metadata:
name: minha-app
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: secrets
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secrets
secret:
secretName: minha-senha
Com o Vault Agent Injector (sidecar), você pode anotar o pod e o agente cuida da injeção:
# Anotação no deployment
metadata:
annotations:
vault.hashicorp.com/agent-inject: "true"
vault.hashicorp.com/role: "minha-politica"
vault.hashicorp.com/agent-inject-secret-database-password: "secret/data/minha-aplicacao"
Essas técnicas garantem que os segredos não fiquem expostos no sistema de arquivos da imagem ou em logs.
Auditoria
Auditoria é o registro e monitoramento de todas as operações relacionadas a segredos: quem acessou, quando, de onde, e o que foi feito. Isso é essencial para conformidade (como SOC 2, GDPR) e para detectar atividades suspeitas.
O Vault possui um dispositivo de auditoria que registra eventos. Você pode habilitar múltiplos backends, como arquivo, syslog ou socket.
# Habilitar auditoria em arquivo
vault audit enable file file_path=/var/log/vault-audit.log
# Habilitar auditoria em syslog
vault audit enable syslog tag="vault"
Os logs de auditoria incluem informações como:
- Data e hora
- Token de autenticação (ou entidade)
- Operação (read, write, delete)
- Caminho do segredo
- Endereço IP de origem
No AWS Secrets Manager, você pode usar o CloudTrail para auditar chamadas de API. Exemplo de consulta:
aws cloudtrail lookup-events --lookup-attributes AttributeKey=EventName,AttributeValue=GetSecretValue
É recomendável centralizar os logs de auditoria em um SIEM (como Splunk, ELK) e configurar alertas para comportamentos anômalos, como acessos fora do horário comercial ou múltiplas tentativas falhas.
Boas práticas e observações finais
Ao implementar gerenciamento avançado de segredos, considere:
- Princípio do menor privilégio: conceda apenas as permissões necessárias.
- Criptografe segredos em repouso e em trânsito.
- Automatize a rotação sempre que possível.
- Evite segredos no código-fonte ou em imagens de contêiner.
- Monitore e audite continuamente.
- Tenha um plano de resposta a incidentes para vazamento de segredos.
- Use ferramentas de varredura de segredos (como git-secrets, truffleHog) no CI/CD.
Lembre-se de que o gerenciamento de segredos é um processo contínuo, não uma configuração única. Revise e atualize suas políticas regularmente.
Referências
- Documentação oficial do HashiCorp Vault
- AWS Secrets Manager User Guide
- Kubernetes Secrets Documentation
- HashiCorp Learn - Vault Tutorials
- Azure Key Vault Documentation
- Google Cloud Secret Manager Documentation
Exercícios
- Explique a diferença entre um segredo estático e um segredo dinâmico em um vault. Dê um exemplo de quando cada um é apropriado.
- Como você implementaria a rotação automática de segredos em uma aplicação que roda em Kubernetes usando o Vault? Descreva os passos e componentes envolvidos.
- Qual é a diferença entre injetar segredos via variáveis de ambiente e via arquivos montados? Quais são as vantagens e desvantagens de cada método?
- Descreva um cenário em que a auditoria de segredos ajudou a detectar uma violação de segurança. Como você configuraria alertas para esse cenário?
- Implemente um script em bash que use o Vault CLI para criar uma política que permita leitura apenas de um caminho específico e, em seguida, gere um token com essa política. Explique cada comando.
#!/bin/bash
# Define a política em um arquivo temporário
cat > /tmp/politica.hcl <<EOF
path "secret/data/minha-aplicacao" {
capabilities = ["read"]
}
EOF
# Cria a política no Vault
vault policy write minha-politica /tmp/politica.hcl
# Gera um token com essa política
vault token create -policy=minha-politica
Explicação: O primeiro bloco cria um arquivo de política com permissão de leitura para o caminho especificado. O comando `vault policy write` carrega essa política no Vault. O comando `vault token create` gera um novo token associado a essa política, que pode ser usado por uma aplicação para ler o segredo.