Linha de Base de Segurança
Visão Geral
Uma referência completa está em references/baseline.md (seções §0–§18, busque por ## N.). Este arquivo é o procedimento operacional. Princípio central: combine o rigor ao nível de ameaça, depois prove cada descoberta com evidências. Três leis: nunca confie no cliente, nunca confie no código do modelo, nunca confie nos padrões.
Escolha o modo
| Solicitação | Modo | Leia em baseline.md |
|---|---|---|
| "Planejar / iniciar um projeto com segurança", escrever regras de agente | Planejamento | §0, §2, §3, §16 |
| "Revisar / auditar este app / repo / PR" | Revisão de código | §1.3, §4–§11, §15.2 |
| "Auditar meu servidor / homelab / VPS", "está atualizado?" | Auditoria de host | §3.3, §8.3, §12, §13 |
| "Fomos hackeados / vazamos uma chave" | Incidente | §17, §8.2 |
Uma auditoria de host inclui uma breve revisão de código de cada aplicação voltada para a internet que armazena contas ou dados pessoais.
Passo 1 — Classifique o nível (sempre primeiro, declare no relatório)
Decida com base em fatos observáveis, não no que o proprietário chama:
| Nível | Predicado | Aplique |
|---|---|---|
| T0 Brinquedo | Sem usuários reais ou dados E não acessível pela internet (apenas LAN, ou atrás de SSO) | §2, §8 |
| T1 Público, sem contas | Acessível pela internet, sem login, sem dados pessoais armazenados | T0 + §9, §10 |
| T2 Contas / dados de usuário | Qualquer login, qualquer dado pessoal (nomes, e-mails, listas de convidados), qualquer chave de API ou token que ele armazena | Tudo |
| T3 Dinheiro / PII em escala / regulado | Pagamentos, saúde, cofres de credenciais, finanças, dados de >1k pessoas, contratos com clientes | T2 + revisão externa + §14 |
Um host de homelab é classificado no nível mais alto de qualquer coisa que ele executa. Um agregador de credenciais (gerenciador de senhas, n8n, Home Assistant, Portainer, titular de docker.sock) é T3 por raio de explosão.
Passo 2 — Colete evidências (somente leitura)
Execute os scripts inclusos via bash. Em um host remoto, transmita-os via SSH: ssh host 'bash -s -- --remote-digests' < scripts/audit-docker-host.sh e ssh host 'bash -s -- <project-dir>' < scripts/scan-code.sh.
bash scripts/audit-docker-host.sh --remote-digests— Patches do SO, flag de reinicialização, soquetes de escuta, firewall, sshd, usuário/privilegios/portas publicadas/docker.sock de cada container, NOMES de env vars com aparência de segredo, frescor da imagem (UP-TO-DATE / OUTDATED / local-build).bash scripts/scan-code.sh <project-dir>— grep por leads de segredos, injeção, XSS, mass assignment, IDs de tenant fornecidos pelo cliente, capturas fail-open, criptografia fraca, lockfiles, riscos de Dockerfile/compose, inventário de rotas.
Em seguida, faça o que os scripts não conseguem:
- Inventário de proxy reverso: liste cada hostname público, seu destino, e se a autenticação está na frente (NPM DB / Caddy / rótulos Traefik). UIs administrativas (lista §3.3) em um hostname público sem SSO/lista de acesso = descoberta.
- Visão externa: de fora do caminho LAN,
curl -sI https://<host>para cabeçalhos (§10.2), e probe/.env,/.git/config,/admin,/apicom GET apenas. - Rastreamento de autorização para cada app T2+: para cada rota, nomeie a verificação de autorização e de onde vem o principal/ID do tenant (§4.3). Aplique a pergunta §1.3.
- Confiança do proxy: se um app lê
X-Forwarded-For, verifique qual hop ele confia ($proxy_add_x_forwarded_foranexa; o primeiro valor é controlado pelo atacante). - Força da credencial por função: para cada função (admin, funcionário, voluntário, token API/MCP), descubra como seu segredo é definido, incluindo seed, caminhos legados e de migração que ignoram a verificação normal de comprimento. Verifique o comprimento real dos valores
.envcomawk -F= '{print $1, length($2)}', nunca imprimindo-os. Um segredo fraco combinado com um limite de taxa contornável é uma descoberta, não duas. - Versões vs avisos: para cada aplicação voltada para a internet, compare a versão em execução com a versão atual e CVEs conhecidos. Use pesquisa web para avisos de segurança do produto.
Portão do host (a checklist §16 é por projeto; use esta para um host)
- Cada hostname público está listado, e cada UI administrativa (§3.3) tem SSO, uma lista de acesso ou VPN na frente, ou não é pública
- Hypervisor, Docker, NPM/proxy admin, cofre de senhas admin: nunca públicos
- Cadastro aberto desabilitado em cada app auto-hospedada que não precisa (Vaultwarden, Open WebUI, Gitea, Immich, …)
- Portas acessíveis pela WAN = apenas 80/443 (+ VPN). Portas publicadas pelo Docker ignoram ufw: verifique encaminhamentos do roteador e
DOCKER-USER - O proxy passa um IP de cliente que os apps não podem ser enganados (§4.5, X-Forwarded-For)
- Membros do grupo docker listados; cada um é equivalente a root
- Arquivos de segredos com modo 600; nenhum
.env/chaves legível mundialmente - SO atualizado, nenhuma reinicialização pendente há mais de 7 dias; imagens atuais (tabela de frescor)
- Backups executados recentemente e um restore foi testado (§13.4)
Regras de engajamento
- Somente leitura por padrão. Sem escritas, reinicializações, atualizações, POSTs que alteram dados, força bruta ou varredura de hosts que o proprietário não possui.
- Nunca imprima valores de segredos. Relate apenas o nome da variável e arquivo:linha.
- Inspecione armazenamentos de configuração (tabelas de config de BD, configurações JSON, env
docker inspect) por chaves e comprimentos apenas:jq 'paths',SELECT key FROM …,awk -F= '{print $1, length($2)}'. Nunca despeje uma linha ou arquivo de configuração inteiro para olhá-lo: conterá chaves de API. - Mudanças (atualizações, chmod, correções de configuração) acontecem apenas após o relatório, e apenas quando o solicitante as pediu. Para atualizações, siga "Atualizando com segurança" abaixo.
Passo 3 — Relatório (exatamente este formato)
- Escopo e nível: o que foi examinado, o nível e o motivo em uma linha.
- Veredito: uma frase — pode-enviar / corrija-primeiro / pare.
- Descobertas, classificadas de Críticas a Baixas. Cada descoberta tem: título,
CONFIRMADO(você reproduziu ou leu o caminho exato do código/config) ouLEAD(plausível, não comprovado), evidência (arquivo:linha, comando + trecho de saída), impacto em uma frase, correção. - Tabela de frescor (auditoria de host): componente, versão em execução, mais recente, risco de atualização.
- Cobertura: as seções do portão §16 que você verificou, e as que não verificou e por quê. Silêncio não é aprovação.
- Próximas ações, numeradas, do menor esforço ao maior risco primeiro.
Atualizando com segurança ("certifique-se de que tudo está atualizado")
- Confirme que um backup existe e é recente (§13.4). Registre o ID da imagem atual de cada container para que o rollback seja
image: <repo>@<old digest>. - Sem estado = sem volume nomeado ou bind mount que o app escreve, e sem banco de dados. Sites nginx estáticos, gotenberg, flaresolverr são sem estado. Se não tiver certeza, trate como portador de dados.
- Classifique: com migração de dados ou esquema (bancos de dados, Immich, Paperless, Vaultwarden, Firefly, n8n, Home Assistant) → um de cada vez, leia as notas de versão para mudanças radicais primeiro. Sem estado (sites nginx estáticos, ferramentas) → em lote.
- Nunca pule uma versão principal de banco de dados (postgres 15→17) através de
docker pull. Isso requer um dump/restore. docker compose pull && docker compose up -dpor projeto, depois verifique a saúde: status do container, logs para erros e uma verificação HTTP da URL pública.- Builds locais (
local-build) atualizam reconstruindo com--pull. Pacotes do SO precisam de sudo; se você não tiver, relate a lista e a flag de reinicialização. - Se pulls falharem com
429 toomanyrequests, pare. Peçadocker loginno host, ou tente novamente após 6 h. Não repita.
Erros comuns
| Erro | Correto |
|---|---|
| Relatar tudo como "Alto" | Gravidade = explorabilidade × nível × raio de explosão |
| Tratar um hit de script como descoberta | A saída do script é um LEAD até você ler o código |
| "Container executa como root" sem verificar | Muitas imagens reduzem privilégios no entrypoint; verifique ps internamente |
| "Porta 9000 está aberta" em um host LAN | Diga quem pode alcançá-la: apenas LAN, WAN via encaminhamento do roteador, ou via proxy |
| Pular o nível e auditar um site estático como um banco | Nível primeiro; T1 precisa de cabeçalhos e dependências, não de RLS |
Atualizar tudo com :latest de uma só vez | Um serviço com dados de cada vez, com um digest para rollback |
Corrigir desabilitando o controle (RLS off, CORS *) | Corrija a política, nunca a remova (§7.2) |