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 Koordination von Sicherheitslücken und für Bug-Bounties, die Organisationen mit Sicherheitsforschern verbindet, um Sicherheitslücken zu identifizieren und zu beheben. Die Plattform bietet Bug-Bounty-Programme, Programme zur Offenlegung von Sicherheitslücken, Penetrationstests und kontinuierliche Sicherheitstests während des gesamten Softwareentwicklungszyklus.

Hinweise

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

  • Eine Google SecOps-Instanz

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

  • Administratorzugriff auf die Einstellungen Ihres HackerOne-Programms

  • 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 Einen 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:
    • Split delimiter (Trennzeichen für Aufteilung): Lassen Sie das Feld leer. Jede Webhook-Anfrage enthält ein einzelnes JSON-Ereignis.
    • Asset-Namespace: Der Asset-Namespace
    • Labels für Datenaufnahme: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll
  9. Klicken Sie auf Weiter.
  10. Prüfen Sie die neue Feedkonfiguration auf dem Bildschirm Abschließen und klicken Sie dann auf Senden.

Secret-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 Secret Key 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 den Schlüssel 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 die Seite „Anmeldedaten“ in der Google Cloud Console 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. Auf der Seite mit den API-Schlüssel-Einstellungen:
    • 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 die Option 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 in 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 Google SecOps-Schlüssel nicht im Feld Secret von HackerOne ein. Das Feld Secret von HackerOne wird für die HMAC-Nutzlastsignaturvalidierung (X-H1-Signature-Header) verwendet. Dies ist ein separater Mechanismus von der Google SecOps-Webhook-Authentifizierung. Wenn Sie das Google SecOps-Secret in das Feld Secret von HackerOne einfügen, wird der Fehler 403 Forbidden ausgegeben, 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 Interaktionen auf, klicken Sie auf das Dreipunkt-Menü für das Programm, das Sie konfigurieren möchten, und dann auf Einstellungen.
  3. Klicken Sie auf Automatisierung > Webhooks.
  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, durch welche Ereignisse der Webhook ausgelöst werden soll. Wählen Sie eine der folgenden Optionen aus:
    • Send me everything (Sende mir alles): Alle Ereignisse lösen den Webhook aus.
    • Einzelne Ereignisse angeben: Wählen Sie die Ereignisse aus, die Sie an Google SecOps senden möchten.
  7. Klicken Sie auf Add webhook (Webhook hinzufügen).

Webhook testen

  1. Klicken Sie auf der Seite zur Webhook-Konfiguration auf Testanfrage, um eine Beispielanfrage an die konfigurierte Nutzlast-URL zu senden.
  2. Prüfen Sie, ob die Antwort HTTP 200 ist.
  3. Klicken Sie auf Ihren Webhook, um Details aufzurufen.
  4. Prüfen Sie im Bereich Aktuelle Zustellungen, ob die letzten Zustellungen den Status „Erfolgreich“ (HTTP 200) haben.
  5. Klicken Sie auf eine beliebige Zustellung, um die POST-Payload-Anfrage aufzurufen.

Wenn Sie einen Fehler erhalten: - HTTP 403: Prüfen Sie, ob der API-Schlüssel und der geheime Schlüssel korrekt als Suchparameter in der Nutzlast-URL angehängt wurden. Prüfen Sie, ob das Feld Secret in 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 (/v2/unstructuredlogentries:batchCreate) enthält.

Datenaufnahme in Google SecOps überprüfen

  1. Rufen Sie in Google SecOps die SIEM-Einstellungen > Feeds auf.
  2. Suchen Sie Ihren HackerOne-Webhook-Feed.
  3. Prüfen Sie die Spalte Status. Der Status sollte Aktiv lauten.
  4. Prüfen Sie die Anzahl der Empfangenen Ereignisse. Sie sollte sich erhöhen.
  5. Prüfen Sie den Zeitstempel Zuletzt erfolgreich am (sollte 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 Zusammengeführt als Schlüssel/Wert-Labels
timestamp metadata.event_timestamp Gepasst mit Datumsfilter im Format JJJJ-MM-TT'T'HH:mm:ss.SSSZ
metadata.event_type Auf „STATUS_UPDATE“ festgelegt, wenn „has_principal“ auf „true“ gesetzt ist, auf „USER_UNCATEGORIZED“, wenn „has_principal_user_user“ auf „true“ gesetzt ist, andernfalls auf „GENERIC_EVENT“
id metadata.product_log_id Wert direkt kopiert
relationships.structured_scope.data.attributes.asset_identifier principal.asset.asset_id Beginnt mit „ASSET:“
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“, falls 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