Raccogliere i log di HackerOne
Questo documento spiega come configurare HackerOne per inviare i 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 di sicurezza per identificare e correggere le vulnerabilità di sicurezza. La piattaforma fornisce programmi di bug bounty, programmi di divulgazione delle vulnerabilità, pentest 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 alla Google Cloud Console (per la creazione della chiave API)
Creare 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:
- Separatore 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.
- Esamina la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
Generare e salvare 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.
- Viene visualizzata una finestra di dialogo con 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 Informazioni sull'endpoint, copia l'URL dell'endpoint del feed.
Il formato dell'URL è:
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:importDove
{region}è la regione dell'istanza Google SecOps (ad esempious,europeoasia-southeast1) e{parent}è il percorso della risorsa nel formatoprojects/<PROJECT_ID>/locations/<LOCATION>/instances/<INSTANCE_ID>/logTypes/<LOG_TYPE>.Salva 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.
Creare la chiave API
- Vai alla pagina Credenziali della console Google Cloud.
- Seleziona il progetto (il progetto associato all'istanza 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 della chiave API :
- Nome: inserisci un nome descrittivo (ad esempio,
Chronicle HackerOne Webhook API Key).
- Nome: inserisci un nome descrittivo (ad esempio,
- In Restrizioni 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.
Configurare il webhook di HackerOne
Costruire l'URL del webhook
Combina l'URL dell'endpoint Google SecOps, la chiave API e la chiave segreta in un unico URL. Sia la chiave API sia la chiave segreta devono essere aggiunte come parametri di ricerca.
Formato URL:
```none
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>
```
Esempio:
```none
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?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 dalla sezione Creare una chiave API Google Cloud.
- <SECRET_KEY>: la chiave segreta dalla sezione Generare e salvare 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 secret di Google SecOps nel campo Secret di HackerOne, riceverai un errore 403 Forbidden perché HackerOne non passa questo valore come credenziale di autenticazione di Google SecOps. Invece, aggiungi sia key sia secret come parametri di ricerca nell'URL del payload.
Creare un webhook in HackerOne
- Accedi a HackerOne e vai al tuo programma.
- Vai a Engagements (Coinvolgimenti), fai clic sul menu kebab del programma che vuoi configurare, poi fai clic su Settings (Impostazioni).
- Vai a Automation > Webhooks (Automazione > Webhook).
- Fai clic su New webhook (Nuovo webhook).
- Fornisci i seguenti dettagli di configurazione:
- Payload URL (URL del payload): incolla l'URL completo con la chiave API e il secret di sopra. Ad esempio,
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...&secret=abcd1234.... - Secret (Secret): lascia questo campo vuoto.
- Payload URL (URL del payload): incolla l'URL completo con la chiave API e il secret di sopra. Ad esempio,
- Seleziona gli eventi che vuoi attivare il webhook. Scegli una delle seguenti opzioni:
- Send me everything (Inviami tutto): tutti gli eventi attiveranno il webhook.
- Let me specify individual events (Consenti di specificare singoli eventi): seleziona gli eventi specifici che vuoi inviare a Google SecOps.
Fai clic su Add webhook (Aggiungi webhook).
Testare il webhook
- Nella pagina di configurazione del webhook, fai clic su Test request (Richiesta di test) per inviare una richiesta di esempio all'URL del payload configurato.
- Verifica che la risposta sia HTTP 200.
- Fai clic sul webhook per visualizzare i dettagli.
- Nella sezione Recent deliveries (Consegne recenti), verifica che le consegne recenti mostrino lo stato di riuscita (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 del 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 (/v1/{parent}/logs:import).
Verificare 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 numero di Eventi ricevuti (deve essere in aumento).
- Controlla il timestamp Ultimo successo (deve essere recente).
Limiti e best practice dei 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 | Logica |
|---|---|---|
| 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 coppie chiave-valore |
| timestamp | metadata.event_timestamp | Analizzato utilizzando il filtro della data con il formato yyyy-MM-dd'T'HH:mm:ss.SSSZ |
| metadata.event_type | Impostato su "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 | Unito |
| 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 da relationships.reporter.data.attributes.username se non è vuoto, altrimenti 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 |
Log delle modifiche
Visualizza il log delle modifiche per questo parser
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.