← as aulas · Núcleo de Segurança Neon · aula 04

Onde a senha passa a morar

Tirar o segredo do código sem ter para onde levar é como ele volta na semana seguinte, "só para testar rápido".

começar

a receita, igual em toda aula

1 · o erro

O código errado, como quase todo mundo faz.

2 · o porquê

Por que aquilo é perigoso, em português.

3 · a correção

O código certo.

4 · a prova

O terminal respondendo.

04 A casa nova do segredo

variável de ambiente e o .env

1 · o erro

Este é o erro que quase ninguém chama de erro: tirar a senha do código e parar por aí.

O programa agora lê os.environ.get("NEON_DB_PASSWORD"), a variável não existe em lugar nenhum, e o banco recusa. Na correria, a mão vai sozinha de volta para a linha 11. E dessa vez ela fica.

Segredo sem endereço novo sempre volta para o endereço velho.

2 · o porquê

Variável de ambiente é um valor que mora no sistema, não no arquivo. O programa pergunta por nome e recebe. Ela existe enquanto aquele terminal existir — não vai junto quando você copia o projeto.

Só que digitar as variáveis toda vez que abre o computador é insustentável, e o que é insustentável é abandonado. Por isso existe o .env: um arquivo de texto com uma variável por linha, que fica na pasta do projeto e nunca entra no Git.

E aí aparece o problema seguinte, o de gente: se o .env nunca é publicado, como alguém que clonar o projeto sabe o que precisa preencher? É para isso que existe o irmão dele.

  • .envFica só na sua máquina. Tem os nomes e os valores. Está no .gitignore.
  • .env.exampleVai para o GitHub. Tem os nomes e as explicações, sem nenhum valor seu. É o formulário em branco.
3 · a correção

No código, uma linha — e a senha nunca mais aparece escrita:

senha = os.environ.get("NEON_DB_PASSWORD", "")

E no .env.example, que é o arquivo público, os nomes com o comentário ensinando o que pôr. Repare que o campo perigoso vem vazio e o comentário diz como preencher:

# Token obrigatório para /api/security/*. Gere com:
#   openssl rand -hex 32
NEON_API_TOKEN=

# Endpoint de execução de comandos. Desligado por padrão.
# Só ligue se souber exatamente o que está fazendo.
ENABLE_TERMINAL=false

Duas decisões dentro dessas seis linhas. Primeiro: o valor perigoso nasce vazio, e não com um exemplo que alguém vai deixar em produção. Segundo: o que é destrutivo nasce desligado — quem quiser ligar precisa querer, e vai ler o comentário no caminho.

O mesmo princípio no interceptador de e-mail, onde a ação padrão só escreve relatório e não toca em mensagem nenhuma:

# Ação ao detectar ameaça: relatorio | quarentena | excluir
# "relatorio" (padrão) apenas registra, não toca nas mensagens.
INTERCEPTOR_ACAO=relatorio
4 · a prova

A captura das 11:09 é a mais completa da manhã. No editor, a linha 11 já não tem senha nenhuma:

senha = os.environ.get("NEON_DB_PASSWORD")

No terminal, a variável sendo dada ao sistema e o programa rodando com ela — e o finally fechando a porta no fim:

$ export NEON_DB_PASSWORD='...'
$ python3 neon_core.py
[ SUCESSO ] Conexão estabelecida.
[ INFO ] Conexão encerrada com segurança.

Mesmo [ SUCESSO ] da aula 03. Mesma tela, mesmo resultado — e agora o arquivo pode ser publicado sem levar nada junto.

O valor do export foi apagado desta página. Numa gravação de tela, esse comando é tão perigoso quanto a linha 11 — e ele fica no histórico do seu terminal depois.

arquivos · .env.example · neon_config.py  ·  captura de 4 de setembro de 2026, 11:09

para levar

Não basta tirar o segredo do código: é preciso dar um lugar melhor para ele morar. Segredo sem endereço novo volta para o antigo — e na segunda vez ninguém mais mexe.

Núcleo de Segurança Neon · aula 04 de 6 · todo código desta página foi copiado de um arquivo real do projeto — nenhum exemplo foi inventado