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 premi per i bug 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 disporre dei 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
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 Vulnerability Reports). - 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 (facoltativo): 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.
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
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateSalva questo URL per i passaggi successivi.
Fai clic su Fine.
Crea 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 Chronicle).
- 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.
- Nell'elenco 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 Chronicle e la chiave API:
<ENDPOINT_URL>?key=<API_KEY>Esempio:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
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 dell'endpoint completo con la chiave API riportata sopra.
- Secret: incolla la chiave segreta dalla creazione del feed Chronicle.
- 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 eventi specifici che vuoi inviare a Chronicle. Eventi consigliati per il monitoraggio della sicurezza:
- report_created: quando un hacker invia una nuova segnalazione di vulnerabilità
- report_triaged: quando un report viene sottoposto a triage
- report_resolved: quando un report viene risolto
- report_bounty_awarded: quando viene assegnata una ricompensa
- report_swag_awarded: quando viene assegnato lo swag
- program_hacker_joined: quando un hacker partecipa al programma
- program_hacker_left: quando un hacker abbandona il programma
- Fai clic su Aggiungi webhook.
Testare il webhook
- Nella pagina di configurazione del webhook, seleziona Richiesta di test per inviare una richiesta di esempio all'URL payload configurato.
- Verifica che la risposta sia HTTP 200.
- Controlla il feed di Chronicle per l'evento di test entro 1-2 minuti.
Verificare il funzionamento del webhook
Controllare lo stato del webhook di HackerOne
- Accedi alla console HackerOne.
- Vai a Coinvolgimento, fai clic sul menu con tre puntini del tuo programma e poi su Impostazioni.
- Vai ad Automazione > Webhook.
- 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.
Controllare lo stato del feed di Chronicle
- Vai a Impostazioni SIEM > Feed in Chronicle.
- 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).
Verifica i log in Chronicle
- Vai a Ricerca > Ricerca UDM.
Utilizza la query seguente:
metadata.vendor_name = "HACKERONE" AND metadata.product_name = "HACKERONE"Modifica l'intervallo di tempo sull'ultima ora.
Verifica che gli eventi vengano visualizzati nei risultati.
Riferimento ai metodi di autenticazione
I feed webhook di Chronicle supportano più metodi di autenticazione. I webhook di HackerOne utilizzano una combinazione di parametri di ricerca e convalida della firma.
Metodo 1: parametri di query con convalida della firma (consigliato per HackerOne)
HackerOne invia i webhook all'URL del payload configurato. L'autenticazione viene gestita tramite:
- Chiave API nell'URL: la chiave API di Chronicle viene aggiunta come parametro di query all'URL del payload.
Convalida della firma segreta: HackerOne genera un'intestazione X-H1-Signature contenente un hexdigest HMAC SHA256 del corpo della richiesta firmato con il secret configurato.
Formato dell'URL:
<ENDPOINT_URL>?key=<API_KEY>Formato della richiesta:
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": {...} } }
Vantaggi:
- Autenticazione doppia: chiave API per l'accesso a Chronicle e firma per la convalida del payload
- HackerOne fornisce la generazione di firme integrata
- Verifica dell'integrità del payload sicuro
Convalida della firma
HackerOne include le seguenti intestazioni in ogni richiesta webhook:
- X-H1-Signature: HMAC SHA256 hexdigest del corpo della richiesta (formato:
sha256=<hexdigest>) - X-H1-Event: il tipo di evento che ha attivato il webhook
- X-H1-Delivery: identificatore univoco della consegna
- X-H1-Signature: HMAC SHA256 hexdigest del corpo della richiesta (formato:
Per convalidare la firma sull'endpoint di ricezione:
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)
Tipi di evento webhook
HackerOne supporta i seguenti tipi di eventi webhook:
| Tipo di evento | Descrizione |
|---|---|
| report_created | Si attiva quando un hacker invia una nuova segnalazione di vulnerabilità |
| report_triaged | Attivato quando una segnalazione viene sottoposta a triage |
| report_resolved | Si attiva quando una segnalazione viene risolta |
| report_bounty_awarded | Si attiva quando viene assegnata una ricompensa per una segnalazione |
| report_swag_awarded | Attivato quando viene assegnato un gadget per una segnalazione |
| report_became_public | Attivato quando un report diventa pubblico |
| program_hacker_joined | Si attiva quando un hacker partecipa al programma |
| program_hacker_left | Si attiva quando un hacker esce dal programma |
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 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 | 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.