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
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 Vulnerability Reports). - 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 (opcional): 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.
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
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 Chronicle).
- Clique em Criar credenciais > Chave de API.
- Uma chave de API é criada e exibida 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.
- Na lista 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 Chronicle e a chave de API:
<ENDPOINT_URL>?key=<API_KEY>Exemplo:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
Criar webhook no HackerOne
- Faça login no HackerOne e navegue até 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 do endpoint com a chave de API acima.
- Secret: cole a chave secreta da criação do feed do Chronicle.
- Selecione os eventos que você quer usar para acionar o webhook: escolha uma das seguintes opções:
- Envie tudo: todos os eventos vão acionar o webhook.
- Quero especificar eventos individuais: selecione os eventos específicos que você quer enviar ao Chronicle. Eventos recomendados para monitoramento de segurança:
- report_created: quando um hacker envia uma nova denúncia de vulnerabilidade
- report_triaged: quando um relatório é triado
- report_resolved: quando uma denúncia é resolvida
- report_bounty_awarded: quando uma recompensa é concedida
- report_swag_awarded: quando um brinde é concedido
- program_hacker_joined: quando um hacker entra no programa
- program_hacker_left: quando um hacker sai do programa
- Clique em Add webhook.
Testar o webhook
- Na página de configuração do webhook, selecione Solicitação de teste para enviar um exemplo de solicitação ao URL de payload configurado.
- Verifique se a resposta é HTTP 200.
- Verifique o feed do Chronicle para o evento de teste em um ou dois minutos.
Verificar se o webhook está funcionando
Verificar o status do webhook do HackerOne
- Faça login no console do HackerOne.
- Acesse Engajamentos, clique no menu kebab do seu programa e em Configurações.
- Acesse Automação > Webhooks.
- 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.
Verificar o status do feed do Chronicle
- Acesse Configurações do SIEM > Feeds no Chronicle.
- 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).
Verificar registros no Chronicle
- Acesse Pesquisar > Pesquisa do UDM.
Use a seguinte consulta:
metadata.vendor_name = "HACKERONE" AND metadata.product_name = "HACKERONE"Ajuste o período para a última hora.
Verifique se os eventos aparecem nos resultados.
Referência de métodos de autenticação
Os feeds de webhook do Chronicle são compatíveis com vários métodos de autenticação. Os webhooks do HackerOne usam uma combinação de parâmetros de consulta e validação de assinatura.
Método 1: parâmetros de consulta com validação de assinatura (recomendado para o HackerOne)
O HackerOne envia webhooks para o URL de payload configurado. A autenticação é processada por:
- Chave de API no URL: a chave de API do Chronicle é anexada como um parâmetro de consulta ao URL de payload.
Validação de assinatura secreta: o HackerOne gera um cabeçalho X-H1-Signature que contém um hexdigest HMAC SHA256 do corpo da solicitação assinado com o segredo configurado.
Formato do URL:
<ENDPOINT_URL>?key=<API_KEY>Formato da solicitação:
POST <ENDPOINT_URL>?key=<API_KEY> HTTP/1.1 Content-Type: application/json X-H1-Signature: sha256=<HMAC_HEXDIGEST> X-H1-Event: <EVENT_TYPE> X-H1-Delivery: <DELIVERY_ID> { "data": { "activity": {...}, "report": {...} } }
Vantagens:
- Autenticação dupla: chave de API para acesso ao Chronicle e assinatura para validação de payload
- O HackerOne oferece geração de assinatura integrada.
- Verificação segura da integridade do payload
Validação de assinatura
O HackerOne inclui os seguintes cabeçalhos em cada solicitação de webhook:
- X-H1-Signature: hexdigest HMAC SHA256 do corpo da solicitação (formato:
sha256=<hexdigest>) - X-H1-Event: o tipo de evento que acionou o webhook.
- X-H1-Delivery: identificador exclusivo da entrega.
- X-H1-Signature: hexdigest HMAC SHA256 do corpo da solicitação (formato:
Para validar a assinatura no endpoint de recebimento:
import hmac import hashlib def validate_request(request_body, secret, signature): _, digest = signature.split('=') generated_digest = hmac.new( secret.encode(), request_body.encode(), hashlib.sha256 ).hexdigest() return hmac.compare_digest(digest, generated_digest)
Tipos de eventos de webhook
O HackerOne é compatível com os seguintes tipos de eventos de webhook:
| Tipo de evento | Descrição |
|---|---|
| report_created | Acionado quando um hacker envia um novo relatório de vulnerabilidade. |
| report_triaged | Acionado quando uma denúncia é analisada |
| report_resolved | Acionado quando uma denúncia é resolvida |
| report_bounty_awarded | Acionado quando uma recompensa é concedida por uma denúncia |
| report_swag_awarded | Acionado quando um brinde é concedido por uma denúncia |
| report_became_public | Acionada quando uma denúncia se torna pública |
| program_hacker_joined | Acionado quando um hacker entra no programa |
| program_hacker_left | Acionado quando um hacker sai do programa |
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 yyyy-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, caso contrário, "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.