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 Koordination von Sicherheitslücken und für Bug-Bounty-Programme, 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
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 Einen einzelnen Feed konfigurieren.
- Geben Sie im Feld Feedname einen Namen für den Feed ein, z. B.
HackerOne Vulnerability Reports. - 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 (optional): Lassen Sie das Feld leer. Jede Webhook-Anfrage enthält ein einzelnes JSON-Ereignis.
- Asset-Namespace: Der Asset-Namespace.
- Aufnahmelabels: Das Label, das auf die Ereignisse aus diesem Feed angewendet werden soll.
- Klicken Sie auf Weiter.
- 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:
- 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.
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
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 die Seite „Anmeldedaten“ in der Google Cloud Console auf.
- Wählen Sie Ihr Projekt aus (das Projekt, das mit Ihrer Chronicle-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
- Auf der Seite mit den API-Schlüssel-Einstellungen:
- 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 in der Liste APIs auswählen nach Google SecOps API (oder Chronicle API) und wählen Sie die API 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 Chronicle-Endpunkt-URL und den API-Schlüssel:
<ENDPOINT_URL>?key=<API_KEY>Beispiel:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
Webhook in HackerOne erstellen
- Melden Sie sich in HackerOne an und rufen Sie Ihr Programm auf.
- Rufen Sie Interaktionen auf, klicken Sie auf das Dreipunkt-Menü für das Programm, das Sie konfigurieren möchten, und dann auf Einstellungen.
- Klicken Sie auf Automatisierung > Webhooks.
- Klicken Sie auf Neuer Webhook.
- Geben Sie die folgenden Konfigurationsdetails an:
- Nutzlast-URL: Fügen Sie die vollständige Endpunkt-URL mit API-Schlüssel von oben ein.
- Secret: Fügen Sie den geheimen Schlüssel aus der Chronicle-Feederstellung ein.
- Auswählen, welche Ereignisse den Webhook auslösen sollen: 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 bestimmte Ereignisse aus, die Sie an Chronicle senden möchten. Empfohlene Ereignisse für die Sicherheitsüberwachung:
- report_created: Wenn ein Hacker einen neuen Bericht zu einer Sicherheitslücke einreicht
- report_triaged: Wenn ein Bericht priorisiert wird
- report_resolved: Wenn eine Meldung geklärt wird
- report_bounty_awarded: Wenn eine Prämie vergeben wird
- report_swag_awarded: Zeitpunkt, zu dem Swag vergeben wird
- program_hacker_joined: Wenn ein Hacker dem Programm beitritt
- program_hacker_left: Wenn ein Hacker das Programm verlässt
- Klicken Sie auf Add webhook (Webhook hinzufügen).
Webhook testen
- Wählen Sie auf der Seite zur Webhook-Konfiguration Testanfrage aus, um eine Beispielanfrage an die konfigurierte Nutzlast-URL zu senden.
- Prüfen Sie, ob die Antwort HTTP 200 ist.
- Prüfen Sie innerhalb von 1 bis 2 Minuten, ob das Testereignis im Chronicle-Feed angezeigt wird.
Funktion des Webhooks prüfen
HackerOne-Webhook-Status prüfen
- Melden Sie sich in der HackerOne-Konsole an.
- Rufen Sie Interaktionen auf, klicken Sie auf das Dreipunkt-Menü für Ihr Programm und dann auf Einstellungen.
- Klicken Sie auf Automatisierung > Webhooks.
- Klicken Sie auf Ihren Webhook, um Details aufzurufen.
- Prüfen Sie im Bereich Aktuelle Zustellungen, ob die aktuellen Zustellungen den Status „Erfolgreich“ (HTTP 200) haben.
- Klicken Sie auf eine beliebige Zustellung, um die POST-Payload-Anfrage aufzurufen.
Chronicle-Feedstatus prüfen
- Rufen Sie in Chronicle die SIEM-Einstellungen > Feeds auf.
- Suchen Sie Ihren HackerOne-Webhook-Feed.
- Prüfen Sie die Spalte Status. Der Status sollte Aktiv sein.
- Prüfen Sie die Anzahl der Empfangenen Ereignisse. Sie sollte sich erhöhen.
- Prüfen Sie den Zeitstempel unter Zuletzt erfolgreich am (sollte aktuell sein).
Logs in Chronicle prüfen
- Klicken Sie auf Suche > UDM-Suche.
Verwenden Sie die folgende Abfrage:
metadata.vendor_name = "HACKERONE" AND metadata.product_name = "HACKERONE"Stellen Sie den Zeitraum auf die letzte Stunde ein.
Prüfen Sie, ob Ereignisse in den Ergebnissen angezeigt werden.
Referenz zu Authentifizierungsmethoden
Chronicle-Webhook-Feeds unterstützen mehrere Authentifizierungsmethoden. HackerOne-Webhooks verwenden eine Kombination aus Abfrageparametern und Signaturvalidierung.
Methode 1: Abfrageparameter mit Signaturvalidierung (für HackerOne empfohlen)
HackerOne sendet Webhooks an die konfigurierte Nutzlast-URL. Die Authentifizierung erfolgt über:
- API-Schlüssel in URL: Der Chronicle API-Schlüssel wird als Abfrageparameter an die Nutzlast-URL angehängt.
Geheime Signaturvalidierung: HackerOne generiert einen X-H1-Signature-Header, der einen HMAC-SHA256-Hexdigest des mit dem konfigurierten Secret signierten Anfragetexts enthält.
URL-Format:
<ENDPOINT_URL>?key=<API_KEY>Anfrageformat:
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": {...} } }
Vorteile:
- Duale Authentifizierung: API-Schlüssel für den Chronicle-Zugriff und Signatur für die Nutzlastvalidierung
- HackerOne bietet eine integrierte Signaturgenerierung.
- Sichere Überprüfung der Nutzlastintegrität
Signaturvalidierung
HackerOne fügt jeder Webhook-Anfrage die folgenden Header hinzu:
- X-H1-Signature: HMAC SHA256-Hexdigest des Anfragetexts (Format:
sha256=<hexdigest>) - X-H1-Event: Der Ereignistyp, der den Webhook ausgelöst hat.
- X-H1-Delivery: Eindeutige Kennung für die Lieferung
- X-H1-Signature: HMAC SHA256-Hexdigest des Anfragetexts (Format:
So prüfen Sie die Signatur an Ihrem Empfangsendpunkt:
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)
Webhook-Ereignistypen
HackerOne unterstützt die folgenden Webhook-Ereignistypen:
| Ereignistyp | Beschreibung |
|---|---|
| report_created | Wird ausgelöst, wenn ein Hacker einen neuen Bericht zu einer Sicherheitslücke einreicht |
| report_triaged | Wird ausgelöst, wenn ein Bericht priorisiert wird |
| report_resolved | Wird ausgelöst, wenn eine Meldung geklärt wird |
| report_bounty_awarded | Wird ausgelöst, wenn für einen Bericht eine Prämie vergeben wird |
| report_swag_awarded | Wird ausgelöst, wenn für einen Bericht Swag vergeben wird |
| report_became_public | Wird ausgelöst, wenn ein Bericht öffentlich wird |
| program_hacker_joined | Wird ausgelöst, wenn ein Hacker dem Programm beitritt |
| program_hacker_left | Wird ausgelöst, wenn ein Hacker das Programm verlässt |
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