Recopila registros de HackerOne
En este documento, se explica cómo configurar HackerOne para enviar registros a Google Security Operations 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 proporciona programas de recompensas por 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:
Una instancia de Google SecOps
Programa de HackerOne con nivel Professional o Enterprise (los webhooks solo están disponibles para estos niveles)
Acceso de administrador 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 página siguiente, 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: El espacio de nombres del recurso
- Etiquetas de transferencia: Es la etiqueta que se aplicará a los eventos de este feed
- Haz clic en Siguiente.
- Revisa la configuración de tu nuevo feed de noticias 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.
- Aparecerá un diálogo que muestra la clave secreta.
- Copia y guarda la clave secreta de forma segura.
Importante: La clave secreta se muestra solo una vez y no se puede recuperar más adelante. Si la pierdes, deberás generar una nueva.
Obtén la URL del extremo del feed
- Ve a la pestaña Detalles del feed.
- En la sección Información del extremo, copia la URL del extremo del feed.
El formato de la URL es el siguiente:
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:importDonde
{region}es la región de tu instancia de Google SecOps (por ejemplo,us,europe, oasia-southeast1), y{parent}es la ruta de acceso del recurso en el formatoprojects/<PROJECT_ID>/locations/<LOCATION>/instances/<INSTANCE_ID>/logTypes/<LOG_TYPE>.Guarda 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:
- Selecciona Restringir clave.
- En el menú desplegable Seleccionar APIs, busca y selecciona API de Google SecOps (o API de Chronicle).
- 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
Crea 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://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...&secret=abcd1234...
```
Reemplaza lo siguiente:
- <ENDPOINT_URL>: La URL del extremo del feed de la sección Obtén la URL del extremo del feed.
- <API_KEY>: La clave de API de Google Cloud de la sección Crea una clave de API de Google Cloud.
- <SECRET_KEY>: La clave secreta de la sección Genera y guarda la clave secreta.
Importante: No coloques la clave secreta de Google SecOps en el campo Secret de HackerOne. El campo Secret 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 de webhook de Google SecOps. Si colocas el secreto de Google SecOps en el campo Secret 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 consulta en la URL de la carga útil.
Crea un webhook en HackerOne
- Accede a HackerOne y navega a tu programa.
- Ve a Engagements, haz clic en el menú kebab del programa que deseas configurar y, luego, haz clic en Settings.
- Ve a Automation > Webhooks.
- Haz clic en New webhook.
- Proporciona los siguientes detalles de configuración:
- URL de la carga útil: Pega la URL completa con la clave de API y el secreto de arriba. Por ejemplo,
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...&secret=abcd1234.... - Secreto: Deja este campo en blanco.
- URL de la carga útil: Pega la URL completa con la clave de API y el secreto de arriba. Por ejemplo,
- Selecciona los eventos que deseas activar el webhook. Elige una de las siguientes opciones:
- Send me everything: Todos los eventos activarán el webhook.
- Let me specify individual events: Selecciona los eventos específicos que deseas enviar a Google SecOps.
Haz clic en Add webhook.
Prueba el webhook
- En la página de configuración del webhook, haz clic en Test request para enviar una solicitud de ejemplo a la URL de la 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:
- HTTP 403: Verifica que la clave de API y la clave secreta se anexen correctamente como parámetros de consulta en la URL de la carga útil. Confirma que el campo Secret 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 de acceso completa (/v1/{parent}/logs:import).
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 operación correcta (debe ser reciente).
Límites y prácticas recomendadas de webhook
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 combinó como 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 | Convertido a mayúsculas |
| attributes.vulnerability_information | security_result.summary | Valor copiado directamente |
Registro de cambios
Consulta el registro de cambios de este analizador
¿Necesitas más ayuda? Obtén respuestas de miembros de la comunidad y profesionales de Google SecOps.