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 de segurança contínuos em 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 do HackerOne com nível profissional ou empresarial (os webhooks só estão disponíveis para esses níveis)
Acesso administrativo às configurações do programa do HackerOne
Acesso ao console do Google Cloud (para criação de chaves de API)
Criar 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 desse feed
- Clique em Próxima.
- Revise a nova configuração de feed de notícias na tela Finalizar e clique em Enviar.
Gerar e salvar a chave secreta
Depois de criar o feed, você precisa gerar 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 é mostrada apenas uma vez e não pode ser recuperada mais tarde. Se você perder a chave, será necessário gerar outra.
Acessar 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://{region}-chronicle.googleapis.com/v1/{parent}/logs:importEm que
{region}é a região da sua instância do Google SecOps (por exemplo,us,europeouasia-southeast1) e{parent}é o caminho do recurso no formatoprojects/<PROJECT_ID>/locations/<LOCATION>/instances/<INSTANCE_ID>/logTypes/<LOG_TYPE>.Salve 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://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...&secret=abcd1234...
```
Substitua o seguinte:
- <ENDPOINT_URL>: o URL do endpoint do feed da seção Acessar 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 a 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, anexe key e secret como parâmetros de consulta no URL do payload.
Criar webhook no HackerOne
- Faça login no HackerOne e acesse seu programa.
- Acesse Engagements, clique no menu de três pontos do programa que você quer configurar e clique em Settings.
- Acesse Automation > Webhooks.
- Clique em New webhook.
- Informe os seguintes detalhes de configuração:
- URL do payload: cole o URL completo com a chave de API e o secret acima. Por exemplo,
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...&secret=abcd1234.... - Segredo: deixe esse campo em branco.
- URL do payload: cole o URL completo com a chave de API e o secret acima. Por exemplo,
- Selecione os eventos que você quer acionar o webhook. Escolha uma das seguintes opções:
- Send me everything: todos os eventos vão acionar o webhook.
- Let me specify individual events: 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 Test request para enviar uma solicitação de exemplo ao URL do payload configurado.
- Verifique se a resposta é HTTP 200.
- Clique no webhook para conferir os detalhes.
- Na seção Recent deliveries, verifique se as entregas recentes mostram o status de sucesso (HTTP 200).
- Clique em qualquer entrega para conferir a solicitação de payload POST.
Se você receber um erro:
- HTTP 403: verifique se a chave de API e a chave secreta estão 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 do Google SecOps.
- HTTP 404: verifique se o URL do endpoint está correto e inclui o caminho completo (/v1/{parent}/logs:import).
Verificar a ingestão no Google SecOps
- Acesse Configurações do SIEM > Feeds no Google SecOps.
- Localize o feed de webhook do HackerOne.
- Verifique a coluna Status (deve ser Ativo).
- Verifique a contagem de Eventos recebidos (deve estar aumentando).
- Verifique o carimbo de data/hora de Última atualização bem-sucedida (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 de UDM
| Campo de registro | Mapeamento 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 | Mesclado 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 | Com o 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 em maiúsculas |
| attributes.vulnerability_information | security_result.summary | Valor copiado diretamente |
Registro de alterações
Consulte o registro de alterações deste analisador
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.