Objetivos de aprendizado
Depois de ler este artigo, você vai conseguir:
- Tirar segredos escritos no código e passá-los para variáveis de ambiente
- Impedir que segredos cheguem ao Git com .gitignore, escaneamento pre-commit e push protection
- Agir do jeito certo quando um segredo já foi commitado
Nesta página
- Por que um segredo escrito no código é um problema?
- Como tirar um segredo do código?
- Como impedir que segredos cheguem ao Git?
- Onde os segredos devem ficar?
- Posso guardar segredos no código do front-end?
- O que fazer se um segredo já foi commitado?
- Como conferir que deu certo?
- Como fazer isso na Square Cloud
- Perguntas frequentes
Segredo é qualquer valor que dá acesso: o token de um bot, a senha do banco, a chave da API de pagamento, uma chave de assinatura. No momento em que um deles entra num commit do Git, você perde o controle sobre ele. Ele é copiado para todo clone, aparece nos diffs e, se o push for público, robôs podem capturá-lo em pouco tempo.
A solução é mais um hábito do que uma ferramenta: o código pede o segredo em tempo de execução, e o segredo mora em outro lugar. Os passos abaixo vão da primeira refatoração até o que fazer quando algo vaza.
Por que um segredo escrito no código é um problema?#
O Git não esquece. Apagar uma linha num commit seguinte deixa o valor antigo no histórico, e o histórico é copiado para todo clone e fork. Repositório privado também não é lugar seguro: mais gente ganha acesso de leitura com o tempo, sistemas de CI imprimem logs e repositórios viram públicos por acidente.
Escrever o segredo no código também amarra código e ambiente. O mesmo arquivo não roda com uma chave de teste no seu computador e uma chave real em produção sem editar o código.
Como tirar um segredo do código?#
Leia o valor de uma variável de ambiente. Antes:
const token = "MTIzNDU2Nzg5MA.fake.token"; // escrito no código: nunca faça issoDepois, em Node.js, com uma checagem que falha logo se o valor não existir:
// index.js
const token = process.env.DISCORD_TOKEN;
if (!token) {
throw new Error("DISCORD_TOKEN is not set");
}O mesmo em Python:
import os
token = os.environ["DISCORD_TOKEN"] # lança KeyError se não existirNo desenvolvimento local, coloque os valores num arquivo .env e carregue-o. O Node.js faz isso nativamente com uma flag (--env-file, disponível desde a v20.6.0 e não mais experimental na v22.21 e na v24.10):
node --env-file=.env index.jsSe o arquivo pode não existir, use --env-file-if-exists=.env (desde a v22.9.0). Sem isso, o Node.js dá erro quando o arquivo falta. Uma variável já definida no ambiente real tem prioridade sobre o arquivo. Veja o arquivo .env para a sintaxe e o carregamento em Python, e variáveis de ambiente para o conceito.
Como impedir que segredos cheguem ao Git?#
Use três camadas, porque cada uma pega o que as outras deixam passar.
1. Ignore o arquivo. Adicione isto ao .gitignore antes de criar o primeiro .env:
.env
.env.*
!.env.exampleDepois commite um .env.example com os nomes das variáveis e valores falsos, para quem trabalha com você saber o que definir:
DISCORD_TOKEN=replace_me
DATABASE_URL=postgresql://user:password@localhost:5432/mydbO .gitignore só vale para arquivos que o Git ainda não rastreia. Se o .env já foi commitado, rode git rm --cached .env antes.
2. Escaneie antes de commitar. O Gitleaks é um scanner open source. Para usá-lo como hook de pre-commit, adicione isto ao .pre-commit-config.yaml (troque o rev pela versão atual, que aparece na página de releases do projeto, ou rode pre-commit autoupdate) e depois rode pre-commit install:
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.30.1
hooks:
- id: gitleaksPara escanear uma vez o histórico inteiro de um repositório que já existe:
gitleaks git -v .Os comandos antigos detect e protect foram descontinuados na v8.19.0 em favor de git, dir e stdin.
3. Bloqueie no servidor. O push protection do GitHub recusa pushes que contêm padrões de segredo reconhecidos. Para usuários, ele vem ligado por padrão em repositórios públicos no GitHub.com. Ativá-lo num repositório cabe a um administrador do repositório ou dono da organização e exige o GitHub Secret Protection. É uma rede de segurança, não substitui as duas primeiras camadas, porque só reconhece os padrões suportados e os personalizados.
Onde os segredos devem ficar?#
Escolha o lugar mais simples para cada etapa:
| Etapa | Onde fica o segredo |
|---|---|
| Desenvolvimento local | Um arquivo .env ignorado, ou o seu shell |
| CI/CD | Os segredos criptografados do provedor de CI, passados ao job como variáveis de ambiente |
| Produção | As configurações de variáveis de ambiente da plataforma de hospedagem, ou um cofre de segredos dedicado |
Um cofre de segredos dedicado acrescenta controle de acesso, logs de auditoria e rotação. Vale a pena quando muitas pessoas ou serviços compartilham credenciais. Para um único bot ou API, as variáveis de ambiente da plataforma costumam bastar.
Duas regras valem em todo lugar. Dê a cada ambiente o seu próprio segredo, para que uma chave de desenvolvimento vazada não alcance a produção. E dê a cada segredo a menor permissão necessária, como um usuário de banco só de leitura para um script de relatórios.
Posso guardar segredos no código do front-end?#
Não. Tudo que é enviado ao navegador é público. O Next.js, por exemplo, embute no bundle JavaScript, durante o build, as variáveis com o prefixo NEXT_PUBLIC_, e faz isso de propósito. Outros frameworks têm prefixos parecidos. Uma chave secreta de pagamento ou a URL de um banco numa variável de front-end fica publicada para todo visitante.
Mantenha os segredos de verdade num servidor e faça o navegador chamar um endpoint seu. Identificadores públicos, como uma chave publicável feita para o cliente, podem ficar no front-end sem problema.
O que fazer se um segredo já foi commitado?#
A ordem importa. Revogue primeiro, limpe depois.
- Revogue ou troque o segredo agora. Gere um token ou senha novos no provedor e atualize o seu deploy. A própria orientação do GitHub coloca isso em primeiro lugar: depois que o valor antigo é revogado, ele não pode mais ser usado, o que pode resolver o problema sozinho.
- Procure uso indevido. Olhe os logs de auditoria ou de uso do provedor em busca de atividade que você não reconhece.
- Tire do histórico, se quiser. Use o git filter-repo para reescrever o histórico e faça um force-push. Peça a quem colabora que clone de novo, senão alguém pode subir os dados antigos outra vez.
- Aceite os limites. Reescrever não limpa outros clones, forks nem visualizações em cache de commits antigos. Por isso o passo 1 é a correção de verdade.
Para os passos exatos depois de um vazamento no GitHub, leia o que fazer quando uma chave de API vaza no GitHub. Uma lista mais ampla de verificações está no checklist de segurança para deploy.
Como conferir que deu certo?#
git ls-files | grep -i "\.env"lista os arquivos env rastreados. Só o.env.exampledeve aparecer.git log -p -S"prefixo-do-segredo"procura no histórico um valor que preocupa você. Use um prefixo, não o segredo inteiro.- Rode
gitleaks git -v .e confirme que ele não aponta vazamentos. - Inicie a aplicação sem a variável definida. Ela deve falhar com o seu erro claro, e não rodar com um valor padrão.
Como fazer isso na Square Cloud#
Na Square Cloud, você define as variáveis de ambiente por aplicação: no painel, pela API, na CLI ou na extensão do VS Code. O painel importa um arquivo .env e exporta as variáveis de volta como KEY=VALUE, então fica fácil manter o arquivo local e a produção sincronizados.
A mudança vale no próximo restart, sem rebuild. O seu código lê os valores do jeito de sempre, por process.env ou os.environ, então nada no código precisa saber onde eles estão guardados. Cada aplicação também recebe a própria variável SQUARECLOUD_APP_ID em tempo de execução.
Como as variáveis são por aplicação, você pode dar a cada app os seus próprios tokens e deixar o .env fora do ZIP ou do repositório que você envia. Saiba mais na página de variáveis de ambiente.
Infraestrutura
Mitigação de DDoS L3/L4/L7 e WAF em todos os planos
Perguntas frequentes
É seguro commitar um segredo num repositório privado?
Não é recomendado. Todo mundo com acesso de leitura, todo clone, todo log de CI e todo colaborador futuro consegue ver, e um repositório pode virar público por engano. Trate o repositório como lugar só de código.
Apagar o segredo num commit novo resolve o vazamento?
Não. O segredo continua no histórico do Git e em todo clone e fork. A única correção de verdade é revogar o segredo e gerar outro. Reescrever o histórico é uma limpeza para depois.
Arquivo .env serve como cofre de segredos?
Não. O .env é texto puro no disco, útil no desenvolvimento local. Em produção, defina as variáveis na sua plataforma de hospedagem ou num cofre de segredos dedicado, e mantenha o arquivo fora do Git.
Posso colocar segredos no código do front-end?
Não. Tudo que vai para o navegador pode ser lido por qualquer visitante. Variáveis com prefixos como NEXT_PUBLIC_ são embutidas no bundle JavaScript de propósito. Mantenha os segredos de verdade num servidor e exponha só um endpoint.
Mais em Segurança
Ver todos os 10 artigos- O que é ataque de força bruta e como se protegerAtaque de força bruta é testar senhas em massa até acertar uma. Veja os tipos (spraying, credential stuffing), como funcionam e as defesas com código que roda.
- Minha aplicação foi invadida: o que fazer agoraSe a sua aplicação foi invadida, contenha o acesso, troque todos os segredos e preserve os logs antes de limpar. Veja a ordem certa, a causa e como voltar.
- Checklist de segurança para quem publica bot, site ou APIChecklist de segurança antes de publicar bot, site ou API: segredos em variáveis de ambiente, dependências, HTTPS, cabeçalhos, permissões mínimas e logs.
- Como proteger seu site ou bot contra DDoSPara se proteger de DDoS, combine mitigação na borda (CDN e WAF) com limite de requisições, timeouts e cache na aplicação. Veja o passo a passo com código.