HackerOne-Logs erfassen
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
- Rufen Sie die SIEM-Einstellungen > Feeds auf.
- Klicken Sie auf Neuen Feed hinzufügen.
- Klicken Sie auf der nächsten Seite auf Einzelnen Feed konfigurieren.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B.
HackerOne Webhook. - Wählen Sie Webhook als Quelltyp aus.
- Wählen Sie HackerOne als Logtyp aus.
- Klicken Sie auf Weiter.
- 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
- Klicken Sie auf Weiter.
- 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:
- Klicken Sie auf der Seite mit den Feeddetails auf Geheimen Schlüssel generieren.
- In einem Dialogfeld wird der geheime Schlüssel angezeigt.
- 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
- Rufen Sie den Tab Details des Feeds auf.
- Kopieren Sie im Abschnitt Endpunktinformationen die Feed-Endpunkt-URL.
Das URL-Format lautet:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateoder für regionale Endpunkte:
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateSpeichern Sie diese URL für die nächsten Schritte.
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
- Rufen Sie in der Google Cloud Console die Seite Anmeldedaten auf.
- Wählen Sie Ihr Projekt aus (das Projekt, das mit Ihrer Google SecOps-Instanz verknüpft ist).
- Klicken Sie auf Anmeldedaten erstellen > API-Schlüssel.
- Ein API-Schlüssel wird erstellt und in einem Dialogfeld angezeigt.
- Klicken Sie auf API-Schlüssel bearbeiten , um den Schlüssel einzuschränken.
API-Schlüssel einschränken
- 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.
- Name: Geben Sie einen aussagekräftigen Namen ein, z. B.
- Gehen Sie unter API-Einschränkungen so vor:
- Wählen Sie Schlüssel einschränken aus.
- Suchen Sie im Drop-down-Menü APIs auswählen nach Google SecOps API (oder Chronicle API) und wählen Sie diese aus.
- Klicken Sie auf Speichern.
- Kopieren Sie den API-Schlüsselwert aus dem Feld API-Schlüssel oben auf der Seite.
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
- Melden Sie sich in HackerOne an und rufen Sie Ihr Programm auf.
- Rufen Sie Engagements auf, klicken Sie auf das Dreipunkt-Menü für das Programm, das Sie konfigurieren möchten, und dann auf Einstellungen.
- Rufen Sie Automatisierung > Webhooks auf.
- Klicken Sie auf Neuer Webhook.
- 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.
- Nutzlast-URL: Fügen Sie die vollständige URL mit API-Schlüssel und Secret von oben ein, z. B.
- 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.
Klicken Sie auf Webhook hinzufügen.
Webhook testen
- Klicken Sie auf der Seite mit der Webhook-Konfiguration auf Anfrage testen, um eine Beispielanfrage an die konfigurierte Nutzlast-URL zu senden.
- Prüfen Sie, ob die Antwort HTTP 200 lautet.
- Klicken Sie auf den Webhook, um Details aufzurufen.
- Prüfen Sie im Abschnitt Letzte Zustellungen, ob die letzten Zustellungen den Status „Erfolgreich“ (HTTP 200) haben.
- 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
- Rufen Sie in Google SecOps die SIEM-Einstellungen > Feeds auf.
- Suchen Sie nach Ihrem HackerOne-Webhook-Feed.
- Prüfen Sie die Spalte Status (muss Aktiv sein).
- Prüfen Sie die Anzahl der Empfangenen Ereignisse (muss steigen).
- 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