Segurança

Gestão de Segredos: como proteger API keys e credenciais

Guia prático de gestão de segredos: por que variável de ambiente não basta, como funcionam os secrets managers, rotação de chaves e como evitar vazar credenciais no Git.

Redação Bytezine

Redação Bytezine

09 de setembro de 2026· 9 min de leitura

Gestão de Segredos: como proteger API keys e credenciais

Gestão de segredos (secrets management) é a prática de armazenar, distribuir, rotacionar e revogar com segurança credenciais como API keys, senhas de banco de dados, tokens OAuth e chaves de criptografia. Se sua aplicação [consome a API de um provedor de IA](/artigo/como-consumir-api-anthropic-python), de um banco de dados na nuvem ou de qualquer serviço externo, ela depende de pelo menos um segredo, e a forma como você guarda esse segredo determina se um vazamento vira um incidente controlável ou uma conta invadida com a fatura explodindo da noite para o dia.

O que conta como um segredo

Qualquer credencial que, se exposta, permite a alguém agir como se fosse você ou seu sistema é um segredo. Isso inclui:

  • API keys de serviços de terceiros (provedores de IA, pagamento, e-mail transacional)
  • Tokens de acesso OAuth 2.0 e refresh tokens
  • Senhas e strings de conexão de banco de dados
  • Chaves privadas de criptografia e certificados TLS
  • Segredos de assinatura de webhook (usados para validar que uma requisição realmente veio do remetente esperado)
  • Credenciais de contas de serviço em nuvem (AWS, GCP, Azure)

O fio condutor entre todos esses exemplos: quem possui o segredo tem o mesmo poder que o sistema legítimo que o emitiu. Por isso o objetivo da gestão de segredos não é só "esconder" a credencial, é controlar quem pode acessá-la, por quanto tempo ela vale e como substituí-la rapidamente se vazar. Para entender os fundamentos de como esses valores são protegidos matematicamente em trânsito e em repouso, veja nosso guia de [criptografia de dados](/artigo/criptografia-de-dados-o-que-e-como-funciona).

Por que colocar o segredo direto no código é o primeiro erro

O padrão Twelve-Factor App, referência amplamente adotada para aplicações que rodam na nuvem, define como regra separar configuração (incluindo credenciais) do código-fonte. A recomendação do próprio 12factor.net é guardar configuração em variáveis de ambiente porque elas são fáceis de trocar entre implantações sem alterar código e, diferentemente de arquivos de configuração, dificilmente acabam commitadas por acidente no repositório.

python
# Errado: a chave fica gravada no histórico do Git para sempre,
# mesmo que você a remova em um commit futuro.
API_KEY = "sk-live-4f9a2c8e1b7d3f6a9c0e5b2d8f1a4c7e"

# Certo: a chave vem do ambiente de execução, nunca do código.
import os

API_KEY = os.environ["API_KEY"]
if not API_KEY:
    raise RuntimeError("API_KEY não configurada no ambiente")

Remover a linha com a chave em um commit novo não apaga o segredo do histórico do Git. Uma chave commitada por engano deve ser tratada como comprometida e revogada no provedor — reescrever o histórico é um passo adicional, não um substituto para a revogação.

Variável de ambiente é o mínimo viável, não o ideal

Usar variáveis de ambiente (muitas vezes carregadas de um arquivo .env em desenvolvimento) já resolve o problema de deixar credenciais soltas no código-fonte. Mas isso é apenas o primeiro degrau. Variáveis de ambiente, por padrão, não têm rotação automática, não geram log de quem acessou o valor, ficam visíveis em texto puro para qualquer processo com acesso ao ambiente da aplicação (e frequentemente aparecem inteiras em relatórios de erro ou ferramentas de monitoramento mal configuradas) e não diferenciam automaticamente segredo de desenvolvimento e de produção — é comum a mesma chave circular entre ambientes só porque está no mesmo arquivo .env copiado de máquina em máquina.

  • Nunca commitar o arquivo .env — ele deve estar no .gitignore desde o primeiro commit do projeto
  • Manter um .env.example sem valores reais, apenas com os nomes das variáveis esperadas
  • Usar um valor diferente por ambiente (desenvolvimento, homologação, produção) — nunca reaproveitar a chave de produção localmente

Gerenciadores de segredos dedicados

Para além de variáveis de ambiente, existem serviços construídos especificamente para armazenar, controlar acesso e rotacionar segredos — entre os mais usados estão AWS Secrets Manager, Google Cloud Secret Manager, Azure Key Vault e o HashiCorp Vault (este último com opção self-hosted ou gerenciada). Eles resolvem o que uma variável de ambiente sozinha não resolve: quem acessou o segredo, quando, e com que permissão.

python
import boto3
import json

client = boto3.client("secretsmanager", region_name="us-east-1")
response = client.get_secret_value(SecretId="prod/minha-api/chave")
segredo = json.loads(response["SecretString"])

api_key = segredo["API_KEY"]

O HashiCorp Vault vai além do armazenamento estático e oferece segredos dinâmicos: em vez de guardar uma senha de banco de dados fixa, o Vault gera uma credencial nova, exclusiva para aquela requisição, com um TTL (tempo de vida) configurável, e a revoga automaticamente ao expirar. Isso reduz a janela de exploração se uma credencial vazar — ela deixa de existir antes que alguém consiga reutilizá-la.

Rotação de segredos: por que e com que frequência

Rotacionar um segredo significa substituí-lo por um novo valor periodicamente, mesmo sem evidência de vazamento — o objetivo é limitar quanto tempo uma credencial furtada continua funcionando caso já tenha sido comprometida sem que ninguém tenha percebido. O AWS Secrets Manager, por exemplo, automatiza esse processo chamando uma função Lambda segundo um cronograma definido pelo usuário; a rotação segue etapas padronizadas de criação, configuração, teste e finalização do novo segredo antes de descartar o antigo.

  • Segredos de altíssimo privilégio (acesso root, chaves-mestre): rotação mais frequente e revisão manual
  • Credenciais de serviço usadas por aplicações (API keys de terceiros, senhas de banco): rotação automatizada e programada
  • Qualquer segredo exposto acidentalmente (log, commit, print de tela): rotação imediata, fora do cronograma normal

Rotação e controle de uso andam juntos: um segredo rotacionado com frequência perde valor para quem o rouba, e um segredo protegido por [limites de requisição bem configurados](/artigo/rate-limiting-apis-guia-pratico) reduz o estrago que alguém consegue fazer mesmo antes da rotação acontecer.

Como evitar vazar segredos no controle de versão

A causa mais comum de vazamento de segredo não é um ataque sofisticado — é um commit. O GitHub oferece push protection, um recurso de secret scanning que analisa o conteúdo antes mesmo de aceitar o push: se detecta um padrão de credencial reconhecido, bloqueia o envio e explica o motivo, obrigando quem está commitando a remover o segredo antes de tentar novamente.

Push protection reduz o risco, mas não substitui hooks de pre-commit locais (como git-secrets ou gitleaks) nem a revisão de código — ela é uma última barreira, não a única.

Princípio do menor privilégio aplicado a segredos

O OWASP Secrets Management Cheat Sheet recomenda controle de acesso granular no nível de cada segredo individual, aplicando o princípio do menor privilégio a todo usuário e serviço que precisa tocar no sistema de gestão de segredos — e defende a centralização do armazenamento, provisionamento, auditoria e rotação como forma de reduzir a superfície de vazamento. Na prática isso significa: um serviço que só precisa ler pedidos de um banco de dados não deveria ter a credencial de escrita, e uma chave de API usada apenas por um microsserviço específico não deveria estar acessível a todos os outros serviços do sistema.

Erros comuns que anulam qualquer estratégia de gestão de segredos

  • Reaproveitar a mesma chave de API entre ambiente de desenvolvimento, homologação e produção
  • Deixar um segredo sem data de expiração ou rotação prevista
  • Logar o valor completo de um segredo em mensagens de erro ou ferramentas de observabilidade
  • Colocar uma chave de API sensível em código que roda no navegador (frontend) — qualquer pessoa pode abrir o DevTools e ler o valor
  • Compartilhar segredos de produção por chat ou e-mail em vez de por um cofre com controle de acesso

Se uma chave precisa ser usada em código que roda no navegador, ela nunca deveria ter permissão equivalente a uma chave de backend. A solução correta é um proxy no servidor que guarda o segredo real e expõe ao frontend apenas o necessário, com escopo limitado.

Checklist prático para começar

  • Nenhum segredo real está commitado no repositório (nem no histórico)
  • .env está no .gitignore e existe um .env.example sem valores reais
  • Cada ambiente (dev, homologação, produção) usa credenciais diferentes
  • Segredos de produção estão em um secrets manager, não soltos em variável de ambiente de um servidor
  • Existe um plano de rotação, mesmo que manual, para as credenciais mais sensíveis
  • Push protection ou uma ferramenta equivalente de secret scanning está ativa no repositório

Nenhuma dessas medidas exige reescrever a aplicação do zero — a maior parte é configuração de processo e pode ser adotada de forma incremental, começando pelo item mais barato: tirar qualquer segredo que hoje está hardcoded no código.

Perguntas frequentes

É qualquer credencial que, se exposta, permite que outra pessoa ou sistema aja com a mesma autoridade do dono legítimo — API keys, senhas de banco de dados, tokens OAuth, chaves de criptografia e segredos de assinatura de webhook são exemplos comuns.

#seguranca#api-keys#secrets-management#devops#criptografia#boas-praticas#cloud

Artigos relacionados

TODO DIA · 08:00

Receba o melhor da tecnologia direto no seu e-mail

O que saiu de novo em IA, programação e cloud, resumido. Só chega quando há artigo novo — sem spam e sem e-mail vazio.

bytezine — subscribe

Concordo em receber a newsletter do Bytezine no meu e-mail e posso cancelar quando quiser.