Bootstrap EDEN: Fase 0 (arquitetura) e Fase 1 (monorepo + infra)
Fase 0 — descoberta e arquitetura:
- Inventário do projeto, glossário de domínio, arquitetura com bounded
contexts e topologia de containers, threat model inicial.
- 12 ADRs cobrindo modular monolith, topologia de containers (Postgres
isolado + eden-core/parceiros/assinante em containers e portas
distintos), auth/sessões, modelo de permissões, criptografia/segredos,
contrato first-class, stock ledger, separação billing/finance/fiscal,
outbox transacional, adapters SaperX e Focus NFe, e identidade
compartilhada entre as 3 apps.
- 14 subagentes e 7 skills especializados por domínio em .claude/.
- Hooks de segurança (PreToolUse/PostToolUse/Stop) testados via pipe.
Fase 1 — plataforma (em andamento):
- Monorepo pnpm workspaces + Turborepo: apps/{api,worker,core-web,
reseller-web,subscriber-web} + 9 packages compartilhados.
- apps/api: NestJS mínimo com /health/live e /health/ready (checando
Postgres real via @eden/database).
- 3 frontends Vite + React + TypeScript + Tailwind, com o favicon
oficial do EDEN.
- packages/database: migration baseline (node-pg-migrate) criando
roles/role_permissions/applications/users/user_applications/sessions/
audit_log — audit log append-only com hash-chain, testado ao vivo
(UPDATE/DELETE bloqueados pelo trigger).
- compose.yaml implementando a topologia da ADR-0002, validada de ponta
a ponta: os 6 containers sobem e ficam saudáveis com um único
`docker compose up`.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
82
docs/security/threat-model.md
Normal file
82
docs/security/threat-model.md
Normal file
@@ -0,0 +1,82 @@
|
||||
# EDEN — Threat Model (Fase 0)
|
||||
|
||||
Modelo inicial, por bounded context, método STRIDE simplificado. Revisar a cada fase (§18 do Master Prompt) com o agente `eden-security`.
|
||||
|
||||
## 1. Ativos críticos
|
||||
|
||||
1. Credenciais de autenticação (senhas, refresh tokens, OTP, tokens de link público/assinatura).
|
||||
2. Dados pessoais PF/PJ (CPF/CNPJ, endereço, contatos) — LGPD.
|
||||
3. Segredos de integração (Focus NFe, SaperX, Control iD, SMTP, S3, chaves de IA) — sempre cifrados em repouso (AES-256-GCM), chave raiz fora do banco.
|
||||
4. Registros financeiros/fiscais (títulos, faturas, documentos fiscais emitidos) — integridade e auditabilidade.
|
||||
5. Cadeia de auditoria de assinatura eletrônica (hash-chain) — valor probatório/legal.
|
||||
6. Dado bruto de ponto (AFD) — valor legal, imutabilidade.
|
||||
7. Dump de backup do Postgres (contém tudo acima) — acesso altamente restrito.
|
||||
|
||||
## 2. Superfícies de ataque e mitigação por camada
|
||||
|
||||
### 2.1 Rotas públicas sem autenticação
|
||||
Existem por necessidade de negócio (cadastro de cliente/revenda, assinatura eletrônica, verificação pública, ViaCEP/CNPJ lookup client-side). Mitigação obrigatória em toda rota pública nova:
|
||||
- Token opaco ≥96 bits de entropia como capacidade de acesso, nunca sequencial/adivinhável.
|
||||
- Rate limiting por IP **e** por token/identidade quando aplicável (duas dimensões, nunca uma só).
|
||||
- Revalidação total de regra de negócio no backend — o cliente é sempre não confiável.
|
||||
- 404/409 sem vazar existência de recurso quando aplicável (mensagens genéricas para "não existe" vs. "já usado").
|
||||
|
||||
### 2.2 Autenticação e sessão
|
||||
- Herdar do legado: `token_version`-like mecanismo de invalidação global, MAS evoluir para refresh token rotativo hashado (ADR-0003) — não repetir JWT de 30 dias sem revogação.
|
||||
- Argon2id (não bcrypt) para novo hash de senha — custo a definir em ADR de segurança/config, revisável sem quebrar hashes existentes (versionamento de parâmetro).
|
||||
- MFA/TOTP obrigatório para `super_admin`/`admin` assim que o módulo existir.
|
||||
- Lockout progressivo por conta + rate limit por IP (duplo, como no legado) — nunca só um dos dois.
|
||||
|
||||
### 2.3 Autorização
|
||||
- Nunca confiar em `role`, `customer_id`, `reseller_id`, `legal_entity_id` vindos do cliente — resolver sempre a partir da sessão/token no servidor.
|
||||
- `super_admin` mantém bypass total mas toda ação sensível permanece auditada (bypass de autorização ≠ bypass de auditoria).
|
||||
- Testar isolamento cross-reseller e cross-subscriber explicitamente em CI (casos invariantes do Master Prompt §15.3).
|
||||
|
||||
### 2.4 Dados em trânsito/repouso
|
||||
- TLS obrigatório ponta a ponta (terminação em proxy reverso — nunca assumir rede interna "confiável" sem TLS entre containers quando trafegar dado sensível entre hosts distintos; dentro do mesmo compose/host, aceitável por rede docker isolada, mas revisar se algum dia sair para múltiplos hosts).
|
||||
- Campos de alto risco (ver Master Prompt §5.4) cifrados com AES-256-GCM, chave raiz via secret manager/env fora do banco, versionamento de chave.
|
||||
- Nenhum arquivo (documento, anexo, backup) exposto por URL pública direta — sempre proxy autenticado pelo backend (padrão herdado do legado, preservar).
|
||||
|
||||
### 2.5 Integrações externas (Focus NFe, SaperX, Control iD, n8n)
|
||||
- Adapter/port isolado por provider (Master Prompt §13) — nunca acoplar domínio ao payload bruto externo.
|
||||
- Timeout + retry com backoff + circuit breaker — indisponibilidade externa nunca corrompe o ERP nem trava a request HTTP do usuário (usar fila/worker).
|
||||
- Webhooks sempre autenticados (assinatura HMAC) e idempotentes (event id + delivery log).
|
||||
- n8n nunca acessa o Postgres diretamente — só via API/eventos com service accounts escopados.
|
||||
|
||||
### 2.6 Upload de arquivo
|
||||
- Validação de MIME real (não só extensão), limite de tamanho por rota, scan hook preparado para malware, armazenamento fora do webroot, nunca executável a partir do storage.
|
||||
|
||||
### 2.7 Geração de documento/PDF
|
||||
- Sanitização de HTML em duas camadas (allowlist estrita de tags/atributos/estilos/schemes de URL) antes de qualquer renderização — herdar do legado.
|
||||
- Renderer (Chromium/Playwright) sem navegação de rede (`page.setContent` apenas, bloquear qualquer request de rede) — elimina SSRF por construção, herdar do legado.
|
||||
|
||||
### 2.8 Auditoria
|
||||
- Append-only reforçado em nível de banco (trigger que recusa UPDATE/DELETE fora de uma escotilha administrativa explícita e ela própria auditada) — não confiar só em "a aplicação nunca faz UPDATE".
|
||||
- Ordem de eventos por sequência monotônica (serial/bigserial), nunca por timestamp (timestamps podem colidir dentro de uma transação).
|
||||
- Nunca gravar segredo em claro no audit log (nem em metadata JSON).
|
||||
|
||||
### 2.9 Infraestrutura/containers
|
||||
- Postgres nunca exposto publicamente (ver `docs/architecture.md` §4).
|
||||
- Segredos de ambiente via `.env`/secret store, nunca em imagem de container ou repositório.
|
||||
- Cada container roda com usuário não-root quando a imagem base permitir.
|
||||
- Backup: dump em streaming (nunca materializado em disco/memória local), acesso de restauração com fricção deliberada (confirmação explícita da chave do backup, como no legado).
|
||||
|
||||
## 3. Casos invariantes de segurança (a testar sempre — Master Prompt §15.3)
|
||||
|
||||
- Desconto pendente nunca vira valor legal aprovado sem `approval_status = approved`.
|
||||
- `fidelity_period` não aprovado nunca altera vigência/multa/vencimento legal.
|
||||
- Mesmo serial/MAC/patrimônio nunca alocado duas vezes simultaneamente.
|
||||
- Webhook repetido nunca duplica pagamento; billing run repetido nunca duplica fatura; mesma referência fiscal nunca emite documento fiscal duplicado.
|
||||
- Usuário de revenda nunca acessa dado de outra revenda alterando UUID na URL; assinante nunca acessa documento de outro customer account.
|
||||
- AFD bruto nunca é alterável por nenhuma rota administrativa.
|
||||
- Audit log crítico nunca é mutável pela aplicação em uso normal.
|
||||
|
||||
## 4. LGPD — pontos de atenção específicos
|
||||
|
||||
- Minimização: cadastro público de cliente/revenda já segue esse princípio no legado (só pede o necessário por PF/PJ) — preservar.
|
||||
- Direito de exportação/eliminação do titular: não existe hoje no legado — **gap a suprir no EDEN**, registrar ADR quando o módulo de Identity/Customer 360 for implementado.
|
||||
- Retenção configurável: não existe hoje no legado (dados nunca expiram automaticamente) — decisão de produto a tomar com jurídico/DPO da Handix antes da Fase 2, registrar assunção em `docs/assumptions.md` enquanto isso.
|
||||
|
||||
## 5. Revisão
|
||||
|
||||
Este documento deve ser revisitado ao final de cada fase (Master Prompt §18) e sempre que um novo adapter de integração externa for adicionado.
|
||||
Reference in New Issue
Block a user