Eventos assinados via HMAC
Webhooks
Empurre findings críticos para sua resposta a incidentes, seu ticketing, seu Slack — no instante em que são detectados. Sem polling.
Tipos de evento
finding.createdUm novo finding foi detectado.finding.severity_changedA severidade de um finding foi reclassificada — geralmente depois de novas evidências correlacionadas.finding.resolvedUm finding foi marcado como corrigido ou aceito como risco conhecido.audit.startedUma passagem forense 4D começou.audit.completedUma passagem 4D terminou, com payload resumindo findings novos e resolvidos.resource.addedUm novo recurso de nuvem entrou no inventário.policy.violatedUma política customizada que você definiu foi disparada.
POST /your-endpoint HTTP/1.1
Host: api.your-app.com
Content-Type: application/json
X-CloudSealed-Event: finding.created
X-CloudSealed-Event-Id: evt_01HZ8K3F2Q4XV6
X-CloudSealed-Timestamp: 1717693200
X-CloudSealed-Signature: sha256=8b9c4a...
{
"event_id": "evt_01HZ8K3F2Q4XV6",
"type": "finding.created",
"created_at": "2026-06-06T14:22:11Z",
"data": {
"finding": {
"id": "fnd_8f3a2c1b",
"severity": "critical",
"dimension": "security",
"resource_id": "res_aws_s3_42",
"title": "Public S3 bucket exposing customer PII"
}
}
}Semântica de entrega
- —POST com body JSON, content-type application/json.
- —Retries: até 8 tentativas em 24 horas com backoff exponencial.
- —Timeout: 10 segundos. Devolva 2xx rápido e enfileire o trabalho de forma assíncrona.
- —Idempotência: toda entrega traz um header event_id estável. Faça dedupe por ele.
Verificação de assinatura
Todo payload é assinado com HMAC-SHA256 sobre o corpo bruto da requisição usando o secret do seu endpoint. A assinatura chega no header X-CloudSealed-Signature junto com um X-CloudSealed-Timestamp. Rejeite qualquer requisição cuja assinatura não bata — nunca confie no payload sem isso. Rejeite timestamps com mais de cinco minutos para impedir replay.
import { createHmac, timingSafeEqual } from "node:crypto";
export function verifyCloudSealed(req, secret) {
const signature = req.headers["x-cloudsealed-signature"];
const timestamp = req.headers["x-cloudsealed-timestamp"];
// Reject replays older than 5 minutes
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
const expected =
"sha256=" +
createHmac("sha256", secret)
.update(timestamp + "." + req.rawBody)
.digest("hex");
const a = Buffer.from(signature);
const b = Buffer.from(expected);
return a.length === b.length && timingSafeEqual(a, b);
}