Raccogliere i log di HackerOne

Supportato in:

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

  1. Vai a Impostazioni SIEM > Feed.
  2. Fai clic su Aggiungi nuovo feed.
  3. Nella pagina successiva, fai clic su Configura un singolo feed.
  4. Nel campo Nome feed, inserisci un nome per il feed (ad esempio, HackerOne Vulnerability Reports).
  5. Seleziona Webhook come Tipo di origine.
  6. Seleziona HackerOne come Tipo di log.
  7. Fai clic su Avanti.
  8. 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.
  9. Fai clic su Avanti.
  10. 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:

  1. Nella pagina dei dettagli del feed, fai clic su Genera chiave segreta.
  2. Una finestra di dialogo mostra la chiave segreta.
  3. Copia e salva la chiave segreta in modo sicuro.

Recuperare l'URL dell'endpoint del feed

  1. Vai alla scheda Dettagli del feed.
  2. Nella sezione Endpoint Information (Informazioni sull'endpoint), copia l'URL dell'endpoint del feed.
  3. Il formato dell'URL è:

    https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    

    o

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  4. Salva questo URL per i passaggi successivi.

  5. 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

  1. Vai alla pagina Credenziali della console Google Cloud.
  2. Seleziona il tuo progetto (quello associato alla tua istanza di Chronicle).
  3. Fai clic su Crea credenziali > Chiave API.
  4. Viene creata una chiave API e visualizzata in una finestra di dialogo.
  5. Fai clic su Modifica chiave API per limitare la chiave.

Limitare la chiave API

  1. Nella pagina delle impostazioni Chiave API:
    • Nome: inserisci un nome descrittivo (ad esempio, Chronicle HackerOne Webhook API Key).
  2. In Limitazioni API:
    1. Seleziona Limita chiave.
    2. Nell'elenco Seleziona API, cerca e seleziona API Google SecOps (o API Chronicle).
  3. Fai clic su Salva.
  4. Copia il valore della chiave API dal campo Chiave API nella parte superiore della pagina.
  5. 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

  1. Accedi a HackerOne e vai al tuo programma.
  2. Vai a Coinvolgimento, fai clic sul menu con tre puntini per il programma che vuoi configurare, poi fai clic su Impostazioni.
  3. Vai ad Automazione > Webhook.
  4. Fai clic su Nuovo webhook.
  5. 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
  6. Fai clic su Aggiungi webhook.

Testare il webhook

  1. Nella pagina di configurazione del webhook, seleziona Richiesta di test per inviare una richiesta di esempio all'URL payload configurato.
  2. Verifica che la risposta sia HTTP 200.
  3. 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

  1. Accedi alla console HackerOne.
  2. Vai a Coinvolgimento, fai clic sul menu con tre puntini del tuo programma e poi su Impostazioni.
  3. Vai ad Automazione > Webhook.
  4. Fai clic sul webhook per visualizzare i dettagli.
  5. Nella sezione Consegne recenti, verifica che le consegne recenti mostrino lo stato riuscito (HTTP 200).
  6. Fai clic su una consegna per visualizzare la richiesta del payload POST.

Controllare lo stato del feed di Chronicle

  1. Vai a Impostazioni SIEM > Feed in Chronicle.
  2. Individua il feed webhook di HackerOne.
  3. Controlla la colonna Stato (deve essere Attivo).
  4. Controlla il conteggio Eventi ricevuti (deve aumentare).
  5. Controlla il timestamp di Ultima operazione riuscita il giorno (deve essere recente).

Verifica i log in Chronicle

  1. Vai a Ricerca > Ricerca UDM.
  2. Utilizza la query seguente:

    metadata.vendor_name = "HACKERONE" AND metadata.product_name = "HACKERONE"
    
  3. Modifica l'intervallo di tempo sull'ultima ora.

  4. 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.

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
  • 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.