obsidian-vault/ligbox-ops-platform/specs/021-wizard-cybersecurity-telemetry/spec.md
2026-06-19 17:26:42 +00:00

14 KiB
Raw Blame History

Feature Specification: Cibersegurança do Wizard — Telemetria em Tempo Real (021)

Criado: 2026-06-17
Solicitado por: Roger
Status: Spec — implementação pendente
Prioridade: P1
Sistema: Wizard VM112 (/opt/ligbox-wizard) + Portal onboard + Desk VM122
Módulo Desk: wizard-security (novo — Spec 015)
Depende de: Spec 001/014 (webhooks + funil), Spec 015 (módulos), Spec 016 (handoff + sessionStorage)
UI principal: Audit Overview → tenant VM112 + Infra 2 + Eventos


Resumo

Estender a observabilidade do onboarding com vias de cibersegurança dos processos do wizard: CSP (browser), auditoria de inputs (API VM112), integridade do handoff server-side e eventos de abuso — tudo visível em tempo quase real no Desk VM122, na mesma sessão (session_id / hash) do funil.

Princípio: isto é camada extra de detecção e resposta — complementa (não substitui) HTTPS, handoff one-time, React escaping e ausência de SQL no fluxo de credenciais.

Regra de ouro: nunca enviar senhas, tokens de handoff completos nem corpos de request com PII sensível nos webhooks de segurança.


Problema

Hoje Necessidade
Desk vê progresso do funil (session.startedcompleted) Ver também tentativas de abuso na mesma sessão
Audit Overview = saúde infra (Carbonio, DNS, cert) Card Segurança onboarding por tenant VM112
CSP / validação de inputs inexistentes ou invisíveis Política activa + relatórios no Desk
IA/fuzzing acelera ataques Alertas operacionais sem esperar abuse report

Modelo de ameaças (wizard VM112)

Ameaça Camada actual Gap Via Spec 021
XSS (ler sessionStorage) React escape + sem dangerouslySetInnerHTML Sem CSP nem reporte CSP + security.csp_violation
SQL injection Handoff sem SQL (JSON encriptado) Outras APIs futuras Middleware security.input_blocked
Roubo handoff token Token opaco, TTL 15 min, one-shot Sem telemetria de reutilização security.handoff_rejected
Senha na URL Nunca — só ?onboard_handoff= Auditoria confirma ausência
MITM HTTPS Let's Encrypt Fora de escopo (já coberto)
Fuzzing / brute Parcial Sem rate limit visível security.rate_limited
Path traversal / SSRF Não auditado security.input_blocked
IA a gerar payloads Mesmas defesas Sem feed SOC Eventos no Desk em segundos

O que sessionStorage não é

  • Não protege contra SQL injection (corre só no browser).
  • Risco real: XSS bem-sucedido → script lê ligbox_onboard_password.
  • Resposta Spec 021: CSP reduz superfície + reporta violações; inputs maliciosos bloqueados antes de chegar ao estado.

Vias de processo — mapa completo

Via 1 — Credenciais (Portal → Wizard)

Utilizador (onboard.ligbox.com.br)
  → Self-Service / Login (HTTPS)
  → POST /onboard-handoff  [VM112 API — senha encriptada server-side]
  → redirect ?onboard_handoff=<token_opaco>
  → POST /consume  [one-shot, apaga token]
  → sessionStorage.ligbox_onboard_password  [temporário, mesma origem]
  → wizard /onboard

Eventos de segurança:

Evento Quando
security.handoff_created Handoff emitido (sem senha no payload)
security.handoff_consumed Consume OK
security.handoff_rejected Token expirado, reutilizado, session mismatch
security.handoff_expired TTL 15 min excedido

Via 2 — Inputs do wizard (passos 0N)

Rotas VM112 a auditar (mínimo):

Endpoint / acção Campos
Validação domínio domain, FQDN
Conta admin localPart, domain, email
DNS / Cloudflare domain, records
Portal users login_id, planned_corporate_email
Company profile legal_name, tax_id, texto livre
Handoff consume token, session_id

Eventos:

Evento Severidade Acção API
security.input_warn baixa Sanitizar + log + webhook
security.input_blocked alta HTTP 400 + log + webhook
security.rate_limited média HTTP 429 + webhook

Padrões detectados (regex/heurística MVP):

  • SQLi: ' OR , UNION SELECT, ; DROP, 1=1--
  • XSS: <script, javascript:, onerror=, onload=
  • Path: ../, %2e%2e
  • Command: `, $(, |, &&
  • Oversize: campo > limite (ex. domínio > 253, nome > 500)

Nunca logar: password, root_password, corpo de /consume com segredos.

Via 3 — CSP (browser → Desk)

Browser (portal + wizard)
  → viola Content-Security-Policy
  → POST report-uri / report-to
  → VM122 /api/v1/security/csp-report
  → webhook_events (source: vm112-security)
  → Audit Overview + Infra 2 + Eventos

Header CSP (Traefik / nginx — portal + wizard):

Content-Security-Policy:
  default-src 'self';
  script-src 'self';
  style-src 'self' 'unsafe-inline';
  img-src 'self' data: https:;
  connect-src 'self' https://desk.ligbox.com.br;
  frame-ancestors 'none';
  base-uri 'self';
  report-uri https://desk.ligbox.com.br/api/v1/security/csp-report;

(Ajustar connect-src para APIs VM112/Traefik em produção.)

Evento: security.csp_violation — inclui blocked-uri, violated-directive, document-uri (sem dados de utilizador).

Via 4 — Correlação com funil (VM122)

Cada evento security.* deve incluir quando disponível:

  • session_id (hash UUID)
  • domain
  • client_ip (ingress)
  • endpoint / wizard_step
  • severity: info | warn | high | critical

O Desk correlaciona com timeline Spec 014 na mesma sessão.


Módulo Desk (Spec 015)

Campo Valor
id wizard-security
label Segurança Wizard
default_enabled true
nav_views (enrichment — Audit Overview, Infra 2, Eventos)

Desactivar módulo → APIs devolvem payload sem security_summary; UI oculta card e filtro.


RBAC

Acção Perfis
Ver card Segurança no Audit Overview super_admin, ops_lead
Ver feed segurança Infra 2 super_admin, ops_lead, noc
Ver eventos security.* em Eventos super_admin, ops_lead, noc
POST csp-report Público (browser) — rate limit + validação schema
POST webhook segurança VM112 X-Webhook-Secret (mesmo ou derivado de onboard)

Técnicos technician — sem card segurança (opcional: só tickets ligados).


API Desk (VM122)

Ingestão

Método Path Auth Descrição
POST /api/v1/security/csp-report nenhum (browser) Relatório CSP (JSON W3C ou legacy)
POST /api/v1/webhooks/security X-Webhook-Secret Eventos VM112 security.*
POST /api/v1/webhooks/onboard existente Aceitar também security.* no mesmo ingress (opcional)

Consulta

Método Path Descrição
GET /api/v1/security/events?window=24h&session_id= Lista eventos segurança
GET /api/v1/security/summary?tenant_id=1 KPIs para Audit Overview
GET /api/v1/audit/tenants/1/details Enriquecido com security_summary + security_events_recent

Payload webhook (VM112 → VM122)

{
  "event": "security.input_blocked",
  "session_id": "ee2239fd-dd05-444e-b79c-a5701a255ba8",
  "domain": "evil.example",
  "data": {
    "endpoint": "POST /api/domains/validate",
    "field": "domain",
    "reason": "sql_injection_pattern",
    "pattern_id": "sqli_union",
    "client_ip": "203.0.113.42",
    "wizard_step": 0,
    "severity": "high"
  }
}

Proibido no payload: passwords, tokens handoff completos, headers Authorization.

Persistência

Tabela nova ou reutilizar webhook_events:

Opção Prós
Awebhook_events com source=vm112-security Reutiliza Eventos, Infra 2, funil
B — tabela security_events dedicada Queries mais rápidas, retenção própria

MVP: opção A (consistente com arquitectura actual).

Índices recomendados: (source, created_at), (session_id), (event_type).


API VM112 (wizard)

Middleware security_audit.py (novo)

  • Executar antes do handler em rotas listadas na Via 2.
  • Retornar 400/429 com corpo genérico (não revelar qual regex matched em produção — opcional reason interno no webhook only).
  • Fire-and-forget POST para VM122 (não bloquear UX se Desk offline).

Cliente webhook

Reutilizar cliente existente de onboarding (session.started, etc.) com fila retry (3 tentativas, backoff 2s).

Config (.env VM112)

DESK_SECURITY_WEBHOOK_URL=https://desk.ligbox.com.br/api/v1/webhooks/security
DESK_WEBHOOK_SECRET=<mesmo WEBHOOK_SECRET>
SECURITY_AUDIT_ENABLED=true
SECURITY_RATE_LIMIT_PER_IP=60/min

UI Desk

Audit Overview → modal VM112 Ligbox Onboard

Novo bloco «Segurança onboarding» (acima ou abaixo do resumo domínios):

KPI Exemplo
Violações CSP (24h) 3
Inputs bloqueados 1
Handoffs rejeitados 0
Sessões com alerta 2

Lista recente (clicável → detalhe):

Hora Sessão (hash) Evento IP Domínio
21:42 ee2239fd… security.csp_violation 203.0.113.1
21:40 3dfa8c6c… security.input_blocked 198.51.100.5 foo';DROP--

Clique → modal com timeline funil + segurança intercalados (ou abas).

Infra 2 (SOC)

  • Painel «Segurança wizard» no feed (15s refresh).
  • Flash visual em security.input_blocked e security.csp_violation (como eventos novos no feed VM112).

Eventos

  • Filtro toolbar: Segurança (source=vm112-security ou event prefix security.).
  • Colunas: severidade, evento, sessão (hash completo), domínio, IP, hora.

Tickets (opcional Fase C)

Auto-ticket quando:

  • ≥3 security.input_blocked mesmo IP em 10 min, ou
  • security.csp_violation + security.input_blocked mesma sessão

Subject: [security] {domain|sem domínio} — {event} · prioridade alta.


Taxonomia de eventos security.*

event Label UI Severidade default
security.csp_violation Violação CSP warn
security.input_warn Input suspeito (sanitizado) info
security.input_blocked Input bloqueado high
security.rate_limited Rate limit warn
security.handoff_created Handoff criado info
security.handoff_consumed Handoff consumido info
security.handoff_rejected Handoff rejeitado high
security.handoff_expired Handoff expirado info
security.auth_failed Autenticação portal falhou (agregado) warn
security.session_anomaly Sessão inconsistente (IDs mismatch) high

Fases de implementação

Fase A — Ingestão VM122 (Desk)

  • T001 POST /api/v1/security/csp-report + validação schema + rate limit
  • T002 POST /api/v1/webhooks/security (ou extensão onboard ingress)
  • T003 Persistência webhook_events source vm112-security
  • T004 GET /api/v1/security/summary e /security/events
  • T005 Registar módulo wizard-security em registry.py

Fase B — VM112 wizard

  • T006 Middleware auditoria inputs (Via 2)
  • T007 Eventos handoff (Via 1)
  • T008 Cliente webhook segurança + retry
  • T009 Testes unitários padrões SQLi/XSS

Fase C — UI Desk

  • T010 Card Segurança no Audit Overview modal VM112
  • T011 Filtro Eventos «Segurança»
  • T012 Painel Infra 2 + flash eventos novos
  • T013 Hash sessão na lista (já feito — correlacionar)

Fase D — Infra Traefik/nginx

  • T014 CSP headers portal + wizard (CT114 Traefik)
  • T015 Validar report-uri reachability desde browser público
  • T016 Documentar excepções CSP se libs externas exigirem

Fase E — Resposta operacional (opcional)

  • T017 Auto-ticket regras abuso
  • T018 Push ntfy em security.input_blocked critical
  • T019 Retenção 90 dias + purge security.* antigos

Critérios de aceitação

  1. Browser com CSP activo envia violação → evento visível em Eventos em <30s.
  2. POST domínio foo<script>alert(1)</script>.com → 400 VM112 + security.input_blocked no Desk.
  3. Reutilizar token handoff → security.handoff_rejected correlacionado à session_id.
  4. Audit Overview VM112 mostra KPIs segurança 24h sem regressão nos domínios existentes.
  5. Módulo wizard-security OFF → card oculto; APIs sem security_summary.
  6. Nenhum webhook contém senha nem token handoff completo (auditoria manual + teste).
  7. Mesma sessão: funil (session.started) + evento segurança partilham session_id no detalhe.

Testes

# CSP report (simulado)
curl -s -X POST https://desk.ligbox.com.br/api/v1/security/csp-report \
  -H 'Content-Type: application/csp-report' \
  -d '{"csp-report":{"document-uri":"https://onboard.ligbox.com.br/onboard","violated-directive":"script-src","blocked-uri":"https://evil.com/x.js"}}'

# Input blocked (após Fase B)
curl -s -X POST https://onboard.ligbox.com.br/api/.../validate \
  -d '{"domain":"x\"; DROP TABLE--"}' 
# → 400 + evento no Desk

# Summary Desk
curl -s -H "Authorization: Bearer $TOKEN" \
  "https://desk.ligbox.com.br/api/v1/security/summary?tenant_id=1"

Fora de escopo (v1)

  • WAF comercial (Cloudflare WAF rules — futuro)
  • SIEM externo (export syslog)
  • Pentest automatizado no wizard
  • Substituir sessionStorage por Web Crypto / Credential Management API
  • Segurança Carbonio pós-provisionamento (Spec separada)

Relação com specs existentes

Spec Relação
016 Handoff + sessionStorage — Via 1 auditada, senha nunca no webhook
014 Relógio por fase — mesma sessão, timeline paralela segurança
015 Módulo wizard-security
017 Purge — independente; não apagar security.* antes de retenção
010 Assist/takeover — técnico vê alertas segurança na sessão assistida

Conclusão

A Spec 021 define as vias de cibersegurança dos processos do wizard (credenciais, inputs, CSP, handoff) com telemetria em tempo real no VM122 — Audit Overview, Infra 2 e Eventos — sem confundir protecção (HTTPS, handoff, React) com visibilidade operacional (o que o Roger precisa para operar e reagir).

Próximo passo: Fase A (ingestão VM122) — pode começar sem alterações no wizard; Fase B liga a detecção activa na VM112.