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 Sicherheitslücken und zur Vergabe von 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.
Hinweis
Folgende Voraussetzungen müssen erfüllt sein:
Eine Google SecOps-Instanz
Ein 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 Inhalt von Einträgen: 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.
Secret-Schlüssel generieren und speichern
Nachdem Sie den Feed erstellt haben, müssen Sie einen Secret-Schlüssel für die Authentifizierung generieren:
- Klicken Sie auf der Feed-Detailseite auf Secret-Schlüssel generieren.
- Ein Dialogfeld mit dem Secret-Schlüssel wird angezeigt.
- Kopieren und speichern Sie den Secret-Schlüssel an einem sicheren Ort.
Wichtig: Der Secret-Schlüssel wird nur einmal angezeigt und kann später nicht mehr abgerufen werden. Wenn Sie ihn verlieren, müssen Sie einen neuen Secret-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://{region}-chronicle.googleapis.com/v1/{parent}/logs:importDabei ist
{region}die Region Ihrer Google SecOps-Instanz (z. B.us,europeoderasia-southeast1) und{parent}der Ressourcenpfad im Formatprojects/<PROJECT_ID>/locations/<LOCATION>/instances/<INSTANCE_ID>/logTypes/<LOG_TYPE>.Speichern Sie diese URL für die nächsten Schritte.
Klicken Sie auf Fertig.
Google Cloud API-Schlüssel erstellen
Für Chronicle ist ein API-Schlüssel zur Authentifizierung 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 API-Schlüssel -Einstellungen 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 an einem sicheren Ort.
HackerOne-Webhook konfigurieren
Webhook-URL erstellen
Kombinieren Sie die Google SecOps-Endpunkt-URL, den API-Schlüssel und den Secret-Schlüssel zu einer einzigen URL. Sowohl der API-Schlüssel als auch der Secret-Schlüssel müssen als Abfrageparameter angehängt werden.
URL-Format :
```none
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>
```
Beispiel :
```none
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?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 Secret-Schlüssel aus dem Abschnitt Secret-Schlüssel generieren und speichern.
Wichtig: Geben Sie den Google SecOps-Secret-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 im Feld Secret von HackerOne eingeben, wird ein 403 Forbidden-Fehler ausgegeben, da HackerOne diesen Wert nicht als Google SecOps-Authentifizierungsdaten ü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.
- Klicken Sie auf Engagements , dann auf das Dreipunkt-Menü für das Programm, das Sie konfigurieren möchten, und dann auf Settings (Einstellungen).
- Rufen Sie Automation > Webhooks (Automatisierung > Webhooks) auf.
- Klicken Sie auf New webhook (Neuer Webhook).
- Geben Sie die folgenden Konfigurationsdetails an:
- Payload URL (Nutzlast-URL): Fügen Sie die vollständige URL mit API-Schlüssel und Secret aus dem vorherigen Schritt ein. Beispiel:
https://{region}-chronicle.googleapis.com/v1/{parent}/logs:import?key=AIzaSyD...&secret=abcd1234.... - Secret: Lassen Sie dieses Feld leer.
- Payload URL (Nutzlast-URL): Fügen Sie die vollständige URL mit API-Schlüssel und Secret aus dem vorherigen Schritt ein. Beispiel:
- 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 Add webhook (Webhook hinzufügen).
Webhook testen
- Klicken Sie auf der Seite mit der Webhook-Konfiguration auf Test request (Testanfrage), um eine Beispielanfrage an die konfigurierte Nutzlast-URL zu senden.
- Prüfen Sie, ob die Antwort HTTP 200 lautet.
- Klicken Sie auf Ihren Webhook, um die Details aufzurufen.
- Prüfen Sie im Abschnitt Recent deliveries (Letzte Zustellungen), ob die letzten Zustellungen den Status „Erfolgreich“ (HTTP 200) haben.
- Klicken Sie auf eine beliebige Zustellung, um die POST-Nutzlastanfrage aufzurufen.
Wenn Sie eine Fehlermeldung erhalten:
- HTTP 403: Prüfen Sie, ob der API-Schlüssel und der Secret-Schlüssel korrekt als Suchparameter 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 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 (/v1/{parent}/logs:import).
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 (sollte Aktiv sein).
- Prüfen Sie die Anzahl der Empfangenen Ereignisse (sollte steigen).
- Prüfen Sie den Zeitstempel unter Letzter Erfolg 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 | 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“, 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 |
Änderungsprotokoll
Änderungsprotokoll für diesen Parser ansehen
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten