Fingerprint-Logs erfassen
Parserversion:1.0
In diesem Dokument wird beschrieben, wie Sie Fingerprint (früher FingerprintJS) konfigurieren, um Logs über Webhooks an Google Security Operations zu senden.
Fingerprint ist eine Plattform für Geräteinformationen, die Funktionen zur Besucheridentifizierung und Betrugserkennung bietet. Es werden eindeutige Besucher-IDs generiert und intelligente Signale bereitgestellt, darunter die Erkennung von Bots, VPNs und Inkognitomodus sowie andere Informationen zur Geräteintelligenz. Wenn ein Besucher über den JavaScript-Agenten von FingerprintJS identifiziert wird, können Webhooks die Identifikationsereignisdaten in Echtzeit an Google Security Operations senden.
Hinweis
Prüfen Sie, ob die folgenden Voraussetzungen erfüllt sind:
- Eine Google SecOps-Instanz
- FingerprintJS-Konto mit Webhook-Unterstützung
- Zugriff auf die Google Cloud Console (zum Erstellen von API-Schlüsseln)
- FingerprintJS-JavaScript-Agent auf Ihrer Website oder in Ihrer Anwendung installiert
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.
FingerprintJS Identification Events. - Wählen Sie Webhook als Quelltyp aus.
- Wählen Sie FingerprintJS als Log type (Protokolltyp) 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 Identifikationsereignis.
- 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 Feed-Detailseite auf Secret Key generieren.
- In einem Dialogfeld wird der geheime Schlüssel angezeigt.
- Kopieren Sie den geheimen Schlüssel und speichern Sie ihn 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
- Rufen Sie den Tab Details des Feeds auf.
- Kopieren Sie im Abschnitt Endpoint Information (Endpunktinformationen) die Feed endpoint URL (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 FingerprintJS 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 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.
FingerprintJS-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 im FingerprintJS-Dashboard erstellen
- Melden Sie sich im FingerprintJS-Dashboard an.
- Klicken Sie auf Dashboard > Webhooks.
- Klicken Sie auf Add webhook (Webhook hinzufügen).
- Geben Sie die folgenden Konfigurationsdetails an:
- URL: Fügen Sie die vollständige Endpunkt-URL mit API-Schlüssel von oben ein.
- Umgebung (optional): Wenn Sie eine Umgebung auswählen, werden in Ihrem Webhook nur Ereignisse aus einer entsprechenden Umgebung gemeldet. Lassen Sie das Feld leer, um Ereignisse aus allen Umgebungen zu empfangen.
- Basisauthentifizierung (optional): Maximieren Sie Basisauthentifizierung, wenn Sie eine zusätzliche Authentifizierung hinzufügen möchten. Für die Chronicle-Integration können Sie dieses Feld leer lassen, da die Authentifizierung über den API-Schlüssel und den geheimen Schlüssel erfolgt.
- Klicken Sie auf Webhook erstellen.
- Es wird ein Erfolgsmodal mit der Meldung Webhooks created (Webhooks erstellt) angezeigt.
- Wichtig: Wenn Sie Webhook-Signaturen verwenden (nur Enterprise-Abo), kopieren und speichern Sie den im Erfolgsmodal angezeigten Verschlüsselungsschlüssel. Der Schlüssel wird nur einmal angezeigt.
Webhook einen Chronicle-Secret-Schlüssel hinzufügen
FingerprintJS unterstützt keine benutzerdefinierten HTTP-Header beim Erstellen von Webhooks. Sie müssen den geheimen Schlüssel von Chronicle als Suchparameter in die Webhook-URL einfügen.
Aktualisieren Sie die Webhook-URL, um den geheimen Schlüssel einzuschließen:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>Beispiel:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
So aktualisieren Sie die Webhook-URL:
- Rufen Sie im FingerprintJS-Dashboard Dashboard > Webhooks auf.
- Suchen Sie in der Tabelle nach Ihrem Webhook und klicken Sie auf das Symbol Bearbeiten.
- Aktualisieren Sie das Feld URL mit der vollständigen URL, die sowohl den API-Schlüssel als auch den geheimen Schlüssel enthält.
- Klicken Sie auf Webhook bearbeiten.
Webhook testen
- Rufen Sie im FingerprintJS-Dashboard Dashboard > Webhooks auf.
- Suchen Sie in der Tabelle nach Ihrem Webhook.
- Klicken Sie auf Testlaufwerk senden.
- Warten Sie auf die Bestätigung, dass das Testereignis gesendet wurde.
Prüfen Sie, ob für den Webhook der Status „Erfolgreich zugestellt“ angezeigt wird.
Referenz zu Authentifizierungsmethoden
Chronicle-Webhook-Feeds unterstützen mehrere Authentifizierungsmethoden. FingerprintJS-Webhooks verwenden Abfrageparameter zur Authentifizierung.
Methode für Abfrageparameter
FingerprintJS unterstützt keine benutzerdefinierten HTTP-Header beim Erstellen von Webhooks. Anmeldedaten müssen daher an die URL angehängt werden.
URL-Format:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>Beispiel:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
Anfrageformat:
POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1 Content-Type: application/json { "visitorId": "3HNey93AkBW6CRbxV6xP", "requestId": "1708102555327.NLOjmg", "timestamp": 1582299576512 }
UDM-Zuordnungstabelle
| Logfeld | UDM-Zuordnung | Logik |
|---|---|---|
| rawDeviceAttributes.architecture.value, rawDeviceAttributes.audio.value, rawDeviceAttributes.colorDepth.value, rawDeviceAttributes.colorGamut.value, rawDeviceAttributes.contrast.value, rawDeviceAttributes.cookiesEnabled.value, rawDeviceAttributes.deviceMemory.value, rawDeviceAttributes.fonts.value, rawDeviceAttributes.forcedColors.value, rawDeviceAttributes.hardwareConcurrency.value, rawDeviceAttributes.hdr.value, rawDeviceAttributes.indexedDB.value, rawDeviceAttributes.localStorage.value, rawDeviceAttributes.math.value, rawDeviceAttributes.monochrome.value, rawDeviceAttributes.openDatabase.value, rawDeviceAttributes.pdfViewerEnabled.value, rawDeviceAttributes.reducedMotion.value, rawDeviceAttributes.screenFrame.value, rawDeviceAttributes.screenResolution.value, rawDeviceAttributes.sessionStorage.value, rawDeviceAttributes.touchSupport.value.maxTouchPoints, rawDeviceAttributes.languages.value, rawDeviceAttributes.vendorFlavors.value, rawDeviceAttributes.fontPreferences.value.apple, rawDeviceAttributes.fontPreferences.value.default, rawDeviceAttributes.fontPreferences.value.min, rawDeviceAttributes.fontPreferences.value.mono, rawDeviceAttributes.fontPreferences.value.sans, rawDeviceAttributes.fontPreferences.value.serif, rawDeviceAttributes.fontPreferences.value.system | additional.fields | Zusammengeführt aus Labels, die aus Quellfeldern erstellt wurden |
| has_principal, has_target, has_target_resource | metadata.event_type | Auf „NETWORK_CONNECTION“ setzen, wenn „has_principal“ und „has_target“ „true“ sind, andernfalls auf „USER_RESOURCE_ACCESS“, wenn „has_target_resource“ „true“ ist, andernfalls auf „STATUS_UPDATE“, wenn „has_principal“ „true“ ist, andernfalls auf „GENERIC_EVENT“. |
| source_type | metadata.product_event_type | Wert direkt kopiert |
| requestId | metadata.product_log_id | Wert direkt kopiert |
| browserDetails.userAgent | network.http.parsed_user_agent | Aus browserDetails.userAgent geparst |
| browserDetails.browserName | network.http.parsed_user_agent.browser | Wert direkt kopiert |
| browserDetails.browserFullVersion | network.http.parsed_user_agent.browser_version | Wert direkt kopiert |
| browserDetails.device | network.http.parsed_user_agent.device | Wert direkt kopiert |
| network.http.parsed_user_agent.family | Auf „USER_DEFINED“ festlegen | |
| browserDetails.os | network.http.parsed_user_agent.os | Wert direkt kopiert |
| browserDetails.clientReferrer | network.http.referral_url | Wert direkt kopiert |
| browserDetails.userAgent, userAgent | network.http.user_agent | Wert aus userAgent, falls nicht leer, andernfalls browserDetails.userAgent |
| tag.session | network.session_id | Wert direkt kopiert |
| rawDeviceAttributes.vendor.value | principal.administrative_domain | Wert direkt kopiert |
| ip | principal.asset.ip | Wert direkt kopiert |
| ip | principal.ip | Wert direkt kopiert |
| ipInfo.v4.geolocation.city.name | principal.location.city | Wert direkt kopiert |
| ipInfo.v4.geolocation.country.name | principal.location.country_or_region | Wert direkt kopiert |
| ipInfo.v4.geolocation.latitude | principal.location.region_coordinates.latitude | In Gleitkommazahl konvertiert |
| ipInfo.v4.geolocation.longitude | principal.location.region_coordinates.longitude | In Gleitkommazahl konvertiert |
| browserDetails.osVersion, rawDeviceAttributes.platform.value | principal.platform_version | Wert aus rawDeviceAttributes.platform.value, falls nicht leer, andernfalls browserDetails.osVersion |
| ipInfo.v4.asn.asn, ipInfo.v4.asn.network, ipInfo.v4.asn.name, ipInfo.v4.geolocation.accuracyRadius, ipInfo.v4.geolocation.continent.name, ipInfo.v4.geolocation.timezone, ipInfo.v4.geolocation.subdivisions.isoCode, ipInfo.v4.geolocation.subdivisions.name | principal.resource.attribute.labels | Zusammengeführt aus Labels, die aus Quellfeldern erstellt wurden |
| bot.result, browserDetails.browserMajorVersion, confidence.score, confidence.revision, developerTools.result, highActivity.result, incognito, ipBlocklist.result, ipBlocklist.details.attackSource, ipBlocklist.details.emailSpam, visitorFound, visitorId, tag.request, privacySettings.result, proxy.result, suspectScore.result, tor.result, virtualMachine.result, tampering.anomalyScore, tampering.antiDetectBrowser, tampering.result, vpn.confidence, vpn.originCountry, vpn.originTimezone, vpn.result, vpn.methods.auxiliaryMobile, vpn.methods.osMismatch, vpn.methods.publicVPN, vpn.methods.timezoneMismatch, velocity.distinctCountry.intervals.1h, velocity.distinctCountry.intervals.24h, velocity.distinctCountry.intervals.5m, velocity.distinctIp.intervals.1h, velocity.distinctIp.intervals.24h, velocity.distinctIp.intervals.5m, velocity.events.intervals.1h, velocity.events.intervals.24h, velocity.events.intervals.5m, velocity.ipEvents.intervals.1h, velocity.ipEvents.intervals.24h, velocity.ipEvents.intervals.5m, rawDeviceAttributes.webGlBasics.value.renderer, rawDeviceAttributes.webGlBasics.value.rendererUnmasked, rawDeviceAttributes.webGlBasics.value.vendorUnmasked, rawDeviceAttributes.webGlBasics.value.shadingLanguageVersion, rawDeviceAttributes.webGlExtensions.value.contextAttributes, rawDeviceAttributes.webGlExtensions.value.extensions, rawDeviceAttributes.webGlExtensions.value.extensionParameters, rawDeviceAttributes.webGlExtensions.value.parameters, rawDeviceAttributes.webGlExtensions.value.shaderPrecisions, rawDeviceAttributes.mathML.value.bottom, rawDeviceAttributes.mathML.value.top, rawDeviceAttributes.mathML.value.left, rawDeviceAttributes.mathML.value.right, rawDeviceAttributes.mathML.value.width, rawDeviceAttributes.mathML.value.height, rawDeviceAttributes.mathML.value.font, rawDeviceAttributes.mathML.value.x, rawDeviceAttributes.mathML.value.y, rawDeviceAttributes.emoji.value.bottom, rawDeviceAttributes.emoji.value.top, rawDeviceAttributes.emoji.value.left, rawDeviceAttributes.emoji.value.right, rawDeviceAttributes.emoji.value.width, rawDeviceAttributes.emoji.value.height, rawDeviceAttributes.emoji.value.font, rawDeviceAttributes.emoji.value.x, rawDeviceAttributes.emoji.value.y, rawDeviceAttributes.canvas.value.Geometry, rawDeviceAttributes.canvas.value.Text, rawDeviceAttributes.canvas.value.Winding | security_result.detection_fields | Zusammengeführt aus Labels, die aus Quellfeldern erstellt wurden |
| rawDeviceAttributes.webGlBasics.value.vendor | target.administrative_domain | Wert direkt kopiert |
| ipInfo.v6.address | target.asset.ip | Wert direkt kopiert |
| ipInfo.v6.address | target.ip | Wert direkt kopiert |
| ipInfo.v6.geolocation.city.name | target.location.city | Wert direkt kopiert |
| ipInfo.v6.geolocation.country.name | target.location.country_or_region | Wert direkt kopiert |
| ipInfo.v6.geolocation.latitude | target.location.region_coordinates.latitude | In Gleitkommazahl konvertiert |
| ipInfo.v6.geolocation.longitude | target.location.region_coordinates.longitude | In Gleitkommazahl konvertiert |
| Pfad | target.path | Wert direkt kopiert |
| rawDeviceAttributes.webGlBasics.value.version | target.platform_version | Wert direkt kopiert |
| ipInfo.v6.asn.asn, ipInfo.v6.asn.network, ipInfo.v6.asn.name, ipInfo.v6.geolocation.accuracyRadius, ipInfo.v6.geolocation.continent.name, ipInfo.v6.geolocation.timezone, ipInfo.v6.geolocation.subdivisions.isoCode, ipInfo.v6.geolocation.subdivisions.name | target.resource.attribute.labels | Zusammengeführt aus Labels, die aus Quellfeldern erstellt wurden |
| URL | target.url | Wert direkt kopiert |
| metadata.product_name | Auf „FINGERPRINT_JS“ festgelegt | |
| metadata.vendor_name | Auf „FINGERPRINT_JS“ festgelegt |
Änderungsprotokoll
Änderungsprotokoll für diesen Parser ansehen
Benötigen Sie weitere Hilfe? Antworten von Community-Mitgliedern und Google SecOps-Experten erhalten