Coletar registros do HackerOne

Compatível com:

Este documento explica como configurar o HackerOne para enviar registros ao Google Security Operations usando webhooks.

O HackerOne é uma plataforma de coordenação de vulnerabilidades e recompensas por bugs que conecta organizações a pesquisadores de segurança para identificar e corrigir vulnerabilidades de segurança. A plataforma oferece programas de recompensas por bugs, programas de divulgação de vulnerabilidades, testes de penetração e testes contínuos de segurança durante todo o ciclo de vida de desenvolvimento de software.

Antes de começar

  • Verifique se você atende os seguintes pré-requisitos:

  • Uma instância do Google SecOps

  • Programa HackerOne com nível Professional ou Enterprise (webhooks estão disponíveis apenas para esses níveis)

  • Acesso administrativo às configurações do programa HackerOne

  • Acesso ao console do Google Cloud (para criação de chaves de API)

Criar um feed de webhook no Google SecOps

Criar o feed

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Na próxima página, clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, HackerOne Webhook).
  5. Selecione Webhook como o Tipo de origem.
  6. Selecione HackerOne como o Tipo de registro.
  7. Clique em Próxima.
  8. Especifique valores para os seguintes parâmetros de entrada:
    • Delimitador de divisão: deixe em branco. Cada solicitação de webhook contém um único evento JSON.
    • Namespace do recurso: o namespace do recurso
    • Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed
  9. Clique em Próxima.
  10. Revise a nova configuração do feed na tela Finalizar e clique em Enviar.

Gerar e salvar a chave secreta

Depois de criar o feed, gere uma chave secreta para autenticação:

  1. Na página de detalhes do feed, clique em Gerar chave secreta.
  2. Uma caixa de diálogo mostra a chave secreta.
  3. Copie e salve a chave secreta com segurança.

Importante: a chave secreta é exibida apenas uma vez e não pode ser recuperada depois. Em caso de perda, será necessário gerar uma nova chave secreta.

Receber o URL do endpoint do feed

  1. Acesse a guia Detalhes do feed.
  2. Na seção Informações do endpoint, copie o URL do endpoint do feed.
  3. O formato do URL é:

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

    ou para endpoints regionais:

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  4. Salve esse URL para as próximas etapas.

  5. Clique em Concluído.

Criar chave de API do Google Cloud

O Chronicle exige uma chave de API para autenticação. Crie uma chave de API restrita no console do Google Cloud.

Criar a chave de API

  1. Acesse a página "Credenciais" do Console do Google Cloud.
  2. Selecione seu projeto (o projeto associado à sua instância do Google SecOps).
  3. Clique em Criar credenciais > Chave de API.
  4. Uma chave de API é criada e mostrada em uma caixa de diálogo.
  5. Clique em Editar chave de API para restringir a chave.

Restringir a chave de API

  1. Na página de configurações da chave de API:
    • Nome: insira um nome descritivo, por exemplo, Chronicle HackerOne Webhook API Key.
  2. Em Restrições de API:
    1. Selecione Restringir chave.
    2. No menu suspenso Selecionar APIs, pesquise e selecione API Google SecOps (ou API Chronicle).
  3. Clique em Salvar.
  4. Copie o valor da chave de API do campo Chave de API na parte de cima da página.
  5. Salve a chave de API com segurança.

Configurar o webhook do HackerOne

Criar o URL do webhook

Combine o URL do endpoint do Google SecOps, a chave de API e a chave secreta em um único URL. A chave de API e a chave secreta precisam ser anexadas como parâmetros de consulta.

Formato do URL:

```none
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>
```

Exemplo:

```none
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
```

Substitua o seguinte: - <ENDPOINT_URL>: o URL do endpoint do feed da seção Gerar o URL do endpoint do feed. - <API_KEY>: a chave de API do Google Cloud da seção Criar chave de API do Google Cloud. - <SECRET_KEY>: a chave secreta da seção Gerar e salvar chave secreta.

Importante: não coloque a chave secreta do Google SecOps no campo Secret do HackerOne. O campo Secret do HackerOne é usado para validação de assinatura de payload HMAC (cabeçalho X-H1-Signature), que é um mecanismo separado da autenticação de webhook do Google SecOps. Colocar o secret do Google SecOps no campo Secret do HackerOne vai resultar em um erro 403 Forbidden porque o HackerOne não transmite esse valor como uma credencial de autenticação do Google SecOps. Em vez disso, adicione key e secret como parâmetros de consulta no URL de payload.

Criar webhook no HackerOne

  1. Faça login no HackerOne e acesse seu programa.
  2. Acesse Engajamentos, clique no menu kebab do programa que você quer configurar e em Configurações.
  3. Acesse Automação > Webhooks.
  4. Clique em Novo webhook.
  5. Informe os seguintes detalhes de configuração:
    • URL de payload: cole o URL completo com a chave de API e o secret acima (por exemplo, https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...).
    • Secret: deixe este campo em branco.
  6. Selecione os eventos que vão acionar o webhook. Escolha uma das opções a seguir:
    • Envie tudo: todos os eventos vão acionar o webhook.
    • Quero especificar eventos individuais: selecione os eventos específicos que você quer enviar ao Google SecOps.
  7. Clique em Add webhook.

Testar o webhook

  1. Na página de configuração do webhook, clique em Testar solicitação para enviar um exemplo de solicitação ao URL do payload configurado.
  2. Verifique se a resposta é HTTP 200.
  3. Clique no webhook para conferir os detalhes.
  4. Na seção Entregas recentes, verifique se as entregas recentes mostram o status "Concluído" (HTTP 200).
  5. Clique em qualquer entrega para ver a solicitação de payload POST.

Se você receber um erro: - HTTP 403: verifique se a chave de API e a chave secreta foram anexadas corretamente como parâmetros de consulta no URL do payload. Confirme se o campo Secret do HackerOne está em branco. - HTTP 401: verifique se a chave de API é válida e restrita à API Google SecOps. - HTTP 404: verifique se o URL do endpoint está correto e inclui o caminho completo (/v2/unstructuredlogentries:batchCreate).

Verificar a ingestão no Google SecOps

  1. Acesse Configurações do SIEM > Feeds no Google SecOps.
  2. Localize seu feed de webhook do HackerOne.
  3. Verifique a coluna Status (deve ser Ativo).
  4. Verifique a contagem de Eventos recebidos (ela precisa estar aumentando).
  5. Verifique o carimbo de data/hora Última execução bem-sucedida em (deve ser recente).

Limites e práticas recomendadas de webhook

Limites de solicitações

| Limit | Value |
|-------|-------|
| **Max request size** | 4 MB |
| **Max QPS (queries per second)** | 15,000 |
| **Request timeout** | 30 seconds |
| **Retry behavior** | Automatic with exponential backoff |

Tabela de mapeamento do UDM

Campo de registro Mapeamento do 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 Unidos como rótulos de chave-valor
timestamp metadata.event_timestamp Analisado usando o filtro de data com o formato aaaa-MM-dd'T'HH:mm:ss.SSSZ
metadata.event_type Definido como "STATUS_UPDATE" se has_principal for verdadeiro, "USER_UNCATEGORIZED" se has_principal_user_user for verdadeiro ou "GENERIC_EVENT"
ID metadata.product_log_id Valor copiado diretamente
relationships.structured_scope.data.attributes.asset_identifier principal.asset.asset_id Prefixo "ASSET:"
attributes.email_alias principal.user.email_addresses Mesclado
relationships.reporter.data.id principal.user.employee_id Valor copiado diretamente
relationships.reporter.data.attributes.name principal.user.first_name Valor copiado diretamente
attributes.username, relationships.reporter.data.attributes.username principal.user.user_display_name Valor de "relationships.reporter.data.attributes.username" se não estiver vazio. Caso contrário, "attributes.username".
relationships.severity.data.attributes.user_id principal.user.userid Valor copiado diretamente
relationships.severity.data.id security_result.rule_id Valor copiado diretamente
relationships.severity.data.attributes.max_severity security_result.severity Convertido para maiúsculas
attributes.vulnerability_information security_result.summary Valor copiado diretamente

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.