Recopila registros de HackerOne
En este documento, se explica cómo configurar HackerOne para enviar registros a las Operaciones de seguridad de Google con webhooks.
HackerOne es una plataforma de coordinación de vulnerabilidades y recompensas por errores que conecta a las organizaciones con investigadores de seguridad para identificar y corregir vulnerabilidades de seguridad. La plataforma ofrece programas de recompensas por detección de errores, programas de divulgación de vulnerabilidades, pruebas de penetración y pruebas de seguridad continuas durante todo el ciclo de vida del desarrollo de software.
Antes de comenzar
Asegúrate de cumplir con los siguientes requisitos previos:
Una instancia de Google SecOps
Programa de HackerOne con nivel Profesional o Enterprise (los webhooks solo están disponibles para estos niveles)
Acceso administrativo a la configuración de tu programa de HackerOne
Acceso a la Google Cloud Console (para la creación de claves de API)
Crea un feed de webhook en Google SecOps
Crea el feed
- Ve a Configuración de SIEM > Feeds.
- Haz clic en Agregar feed nuevo.
- En la siguiente página, haz clic en Configurar un solo feed.
- En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo,
HackerOne Webhook). - Selecciona Webhook como el Tipo de origen.
- Selecciona HackerOne como el Tipo de registro.
- Haz clic en Siguiente.
- Especifica valores para los siguientes parámetros de entrada:
- Delimitador de división: Déjalo vacío. Cada solicitud de webhook contiene un solo evento JSON.
- Espacio de nombres del recurso: Es el espacio de nombres del recurso.
- Etiquetas de transmisión: Es la etiqueta que se aplicará a los eventos de este feed.
- Haz clic en Siguiente.
- Revisa la nueva configuración del feed en la pantalla Finalizar y, luego, haz clic en Enviar.
Genera y guarda la clave secreta
Después de crear el feed, debes generar una clave secreta para la autenticación:
- En la página de detalles del feed, haz clic en Generar clave secreta.
- Un diálogo muestra la clave secreta.
- Copia y guarda la clave secreta de forma segura.
Importante: La clave secreta solo se muestra una vez y no se puede recuperar más adelante. Si la pierdes, tendrás que generar una nueva.
Obtén la URL del extremo del feed
- Ve a la pestaña Detalles del feed.
- En la sección Endpoint Information, copia la URL del extremo del feed.
El formato de la URL es el siguiente:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateo para extremos regionales:
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateGuarda esta URL para los próximos pasos.
Haz clic en Listo.
Crea una clave de API de Google Cloud
Chronicle requiere una clave de API para la autenticación. Crea una clave de API restringida en la Google Cloud Console.
Crea la clave de API
- Ve a la página Credenciales de la consola de Google Cloud.
- Selecciona tu proyecto (el proyecto asociado con tu instancia de Google SecOps).
- Haz clic en Crear credenciales > Clave de API.
- Se creará una clave de API y se mostrará en un diálogo.
- Haz clic en Editar clave de API para restringir la clave.
Restringe la clave de API
- En la página de configuración de la clave de API, haz lo siguiente:
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
Chronicle HackerOne Webhook API Key).
- Nombre: Ingresa un nombre descriptivo (por ejemplo,
- En Restricciones de API, haz lo siguiente:
- Selecciona Restringir clave.
- En el menú desplegable Seleccionar APIs, busca y selecciona Google SecOps API (o Chronicle API).
- Haz clic en Guardar.
- Copia el valor de la clave de API del campo Clave de API en la parte superior de la página.
Guarda la clave de API de forma segura.
Configura el webhook de HackerOne
Construye la URL del webhook
Combina la URL del extremo de Google SecOps, la clave de API y la clave secreta en una sola URL. Tanto la clave de API como la clave secreta deben anexarse como parámetros de consulta.
Formato de URL:
```none
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>
```
Ejemplo:
```none
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
```
Reemplaza lo siguiente:
- <ENDPOINT_URL>: Es la URL del extremo del feed de la sección Obtén la URL del extremo del feed.
- <API_KEY>: Es la clave de API de Google Cloud de la sección Crea una clave de API de Google Cloud.
- <SECRET_KEY>: Es la clave secreta de la sección Genera y guarda la clave secreta.
Importante: No ingreses la clave secreta de Google SecOps en el campo Secreto de HackerOne. El campo Secreto de HackerOne se usa para la validación de la firma de la carga útil de HMAC (encabezado X-H1-Signature), que es un mecanismo independiente de la autenticación del webhook de Google SecOps. Si colocas el secreto de Google SecOps en el campo Secreto de HackerOne, se producirá un error 403 Forbidden porque HackerOne no pasa ese valor como credencial de autenticación de Google SecOps. En su lugar, anexa key y secret como parámetros de búsqueda en la URL de carga útil.
Crea un webhook en HackerOne
- Accede a HackerOne y navega a tu programa.
- Ve a Participaciones, haz clic en el menú de tres puntos del programa que deseas configurar y, luego, en Configuración.
- Ve a Automatización > Webhooks.
- Haz clic en Webhook nuevo.
- Proporciona los siguientes detalles de configuración:
- URL de carga útil: Pega la URL completa con la clave de API y el secreto que se indicaron anteriormente (por ejemplo,
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...). - Secreto: Deja este campo en blanco.
- URL de carga útil: Pega la URL completa con la clave de API y el secreto que se indicaron anteriormente (por ejemplo,
- Selecciona los eventos que deseas que activen el webhook. Elige una de las siguientes opciones:
- Envíame todo: Todos los eventos activarán el webhook.
- Permítame especificar eventos individuales: Selecciona los eventos específicos que deseas enviar a Google SecOps.
Haz clic en Add webhook (Agregar webhook).
Prueba el webhook
- En la página de configuración del webhook, haz clic en Solicitud de prueba para enviar una solicitud de ejemplo a la URL de carga útil configurada.
- Verifica que la respuesta sea HTTP 200.
- Haz clic en tu webhook para ver los detalles.
- En la sección Recent deliveries, verifica que las entregas recientes muestren el estado correcto (HTTP 200).
- Haz clic en cualquier entrega para ver la solicitud de carga útil de POST.
Si recibes un error, haz lo siguiente:
- HTTP 403: Verifica que la clave de API y la clave secreta se hayan agregado correctamente como parámetros de consulta en la URL de carga útil. Confirma que el campo Secreto de HackerOne esté en blanco.
- HTTP 401: Verifica que la clave de API sea válida y esté restringida a la API de Google SecOps.
- HTTP 404: Verifica que la URL del extremo sea correcta y que incluya la ruta completa (/v2/unstructuredlogentries:batchCreate).
Verifica la transferencia en Google SecOps
- Ve a Configuración de SIEM > Feeds en Google SecOps.
- Busca tu feed de webhook de HackerOne.
- Verifica la columna Estado (debe ser Activo).
- Verifica el recuento de Eventos recibidos (debe aumentar).
- Verifica la marca de tiempo de Última vez que se realizó correctamente (debe ser reciente).
Límites y prácticas recomendadas para webhooks
Límites de solicitudes
| Limit | Value |
|-------|-------|
| **Max request size** | 4 MB |
| **Max QPS (queries per second)** | 15,000 |
| **Request timeout** | 30 seconds |
| **Retry behavior** | Automatic with exponential backoff |
Tabla de asignación de UDM
| Campo de registro | Asignación de UDM | Lógica |
|---|---|---|
| attributes.cleared, attributes.rules_of_engagement_signed, attributes.identity_verified, attributes.background_checked, attributes.citizenship_verified, attributes.residency_verified, type, attributes.title, attributes.main_state, attributes.state, relationships.reporter.data.type, relationships.reporter.data.attributes.reputation, relationships.reporter.data.attributes.signal, relationships.reporter.data.attributes.impact, relationships.reporter.data.attributes.disabled, relationships.reporter.data.attributes.profile_picture.62x62, relationships.reporter.data.attributes.profile_picture.82x82, relationships.reporter.data.attributes.profile_picture.110x110, relationships.reporter.data.attributes.profile_picture.260x260, relationships.reporter.data.attributes.hackerone_triager, relationships.program.data.id, relationships.program.data.type, relationships.program.data.attributes.handle, relationships.severity.data.type, relationships.severity.data.attributes.rating, relationships.severity.data.attributes.author_type, relationships.severity.data.attributes.calculation_method, relationships.weakness.data.id, relationships.weakness.data.type, relationships.weakness.data.attributes.name, relationships.weakness.data.attributes.description, relationships.weakness.data.attributes.external_id, relationships.structured_scope.data.id, relationships.structured_scope.data.type, relationships.structured_scope.data.attributes.asset_type, relationships.structured_scope.data.attributes.eligible_for_bounty, relationships.structured_scope.data.attributes.eligible_for_submission, relationships.structured_scope.data.attributes.instruction, relationships.structured_scope.data.attributes.max_severity, relationships.structured_scope.data.attributes.confidentiality_requirement, relationships.structured_scope.data.attributes.integrity_requirement, relationships.structured_scope.data.attributes.availability_requirement, relationships.inboxes.data.id, relationships.inboxes.data.type, relationships.inboxes.data.attributes.name, relationships.inboxes.data.attributes.type | additional.fields | Se combinan como etiquetas de pares clave-valor |
| timestamp | metadata.event_timestamp | Se analizó con el filtro de fecha con el formato aaaa-MM-dd'T'HH:mm:ss.SSSZ. |
| metadata.event_type | Se establece en "STATUS_UPDATE" si has_principal es verdadero, en "USER_UNCATEGORIZED" si has_principal_user_user es verdadero y, de lo contrario, en "GENERIC_EVENT". | |
| id | metadata.product_log_id | Valor copiado directamente |
| relationships.structured_scope.data.attributes.asset_identifier | principal.asset.asset_id | Tiene el prefijo "ASSET:". |
| attributes.email_alias | principal.user.email_addresses | Combinado |
| relationships.reporter.data.id | principal.user.employee_id | Valor copiado directamente |
| relationships.reporter.data.attributes.name | principal.user.first_name | Valor copiado directamente |
| attributes.username, relationships.reporter.data.attributes.username | principal.user.user_display_name | Valor de relationships.reporter.data.attributes.username si no está vacío; de lo contrario, attributes.username |
| relationships.severity.data.attributes.user_id | principal.user.userid | Valor copiado directamente |
| relationships.severity.data.id | security_result.rule_id | Valor copiado directamente |
| relationships.severity.data.attributes.max_severity | security_result.severity | Se convirtió a mayúsculas |
| attributes.vulnerability_information | security_result.summary | Valor copiado directamente |
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.