HackerOne-Logs erfassen

Unterstützt in:

In diesem Dokument wird beschrieben, wie Sie HackerOne so konfigurieren, dass Logs mithilfe von Webhooks an Google Security Operations gesendet werden.

HackerOne ist eine Plattform zur Koordinierung von Schwachstellen und zur Vergabe von Bug Bounties, die Unternehmen mit Sicherheitsforschern zusammenbringt, um Sicherheitsschwachstellen zu identifizieren und zu beheben. Die Plattform bietet Bug-Bounty-Programme, Programme zur Offenlegung von Schwachstellen, Penetrationstests und kontinuierliche Sicherheitstests während des gesamten Softwareentwicklungszyklus.

Hinweis

  • Prüfen Sie, ob folgende Voraussetzungen erfüllt sind:

  • Eine Google SecOps-Instanz

  • HackerOne-Programm mit der Stufe „Professional“ oder „Enterprise“ (Webhooks sind nur für diese Stufen verfügbar)

  • Administratorzugriff auf die HackerOne-Programmeinstellungen

  • Zugriff auf die Google Cloud Console (zum Erstellen von API-Schlüsseln)

Webhook-Feed in Google SecOps erstellen

Feed erstellen

  1. Rufen Sie die SIEM-Einstellungen > Feeds auf.
  2. Klicken Sie auf Neuen Feed hinzufügen.
  3. Klicken Sie auf der nächsten Seite auf Einzelnen Feed konfigurieren.
  4. Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B. HackerOne Webhook.
  5. Wählen Sie Webhook als Quelltyp aus.
  6. Wählen Sie HackerOne als Logtyp aus.
  7. Klicken Sie auf Weiter.
  8. Geben Sie Werte für die folgenden Eingabeparameter an:
    • Trennzeichen für Aufteilung: Lassen Sie das Feld leer. Jede Webhook-Anfrage enthält ein einzelnes JSON-Ereignis.
    • Asset-Namespace: Der Asset-Namespace
    • Aufnahme-Labels: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll
  9. Klicken Sie auf Weiter.
  10. Prüfen Sie die Konfiguration des neuen Feeds auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.

Geheimen Schlüssel generieren und speichern

Nachdem Sie den Feed erstellt haben, müssen Sie einen geheimen Schlüssel für die Authentifizierung generieren:

  1. Klicken Sie auf der Seite mit den Feeddetails auf Geheimen Schlüssel generieren.
  2. In einem Dialogfeld wird der geheime Schlüssel angezeigt.
  3. Kopieren und speichern Sie den geheimen Schlüssel sicher.

Wichtig: Der geheime Schlüssel wird nur einmal angezeigt und kann später nicht mehr abgerufen werden. Wenn Sie ihn verlieren, müssen Sie einen neuen geheimen Schlüssel generieren.

Feed-Endpunkt-URL abrufen

  1. Rufen Sie den Tab Details des Feeds auf.
  2. Kopieren Sie im Abschnitt Endpunktinformationen die Feed-Endpunkt-URL.
  3. Das URL-Format lautet:

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

    oder für regionale Endpunkte:

    https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate
    
  4. Speichern Sie diese URL für die nächsten Schritte.

  5. Klicken Sie auf Fertig.

Google Cloud-API-Schlüssel erstellen

Für die Authentifizierung in Chronicle ist ein API-Schlüssel erforderlich. Erstellen Sie in der Google Cloud Console einen eingeschränkten API-Schlüssel.

API-Schlüssel erstellen

  1. Rufen Sie in der Google Cloud Console die Seite Anmeldedaten auf.
  2. Wählen Sie Ihr Projekt aus (das Projekt, das mit Ihrer Google SecOps-Instanz verknüpft ist).
  3. Klicken Sie auf Anmeldedaten erstellen > API-Schlüssel.
  4. Ein API-Schlüssel wird erstellt und in einem Dialogfeld angezeigt.
  5. Klicken Sie auf API-Schlüssel bearbeiten , um den Schlüssel einzuschränken.

API-Schlüssel einschränken

  1. Gehen Sie auf der Seite mit den Einstellungen für den API-Schlüssel so vor:
    • Name: Geben Sie einen aussagekräftigen Namen ein, z. B. Chronicle HackerOne Webhook API Key.
  2. Gehen Sie unter API-Einschränkungen so vor:
    1. Wählen Sie Schlüssel einschränken aus.
    2. Suchen Sie im Drop-down-Menü APIs auswählen nach Google SecOps API (oder Chronicle API) und wählen Sie diese aus.
  3. Klicken Sie auf Speichern.
  4. Kopieren Sie den API-Schlüsselwert aus dem Feld API-Schlüssel oben auf der Seite.
  5. Speichern Sie den API-Schlüssel sicher.

HackerOne-Webhook konfigurieren

Webhook-URL erstellen

Kombinieren Sie die Google SecOps-Endpunkt-URL, den API-Schlüssel und den geheimen Schlüssel zu einer einzigen URL. Sowohl der API-Schlüssel als auch der geheime Schlüssel müssen als Abfrageparameter angehängt werden.

URL-Format :

```none
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>
```

Beispiel :

```none
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
```

Ersetzen Sie Folgendes: - <ENDPOINT_URL>: Die Feed-Endpunkt-URL aus dem Abschnitt Feed-Endpunkt-URL abrufen. - <API_KEY>: Der Google Cloud-API-Schlüssel aus dem Abschnitt Google Cloud-API-Schlüssel erstellen. - <SECRET_KEY>: Der geheime Schlüssel aus dem Abschnitt Geheimen Schlüssel generieren und speichern.

Wichtig: Geben Sie den geheimen Schlüssel von Google SecOps nicht im Feld Secret von HackerOne ein. Das Feld Secret von HackerOne wird für die HMAC-Signaturvalidierung der Nutzlast (X-H1-Signature-Header) verwendet. Dies ist ein separater Mechanismus von der Webhook-Authentifizierung von Google SecOps. Wenn Sie das Google SecOps-Secret im Feld Secret von HackerOne eingeben, wird der Fehler 403 Forbidden zurückgegeben, da HackerOne diesen Wert nicht als Google SecOps-Authentifizierungsanmeldedaten übergibt. Hängen Sie stattdessen sowohl key als auch secret als Abfrageparameter an die Nutzlast-URL an.

Webhook in HackerOne erstellen

  1. Melden Sie sich in HackerOne an und rufen Sie Ihr Programm auf.
  2. Rufen Sie Engagements auf, klicken Sie auf das Dreipunkt-Menü für das Programm, das Sie konfigurieren möchten, und dann auf Einstellungen.
  3. Rufen Sie Automatisierung > Webhooks auf.
  4. Klicken Sie auf Neuer Webhook.
  5. Geben Sie die folgenden Konfigurationsdetails an:
    • Nutzlast-URL: Fügen Sie die vollständige URL mit API-Schlüssel und Secret von oben ein, z. B. https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234....
    • Secret: Lassen Sie dieses Feld leer.
  6. Wählen Sie aus, welche Ereignisse den Webhook auslösen sollen. Wählen Sie eine der folgenden Optionen aus:
    • Send me everything (Alles senden): Alle Ereignisse lösen den Webhook aus.
    • Let me specify individual events (Einzelne Ereignisse angeben): Wählen Sie die Ereignisse aus, die an Google SecOps gesendet werden sollen.
  7. Klicken Sie auf Webhook hinzufügen.

Webhook testen

  1. Klicken Sie auf der Seite mit der Webhook-Konfiguration auf Anfrage testen, um eine Beispielanfrage an die konfigurierte Nutzlast-URL zu senden.
  2. Prüfen Sie, ob die Antwort HTTP 200 lautet.
  3. Klicken Sie auf den Webhook, um Details aufzurufen.
  4. Prüfen Sie im Abschnitt Letzte Zustellungen, ob die letzten Zustellungen den Status „Erfolgreich“ (HTTP 200) haben.
  5. Klicken Sie auf eine Zustellung, um die POST-Nutzlastanfrage aufzurufen.

Wenn Sie einen Fehler erhalten: - HTTP 403: Prüfen Sie, ob der API-Schlüssel und der geheime Schlüssel korrekt als Abfrageparameter an die Nutzlast-URL angehängt wurden. Prüfen Sie, ob das Feld Secret von HackerOne leer ist. - HTTP 401: Prüfen Sie, ob der API-Schlüssel gültig ist und auf die Google SecOps API beschränkt ist. - HTTP 404: Prüfen Sie, ob die Endpunkt-URL korrekt ist und den vollständigen Pfad enthält (/v2/unstructuredlogentries:batchCreate).

Aufnahme in Google SecOps prüfen

  1. Rufen Sie in Google SecOps die SIEM-Einstellungen > Feeds auf.
  2. Suchen Sie nach Ihrem HackerOne-Webhook-Feed.
  3. Prüfen Sie die Spalte Status (muss Aktiv sein).
  4. Prüfen Sie die Anzahl der Empfangenen Ereignisse (muss steigen).
  5. Prüfen Sie den Zeitstempel unter Letzter Erfolg am (muss aktuell sein).

Webhook-Limits und Best Practices

Anfragelimits

| Limit | Value |
|-------|-------|
| **Max request size** | 4 MB |
| **Max QPS (queries per second)** | 15,000 |
| **Request timeout** | 30 seconds |
| **Retry behavior** | Automatic with exponential backoff |

UDM-Zuordnungstabelle

Logfeld UDM-Zuordnung Logik
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 Als Schlüssel/Wert-Labels zusammengeführt
timestamp metadata.event_timestamp Mit Datumsfilter im Format „JJJJ-MM-TT'T'HH:mm:ss.SSSZ“ geparst
metadata.event_type Auf „STATUS_UPDATE“ gesetzt, wenn has_principal „true“ ist, auf „USER_UNCATEGORIZED“, wenn has_principal_user_user „true“ ist, andernfalls auf „GENERIC_EVENT“
id metadata.product_log_id Wert direkt kopiert
relationships.structured_scope.data.attributes.asset_identifier principal.asset.asset_id Mit „ASSET:“ vorangestellt
attributes.email_alias principal.user.email_addresses Zusammengeführt
relationships.reporter.data.id principal.user.employee_id Wert direkt kopiert
relationships.reporter.data.attributes.name principal.user.first_name Wert direkt kopiert
attributes.username, relationships.reporter.data.attributes.username principal.user.user_display_name Wert aus „relationships.reporter.data.attributes.username“, wenn nicht leer, andernfalls „attributes.username“
relationships.severity.data.attributes.user_id principal.user.userid Wert direkt kopiert
relationships.severity.data.id security_result.rule_id Wert direkt kopiert
relationships.severity.data.attributes.max_severity security_result.severity In Großbuchstaben umgewandelt
attributes.vulnerability_information security_result.summary Wert direkt kopiert

Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten