Raccogliere i log di HackerOne
Questo documento spiega come configurare HackerOne per inviare log a Google Security Operations utilizzando i webhook.
HackerOne è una piattaforma di coordinamento delle vulnerabilità e di bug bounty che mette in contatto le organizzazioni con i ricercatori della sicurezza per identificare e correggere le vulnerabilità di sicurezza. La piattaforma offre programmi di bug bounty, programmi di divulgazione delle vulnerabilità, pentesting e test di sicurezza continui durante il ciclo di vita dello sviluppo software.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
Un'istanza Google SecOps
Programma HackerOne con livello Professional o Enterprise (i webhook sono disponibili solo per questi livelli)
Accesso amministrativo alle impostazioni del programma HackerOne
Accesso a Google Cloud Console (per la creazione della chiave API)
Crea un feed webhook in Google SecOps
Creare il feed
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Nella pagina successiva, fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
HackerOne Webhook). - Seleziona Webhook come Tipo di origine.
- Seleziona HackerOne come Tipo di log.
- Fai clic su Avanti.
- Specifica i valori per i seguenti parametri di input:
- Delimitatore di divisione: lascia vuoto. Ogni richiesta webhook contiene un singolo evento JSON.
- Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset
- Etichette di importazione: l'etichetta da applicare agli eventi di questo feed
- Fai clic su Avanti.
- Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
Genera e salva la chiave segreta
Dopo aver creato il feed, devi generare una chiave segreta per l'autenticazione:
- Nella pagina dei dettagli del feed, fai clic su Genera chiave segreta.
- Una finestra di dialogo mostra la chiave segreta.
- Copia e salva la chiave segreta in modo sicuro.
Importante: la chiave segreta viene visualizzata una sola volta e non può essere recuperata in un secondo momento. Se la perdi, devi generare una nuova chiave segreta.
Recuperare l'URL dell'endpoint del feed
- Vai alla scheda Dettagli del feed.
- Nella sezione Endpoint Information (Informazioni sull'endpoint), copia l'URL dell'endpoint del feed.
Il formato dell'URL è:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateo per gli endpoint regionali:
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateSalva questo URL per i passaggi successivi.
Fai clic su Fine.
Creare una chiave API Google Cloud
Chronicle richiede una chiave API per l'autenticazione. Crea una chiave API con limitazioni nella Google Cloud Console.
Crea la chiave API
- Vai alla pagina Credenziali della console Google Cloud.
- Seleziona il tuo progetto (quello associato alla tua istanza di Google SecOps).
- Fai clic su Crea credenziali > Chiave API.
- Viene creata una chiave API e visualizzata in una finestra di dialogo.
- Fai clic su Modifica chiave API per limitare la chiave.
Limitare la chiave API
- Nella pagina delle impostazioni Chiave API:
- Nome: inserisci un nome descrittivo (ad esempio,
Chronicle HackerOne Webhook API Key).
- Nome: inserisci un nome descrittivo (ad esempio,
- In Limitazioni API:
- Seleziona Limita chiave.
- Nel menu a discesa Seleziona API, cerca e seleziona API Google SecOps (o API Chronicle).
- Fai clic su Salva.
- Copia il valore della chiave API dal campo Chiave API nella parte superiore della pagina.
Salva la chiave API in modo sicuro.
Configura il webhook di HackerOne
Costruisci l'URL webhook
Combina l'URL dell'endpoint, la chiave API e la chiave segreta di Google SecOps in un unico URL. Sia la chiave API sia la chiave segreta devono essere aggiunte come parametri di ricerca.
Formato dell'URL:
```none
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>
```
Esempio:
```none
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
```
Sostituisci quanto segue:
- <ENDPOINT_URL>: l'URL dell'endpoint del feed dalla sezione Recuperare l'URL dell'endpoint del feed.
- <API_KEY>: la chiave API Google Cloud della sezione Crea chiave API Google Cloud.
- <SECRET_KEY>: la chiave segreta della sezione Genera e salva la chiave segreta.
Importante: non inserire la chiave segreta di Google SecOps nel campo Secret di HackerOne. Il campo Secret di HackerOne viene utilizzato per la convalida della firma del payload HMAC (intestazione X-H1-Signature), che è un meccanismo separato dall'autenticazione webhook di Google SecOps. Se inserisci il segreto di Google SecOps nel campo Segreto di HackerOne, si verifica un errore 403 Forbidden perché HackerOne non trasmette questo valore come credenziale di autenticazione di Google SecOps. Aggiungi invece key e secret come parametri di ricerca nell'URL payload.
Crea un webhook in HackerOne
- Accedi a HackerOne e vai al tuo programma.
- Vai a Coinvolgimento, fai clic sul menu con tre puntini per il programma che vuoi configurare, poi fai clic su Impostazioni.
- Vai ad Automazione > Webhook.
- Fai clic su Nuovo webhook.
- Fornisci i seguenti dettagli di configurazione:
- URL payload: incolla l'URL completo con la chiave API e il segreto riportati sopra (ad esempio,
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...). - Secret (Segreto): lascia questo campo vuoto.
- URL payload: incolla l'URL completo con la chiave API e il segreto riportati sopra (ad esempio,
- Seleziona gli eventi che vuoi attivare il webhook. Scegli una delle seguenti opzioni:
- Inviami tutto: tutti gli eventi attiveranno il webhook.
- Consenti di specificare singoli eventi: seleziona gli eventi specifici che vuoi inviare a Google SecOps.
Fai clic su Aggiungi webhook.
Testare il webhook
- Nella pagina di configurazione del webhook, fai clic su Richiesta di test per inviare una richiesta di esempio all'URL payload configurato.
- Verifica che la risposta sia HTTP 200.
- Fai clic sul webhook per visualizzare i dettagli.
- Nella sezione Consegne recenti, verifica che le consegne recenti mostrino lo stato riuscito (HTTP 200).
- Fai clic su una consegna per visualizzare la richiesta del payload POST.
Se ricevi un errore:
- HTTP 403: verifica che la chiave API e la chiave segreta siano aggiunte correttamente come parametri di ricerca nell'URL payload. Verifica che il campo Secret di HackerOne sia vuoto.
- HTTP 401: verifica che la chiave API sia valida e limitata all'API Google SecOps.
- HTTP 404: verifica che l'URL dell'endpoint sia corretto e includa il percorso completo (/v2/unstructuredlogentries:batchCreate).
Verifica l'importazione in Google SecOps
- Vai a Impostazioni SIEM > Feed in Google SecOps.
- Individua il feed webhook di HackerOne.
- Controlla la colonna Stato (deve essere Attivo).
- Controlla il conteggio Eventi ricevuti (deve aumentare).
- Controlla il timestamp di Ultima operazione riuscita il giorno (deve essere recente).
Limiti e best practice per i webhook
Limiti per le richieste
| Limit | Value |
|-------|-------|
| **Max request size** | 4 MB |
| **Max QPS (queries per second)** | 15,000 |
| **Request timeout** | 30 seconds |
| **Retry behavior** | Automatic with exponential backoff |
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
| 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 | Unite come etichette chiave-valore |
| timestamp | metadata.event_timestamp | Analizzato utilizzando il filtro per data con il formato aaaa-MM-gg'T'HH:mm:ss.SSSZ |
| metadata.event_type | Imposta "STATUS_UPDATE" se has_principal è true, "USER_UNCATEGORIZED" se has_principal_user_user è true, altrimenti "GENERIC_EVENT" | |
| id | metadata.product_log_id | Valore copiato direttamente |
| relationships.structured_scope.data.attributes.asset_identifier | principal.asset.asset_id | Con il prefisso "ASSET:" |
| attributes.email_alias | principal.user.email_addresses | Unita |
| relationships.reporter.data.id | principal.user.employee_id | Valore copiato direttamente |
| relationships.reporter.data.attributes.name | principal.user.first_name | Valore copiato direttamente |
| attributes.username, relationships.reporter.data.attributes.username | principal.user.user_display_name | Valore ottenuto da relationships.reporter.data.attributes.username se non è vuoto, altrimenti da attributes.username |
| relationships.severity.data.attributes.user_id | principal.user.userid | Valore copiato direttamente |
| relationships.severity.data.id | security_result.rule_id | Valore copiato direttamente |
| relationships.severity.data.attributes.max_severity | security_result.severity | Convertito in maiuscolo |
| attributes.vulnerability_information | security_result.summary | Valore copiato direttamente |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.