Desenvolvimento · Segurança

Variáveis de ambiente e segredos: como não vazar senhas e chaves de API

Edson Feitosa de Oliveira Junior
Edson Feitosa de Oliveira Junior Fundador e Engenheiro Líder · PruPru Digital Services

Variáveis de ambiente são o lugar certo para senhas de banco de dados, chaves de API de pagamento, tokens de serviços de e-mail e segredos de assinatura de JWT, que nunca deveriam estar no código-fonte. Mesmo assim, segredos vazados em repositórios estão entre as causas mais comuns de incidentes de segurança, porque robôs varrem repositórios públicos continuamente em busca de chaves e as exploram em minutos. A boa prática é simples: o código fica no repositório, a configuração sensível fica no ambiente.

O princípio: código e configuração separados

A mesma aplicação roda em ambientes diferentes (sua máquina, testes, produção), com bancos e chaves diferentes. Tudo o que muda entre ambientes, e principalmente o que é secreto, deve vir de fora do código, por variáveis de ambiente ou por um gerenciador de segredos.

O que costuma ser segredo:

Arquivo .env no desenvolvimento

No desenvolvimento local, é comum usar um arquivo .env:

DB_URL=jdbc:postgresql://localhost:5432/loja
DB_USER=loja
DB_PASSWORD=senha-local-de-teste
JWT_SECRET=troque-por-um-valor-longo-e-aleatorio

Regras essenciais:

  1. Adicione .env ao .gitignore antes do primeiro commit.
  2. Crie um .env.example com os nomes das variáveis e valores fictícios, e versione esse arquivo. Ele documenta o que a aplicação precisa.
  3. Use valores diferentes em cada ambiente. A senha de produção nunca deve estar na máquina de desenvolvimento.

Veja como funciona o .gitignore em Git e GitHub para iniciantes.

Lendo variáveis de ambiente na aplicação

Spring Boot

O Spring lê variáveis de ambiente automaticamente. No application.properties:

spring.datasource.url=${DB_URL}
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASSWORD}
app.jwt.secret=${JWT_SECRET}

Node.js

Versões recentes do Node.js podem carregar o arquivo com node --env-file=.env app.js, ou você pode usar a biblioteca dotenv. No código:

const dbPassword = process.env.DB_PASSWORD;
if (!dbPassword) throw new Error("DB_PASSWORD não configurada");

Falhar logo na inicialização quando uma variável obrigatória está ausente evita erros confusos mais tarde.

Docker e Docker Compose

No compose, você pode referenciar um arquivo de variáveis:

services:
  api:
    build: .
    env_file: .env

Nunca coloque segredos no Dockerfile com ENV ou ARG: eles ficam gravados nas camadas da imagem e podem ser lidos por quem tiver acesso a ela. Veja Docker para iniciantes.

Em produção e no CI/CD

Cuidados que vão além do .env

Vazou uma chave no GitHub. E agora?

  1. Revogue ou troque a chave imediatamente no serviço correspondente. Esta é a única ação que realmente resolve.
  2. Verifique os logs de uso do serviço para identificar acessos indevidos.
  3. Remova o segredo do histórico, se o repositório for público, com ferramentas próprias para reescrever o histórico. Mas lembre-se: depois de publicado, considere a chave comprometida, mesmo que o commit seja apagado.
  4. Descubra como aconteceu e corrija o processo: .gitignore, revisão antes do commit, proteção de push.

Apagar o arquivo em um novo commit não resolve, porque a chave continua no histórico.

Checklist rápido

Esses cuidados fazem parte da higiene cibernética de qualquer projeto, por menor que seja.

Sistemas sob medida

A PruPru desenvolve APIs, sistemas web e integrações com as mesmas práticas descritas neste guia. Se a sua empresa precisa de software bem construído, conheça os serviços.

Ver serviços →

Perguntas frequentes

Posso colocar o arquivo .env no repositório se ele for privado?

Não é recomendado. Repositórios privados podem se tornar públicos por engano, ser clonados por pessoas que saem da equipe ou ter acesso comprometido. Versione apenas o .env.example com valores fictícios.

Variáveis de ambiente são seguras?

São muito mais seguras que segredos no código, mas qualquer processo com acesso ao ambiente pode lê-las. Para sistemas maiores, gerenciadores de segredos oferecem controle de acesso, auditoria e rotação.

Chaves de API podem ficar no front-end?

Apenas chaves feitas para uso público e restritas por domínio, como algumas chaves de mapas. Chaves secretas, que permitem cobranças ou acesso a dados, devem ficar no back-end.

Apaguei o commit com a senha. Estou seguro?

Não. Considere a senha comprometida e troque-a imediatamente. Robôs varrem repositórios públicos em minutos, e o segredo pode ter sido copiado antes da remoção.

Falar no WhatsApp agora