diff --git a/documentação/STATUS-SEGURANCA-E-PRODUCAO.md b/documentação/STATUS-SEGURANCA-E-PRODUCAO.md new file mode 100644 index 0000000..ba78cf5 --- /dev/null +++ b/documentação/STATUS-SEGURANCA-E-PRODUCAO.md @@ -0,0 +1,112 @@ +# Status — Segurança & Produção (ScoreOdonto) + +> Resumo do que foi feito e do que falta. Atualizado em **19/jun/2026**. +> Produção no ar: **v1.0.18** (`fc00622`). **Todos os commits de código estão LOCAIS (sem `git push`)** — +> exceto a rotação do `JWT_SECRET`, que **já foi aplicada e verificada em produção**. + +--- + +## ✅ O QUE JÁ FOI FEITO + +### 1. Segredos +- **`JWT_SECRET` rotacionado em DEV e PRODUÇÃO** (recriado o backend na VPS1 na mesma tag, sem rebuild; + `/api/health` e `/api/version` validados). → **vetor de tomada de conta FECHADO** (o segredo vazado não + forja mais tokens). Commit `fcf2fb1`. +- **`backend/.env` fora do tracking do git** + `backend/.dockerignore` (o Dockerfile fazia `COPY . .` sem + `.dockerignore` → segredos iam para dentro da imagem) + `.env.example`. Commits `fcf2fb1`. +- **Senhas hardcoded removidas do `docker-compose.yml`**: banco via `SCOREO_DB_PASS` (com `:?` fail-fast); + `DRAGONFLY_URL` (com senha) movido para `env_file`. Commit `3aa6a44`. Validado em DEV (pgdev/cache ok). + +### 2. Frontend +- **`/update` (migração de banco) restrito a superadmin** (era acessível a qualquer um, até deslogado). +- **Deep-links corrigidos** (`/comissoes`, `/glosas` faltavam no `ROUTE_MAP` → caíam em dashboard). +- Commit `1559387`. (Build compila; validação visual de RBAC precisa de navegador.) + +### 3. RBAC intra-clínica no backend (99 rotas) — **NÚCLEO FECHADO** +Antes: qualquer membro autenticado (até paciente) podia chamar ações privilegiadas direto na API +(a UI escondia, o backend não barrava). Agora há autorização por **cargo**, espelhando o `isViewAllowed` +do frontend, via 3 helpers: `requireCapability`, `requireCapabilityRow`, `requireCapabilityFromOrders`. + +| Grupo | Commit | +|---|---| +| Financeiro (comissões/repasses/financeiro/glosas) | `f4e7fe3` | +| Gestão de equipe/clínica (membros/setores/funções/reset-senha/cor) | `9ad65c3` | +| Cadastros administrativos (dentistas/especialidades/procedimentos/planos + reorder) | `116200c` + `0667456` | +| Operação clínica (pacientes/agenda/leads) | `5b58a8a` | +| Orçamentos/Contratos | `16c13ad` | +| Sub-pass clínico (presença/pendências/horários/detalhes de paciente) | `0fc69bb` | + +- **Marketplace (salas/sala-reservas/propostas): auditado — já protegido por POSSE** nos handlers + (`owner_usuario_id`, profissional destinatário, dono/solicitante). Sem gap; sem mudança. Commit `0667456`. +- Validado em DEV com tokens forjados: dono passa, dentista/paciente 403, isolamento cross-tenant intacto. + +### 4. Documentação & Skills +- `documentação/MAPA-FUNCIONAL-COMPLETO.md` (inventário rotas/telas/botões/fluxos/módulos). +- `documentação/AUDITORIA-ESTRATEGICA-MODELAGEM.md` (Pessoa→Vínculo→Workspace, débitos, riscos). +- `ScoreOdonto_Skills_Enterprise/`: **62/62 skills preenchidas** com conteúdo real. Commits `5b99292`, `e83af04`, `f22e30e`. + +### 5. Pré-requisito de produção +- **`SCOREO_DB_PASS` provisionado na VPS1** (`/home/deploy/stack/scoreodonto.com/.env`, 0600), valores + extraídos do container em execução, `.gitignore` da VPS1 ajustado, conexão validada (`SELECT 1` = ok). + **Produção não foi tocada.** + +--- + +## ⏳ O QUE FALTA + +### A) Levar o trabalho a produção (fila) +1. **Imagem limpa `v1.0.19`** (remove segredos embutidos na imagem): + `git push` → CI builda `:` com `.dockerignore` → `git tag v1.0.19` → `deploy-prod.sh v1.0.19` → + validar `/api/version` + `/api/health`. **Rollback trivial:** `deploy-prod.sh v1.0.18`. + - Leva junto: RBAC (99 rotas), correções de frontend, etc. +2. **Compose novo na VPS1 (opcional, passo 2b):** `deploy-prod.sh` **não faz `git pull`** → o + `docker-compose.yml` da VPS1 segue o antigo. Para tirar a senha hardcoded do compose local, copiar o + novo `docker-compose.yml` (scp) + recreate. O root `.env` já provisionado cobre isso. + +### B) Rotação dos demais segredos (ainda vivos no histórico/artefatos antigos) +3. **Senha do banco** (`scoreodonto_user`) — contida ao scoreodonto; exige refactor já feito no compose + + `ALTER USER` + atualizar `.env`/`backend/.env` + recreate. Risco de outage → com cuidado/janela. +4. **Senha do Dragonfly (cache)** — ⚠️ **compartilhada** entre apps (rx, newwhats, subdominio, mercado); + trocar derruba os outros → exige **janela coordenada**. +5. **`OPENAI_API_KEY` / `GEMINI_API_KEY`** — **só você** rotaciona (painéis OpenAI/Google); depois colo os + novos valores no `.env` e recrio. +6. **Histórico do git** — `backend/.env` (e um `backend/.env.bak`) estão no histórico. Após rotacionar tudo, + o *scrub* de histórico (force-push, destrutivo) vira **cosmético** — não recomendado às pressas. + +### C) Residual de qualidade (não-bloqueante; do MAPA / AUDITORIA) +- RECEITA de procedimento é **opcional** (`gerarLancamento`/`valor>0`) → decidir se vira padrão (risco de caixa). +- Estado de plugins divergente cliente/servidor (`localStorage` vs `usuario_plugins`). +- Órfã `OrthoReports.tsx`; `SyncView` desativada; `server.js.bak`/scripts legados → limpeza. +- Marketplace: **gateway de pagamento** (salas têm `valor`, sem captura) e **assinaturas SaaS** (manual). + +### D) Débitos de modelagem (estratégico; exige aprovação + janela) +- `dentistas` como **projeção** da pessoa (hoje duplica a pessoa por clínica). +- `pacientes` com **identidade de pessoa** (hoje preso à clínica, não-portável) — antes, decisão LGPD/jurídica. +- Unificar workspace (`clinicas` + `salas`); entidade **"rede/grupo"** acima da clínica. +> Recomendação estratégica única: assumir a **Pessoa como âncora** e parar de manter o legado clínica-cêntrico +> em paralelo. Detalhe em `AUDITORIA-ESTRATEGICA-MODELAGEM.md`. + +--- + +## Commits locais da sessão (nenhum `push`, exceto JWT já aplicado em prod) +``` +f22e30e docs(skills): completa as 62 skills +e83af04 docs(skills): biblioteca operacional +5b99292 docs: auditoria funcional + estratégica +0667456 security(rbac): reorder + auditoria do marketplace +0fc69bb security(rbac): sub-pass clínico +16c13ad security(rbac): orçamentos e contratos +5b58a8a security(rbac): operação clínica +116200c security(rbac): cadastros administrativos +9ad65c3 security(rbac): gestão de equipe/clínica +f4e7fe3 security(rbac): rotas financeiras +1559387 security/fix(front): /update + deep-links +3aa6a44 security(infra): senhas fora do compose +fcf2fb1 security(infra): .env fora do git + .dockerignore +``` + +## Como retomar +- **Para publicar:** seguir a fila **A** (push → `v1.0.19` → deploy → validar health/version). +- **Antes de abrir a usuários reais:** concluir **B** (rotações) — sobretudo as API keys (você) e a senha do banco. +- Tudo de código testado em **DEV** (`dev.scoreodonto.com`, banco `pgdev`); produção segue **v1.0.18** intacta. +