Coletar registros do HackerOne
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
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na próxima página, clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
HackerOne Webhook). - Selecione Webhook como o Tipo de origem.
- Selecione HackerOne como o Tipo de registro.
- Clique em Próxima.
- 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
- Clique em Próxima.
- 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:
- Na página de detalhes do feed, clique em Gerar chave secreta.
- Uma caixa de diálogo mostra a chave secreta.
- 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
- Acesse a guia Detalhes do feed.
- Na seção Informações do endpoint, copie o URL do endpoint do feed.
O formato do URL é:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateou para endpoints regionais:
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateSalve esse URL para as próximas etapas.
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
- Acesse a página "Credenciais" do Console do Google Cloud.
- Selecione seu projeto (o projeto associado à sua instância do Google SecOps).
- Clique em Criar credenciais > Chave de API.
- Uma chave de API é criada e mostrada em uma caixa de diálogo.
- Clique em Editar chave de API para restringir a chave.
Restringir a chave de API
- Na página de configurações da chave de API:
- Nome: insira um nome descritivo, por exemplo,
Chronicle HackerOne Webhook API Key.
- Nome: insira um nome descritivo, por exemplo,
- Em Restrições de API:
- Selecione Restringir chave.
- No menu suspenso Selecionar APIs, pesquise e selecione API Google SecOps (ou API Chronicle).
- Clique em Salvar.
- Copie o valor da chave de API do campo Chave de API na parte de cima da página.
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
- Faça login no HackerOne e acesse seu programa.
- Acesse Engajamentos, clique no menu kebab do programa que você quer configurar e em Configurações.
- Acesse Automação > Webhooks.
- Clique em Novo webhook.
- 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.
- URL de payload: cole o URL completo com a chave de API e o secret acima (por exemplo,
- 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.
Clique em Add webhook.
Testar o webhook
- 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.
- Verifique se a resposta é HTTP 200.
- Clique no webhook para conferir os detalhes.
- Na seção Entregas recentes, verifique se as entregas recentes mostram o status "Concluído" (HTTP 200).
- 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
- Acesse Configurações do SIEM > Feeds no Google SecOps.
- Localize seu feed de webhook do HackerOne.
- Verifique a coluna Status (deve ser Ativo).
- Verifique a contagem de Eventos recebidos (ela precisa estar aumentando).
- 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.