Recopila registros de HackerOne

Se admite en los siguientes sistemas operativos:

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 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 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

  1. Ve a Configuración de SIEM > Feeds.
  2. Haz clic en Add New Feed.
  3. En la siguiente página, haz clic en Configurar un solo feed.
  4. En el campo Nombre del feed, ingresa un nombre para el feed (por ejemplo, HackerOne Webhook).
  5. Selecciona Webhook como el Tipo de fuente.
  6. Selecciona HackerOne como el Tipo de registro.
  7. Haz clic en Siguiente.
  8. 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 transferencia: Es la etiqueta que se aplicará a los eventos de este feed.
  9. Haz clic en Siguiente.
  10. 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:

  1. En la página de detalles del feed, haz clic en Generar clave secreta.
  2. Un diálogo muestra la clave secreta.
  3. 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, deberás generar una nueva.

Obtén la URL del extremo del feed

  1. Ve a la pestaña Detalles del feed.
  2. En la sección Endpoint Information, copia la URL del extremo del feed.
  3. El formato de la URL es el siguiente:

    https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    

    o para extremos regionales:

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  4. Guarda esta URL para los próximos pasos.

  5. 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

  1. Ve a la página Credenciales de la consola de Google Cloud.
  2. Selecciona tu proyecto (el proyecto asociado con tu instancia de Google SecOps).
  3. Haz clic en Crear credenciales > Clave de API.
  4. Se creará una clave de API y se mostrará en un diálogo.
  5. Haz clic en Editar clave de API para restringir la clave.

Restringe la clave de API

  1. 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).
  2. En Restricciones de API, haz lo siguiente:
    1. Selecciona Restringir clave.
    2. En el menú desplegable Seleccionar APIs, busca y selecciona Google SecOps API (o Chronicle API).
  3. Haz clic en Guardar.
  4. Copia el valor de la clave de API del campo Clave de API en la parte superior de la página.
  5. Guarda la clave de API de forma segura.

Configura el webhook de HackerOne

Cómo construir 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 agregarse como parámetros de consulta.

Formato de la 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>: 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 coloques la clave secreta de Google SecOps en el campo Secreto 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 Secreto de HackerOne, se producirá un error de 403 Forbidden porque HackerOne no pasa ese valor como una credencial de autenticación de Google SecOps. En su lugar, agrega key y secret como parámetros de consulta en la URL de carga útil.

Crea un webhook en HackerOne

  1. Accede a HackerOne y navega a tu programa.
  2. Ve a Participaciones, haz clic en el menú de tres puntos del programa que quieres configurar y, luego, en Configuración.
  3. Ve a Automatización > Webhooks.
  4. Haz clic en Webhook nuevo.
  5. 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.
  6. Selecciona los eventos que quieres que activen el webhook. Elige una de las siguientes opciones:
    • Envíame todo: Todos los eventos activarán el webhook.
    • Permítanme especificar eventos individuales: Selecciona los eventos específicos que deseas enviar a Google SecOps.
  7. Haz clic en Add webhook (Agregar webhook).

Prueba el webhook

  1. En la página de configuración del webhook, haz clic en Test request para enviar una solicitud de ejemplo a la URL de carga útil configurada.
  2. Verifica que la respuesta sea HTTP 200.
  3. Haz clic en tu webhook para ver los detalles.
  4. En la sección Entregas recientes, verifica que las entregas recientes muestren el estado correcto (HTTP 200).
  5. 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

  1. Ve a Configuración de SIEM > Feeds en Google SecOps.
  2. Busca tu feed de webhook de HackerOne.
  3. Verifica la columna Estado (debe ser Activo).
  4. Verifica el recuento de Eventos recibidos (debe aumentar).
  5. 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 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, de lo contrario, en "GENERIC_EVENT"
id metadata.product_log_id El valor se copió directamente.
relationships.structured_scope.data.attributes.asset_identifier principal.asset.asset_id Con el prefijo "ASSET:"
attributes.email_alias principal.user.email_addresses Combinado
relationships.reporter.data.id principal.user.employee_id El valor se copió directamente.
relationships.reporter.data.attributes.name principal.user.first_name El valor se copió 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 El valor se copió directamente.
relationships.severity.data.id security_result.rule_id El valor se copia directamente.
relationships.severity.data.attributes.max_severity security_result.severity Se convirtió a mayúsculas
attributes.vulnerability_information security_result.summary El valor se copia 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.