Brechas de Seguridad
Endpoints para gestionar incidentes de seguridad y brechas de datos personales en DPOLab.
Todos los endpoints requieren autenticacion JWT, excepto el webhook de Wazuh que usa autenticacion HMAC-SHA256.
Listar incidentes
GET /api/v1/breachesQuery params:
| Param | Tipo | Descripcion |
|---|---|---|
page | number | Pagina (default: 1) |
limit | number | Registros por pagina (default: 20) |
status | string | Filtrar por estado: detected, investigating, contained, resolved, notified |
requiresNotification | boolean | Filtrar por requerimiento de notificacion a la APDP |
Ejemplo:
curl -X GET "https://api.dpolab.com/api/v1/breaches?status=investigating&requiresNotification=true" \
-H "Authorization: Bearer {token}"Respuesta (200):
{
"success": true,
"data": {
"items": [
{
"id": "brch_abc123",
"title": "Acceso no autorizado a base de datos de clientes",
"status": "investigating",
"detectedAt": "2026-03-08T03:15:00Z",
"estimatedRecords": 1500,
"notificationDeadlineAt": "2026-03-11T03:15:00Z",
"requiresNotification": true,
"createdAt": "2026-03-08T03:20:00Z"
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 3,
"totalPages": 1
}
}
}Registrar incidente
POST /api/v1/breachesBody:
{
"title": "Acceso no autorizado a base de datos de clientes",
"detectedAt": "2026-03-08T03:15:00Z",
"detectionSource": "manual",
"description": "Se detecto acceso no autorizado desde IP externa a la base de datos de produccion",
"attackVector": "phishing",
"dataCategories": ["name", "email", "rut", "phone"],
"hasSensitiveData": true,
"estimatedRecords": 1500,
"containmentActions": ["Bloqueo de IP", "Rotacion de credenciales"]
}Campos requeridos: title, detectedAt, detectionSource.
Respuesta (201):
{
"success": true,
"data": {
"id": "brch_new456",
"title": "Acceso no autorizado a base de datos de clientes",
"status": "detected",
"detectedAt": "2026-03-08T03:15:00Z",
"createdAt": "2026-03-08T03:20:00Z"
}
}Obtener detalle del incidente
GET /api/v1/breaches/:idcurl -X GET https://api.dpolab.com/api/v1/breaches/brch_abc123 \
-H "Authorization: Bearer {token}"Respuesta (200):
{
"success": true,
"data": {
"id": "brch_abc123",
"title": "Acceso no autorizado a base de datos de clientes",
"description": "Se detecto acceso no autorizado desde IP externa",
"status": "investigating",
"detectedAt": "2026-03-08T03:15:00Z",
"detectionSource": "manual",
"attackVector": "phishing",
"dataCategories": ["name", "email", "rut", "phone"],
"hasSensitiveData": true,
"estimatedRecords": 1500,
"containmentActions": ["Bloqueo de IP", "Rotacion de credenciales"],
"requiresNotification": true,
"notificationDeadlineAt": "2026-03-11T03:15:00Z",
"notifiedApdpAt": null,
"events": [
{
"type": "status_change",
"from": "detected",
"to": "investigating",
"notes": "Inicio de investigacion",
"createdAt": "2026-03-08T04:00:00Z"
}
],
"createdAt": "2026-03-08T03:20:00Z",
"updatedAt": "2026-03-08T10:00:00Z"
}
}Actualizar incidente
PUT /api/v1/breaches/:idPermite actualizar campos parciales del incidente.
curl -X PUT https://api.dpolab.com/api/v1/breaches/brch_abc123 \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"containmentActions": ["Bloqueo de IP", "Rotacion de credenciales", "Revision de logs"],
"estimatedRecords": 2300
}'Cambiar estado del incidente
PATCH /api/v1/breaches/:id/statusBody:
{
"status": "contained",
"notes": "Se aislaron los sistemas afectados y se rotaron todas las credenciales."
}Campos requeridos: status.
Ejemplo:
curl -X PATCH https://api.dpolab.com/api/v1/breaches/brch_abc123/status \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"status": "contained", "notes": "Sistemas aislados exitosamente."}'Transiciones de estado permitidas
detected → investigating → contained → resolved
→ notified| Estado | Descripcion |
|---|---|
detected | Incidente detectado, pendiente de investigacion |
investigating | En proceso de investigacion |
contained | Incidente contenido, impacto limitado |
resolved | Incidente cerrado y resuelto |
notified | Notificado a la APDP y/o titulares |
Arbol de decision de notificacion
POST /api/v1/breaches/:id/decision-treeEvalua si el incidente requiere notificacion a la APDP y/o a los titulares afectados, segun los criterios de la Ley 21.719.
Body:
{
"riskToSubjects": "high",
"hasSensitiveData": true,
"hasMinorData": false,
"hasFinancialData": true
}Campos requeridos: riskToSubjects, hasSensitiveData, hasMinorData, hasFinancialData.
Ejemplo:
curl -X POST https://api.dpolab.com/api/v1/breaches/brch_abc123/decision-tree \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"riskToSubjects": "high", "hasSensitiveData": true, "hasMinorData": false, "hasFinancialData": true}'Respuesta (200):
{
"success": true,
"data": {
"requiresNotification": true,
"requiresSubjectNotification": true,
"notificationDeadlineAt": "2026-03-11T03:15:00Z",
"urgency": "high"
}
}La Ley 21.719 establece un plazo maximo de 72 horas para notificar a la APDP desde la deteccion del incidente. El incumplimiento puede resultar en sanciones.
Notificar a la APDP
POST /api/v1/breaches/:id/notify-apdpRegistra la notificacion formal a la Agencia de Proteccion de Datos Personales.
Body:
{
"notifiedAt": "2026-03-09T14:00:00Z",
"notificationFileKey": "uploads/breach-notifications/brch_abc123.pdf"
}Campos requeridos: notifiedAt, notificationFileKey.
Ejemplo:
curl -X POST https://api.dpolab.com/api/v1/breaches/brch_abc123/notify-apdp \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"notifiedAt": "2026-03-09T14:00:00Z", "notificationFileKey": "uploads/breach-notifications/brch_abc123.pdf"}'Respuesta (200):
{
"success": true,
"data": {
"notifiedAt": "2026-03-09T14:00:00Z",
"notificationFileKey": "uploads/breach-notifications/brch_abc123.pdf",
"status": "notified"
}
}Obtener plantilla de notificacion
GET /api/v1/breaches/:id/notification-templateGenera una plantilla de notificacion prellenada con los datos del incidente, lista para enviar a la APDP.
curl -X GET https://api.dpolab.com/api/v1/breaches/brch_abc123/notification-template \
-H "Authorization: Bearer {token}"Respuesta (200):
{
"success": true,
"data": {
"template": "Senor/a Director/a\nAgencia de Proteccion de Datos Personales\n\nDe conformidad con lo establecido en el articulo 14 sexies de la Ley 21.719..."
}
}Webhook Wazuh
POST /api/v1/webhooks/wazuh/:tenantSlugEndpoint para recibir alertas automaticas desde Wazuh SIEM. Crea incidentes automaticamente a partir de las alertas. El tenant se identifica por el parametro :tenantSlug en la URL.
Autenticacion: HMAC-SHA256 - Se valida la firma del payload usando un secreto compartido configurado en los settings del tenant.
Header requerido: X-Wazuh-Signature: sha256={hmac_signature}
curl -X POST https://api.dpolab.com/api/v1/webhooks/wazuh/mi-empresa \
-H "Content-Type: application/json" \
-H "X-Wazuh-Signature: sha256=abc123..." \
-d '{
"alert": {
"rule": {
"id": "100200",
"description": "Multiple failed login attempts detected",
"level": 12
},
"agent": {
"name": "web-server-01"
},
"timestamp": "2026-03-09T02:30:00Z"
}
}'Respuesta (201):
{
"success": true,
"data": {
"breachId": "brch_auto789",
"status": "detected",
"detectionSource": "wazuh"
}
}Las alertas de Wazuh se clasifican automaticamente en severidad segun el level de la regla: 0-7 = low, 8-10 = medium, 11-13 = high, 14+ = critical.
Ver tambien
- Modulo Brechas — Guia funcional de gestion de brechas de seguridad