Mengumpulkan log Sidik Jari
Versi Parser: 1.0
Dokumen ini menjelaskan cara mengonfigurasi Fingerprint (sebelumnya FingerprintJS) untuk mengirim log ke Google Security Operations menggunakan webhook.
Fingerprint adalah platform kecerdasan perangkat yang menyediakan kemampuan identifikasi pengunjung dan deteksi penipuan. Layanan ini menghasilkan ID pengunjung unik dan memberikan sinyal cerdas termasuk deteksi bot, deteksi VPN, deteksi mode incognito, dan insight kecerdasan perangkat lainnya. Saat pengunjung diidentifikasi melalui agen JavaScript FingerprintJS, webhook dapat mengirimkan data peristiwa identifikasi ke Google Security Operations secara real time.
Sebelum memulai
Pastikan Anda memiliki prasyarat berikut:
- Instance Google SecOps
- Akun FingerprintJS dengan dukungan webhook
- Akses ke Konsol Google Cloud (untuk pembuatan kunci API)
- Agen JavaScript FingerprintJS diinstal di situs atau aplikasi Anda
Membuat feed webhook di Google SecOps
Buat feed
- Buka Setelan SIEM > Feed.
- Klik Tambahkan Feed Baru.
- Di halaman berikutnya, klik Konfigurasi satu feed.
- Di kolom Nama feed, masukkan nama untuk feed (misalnya,
FingerprintJS Identification Events). - Pilih Webhook sebagai Jenis sumber.
- Pilih FingerprintJS sebagai Jenis log.
- Klik Berikutnya.
- Tentukan nilai untuk parameter input berikut:
- Pemisah pemisahan (opsional): Biarkan kosong. Setiap permintaan webhook berisi satu peristiwa identifikasi.
- Namespace aset: Namespace aset.
- Label penyerapan: Label yang akan diterapkan ke peristiwa dari feed ini.
- Klik Berikutnya.
- Tinjau konfigurasi feed baru Anda di layar Selesaikan, lalu klik Kirim.
Buat dan simpan kunci rahasia
Setelah membuat feed, Anda harus membuat kunci rahasia untuk autentikasi:
- Di halaman detail feed, klik Buat Kunci Rahasia.
- Dialog akan menampilkan kunci rahasia.
- Salin dan simpan kunci rahasia dengan aman.
Penting: Kunci rahasia hanya ditampilkan satu kali dan tidak dapat diambil lagi. Jika Anda kehilangan kunci tersebut, Anda harus membuat kunci rahasia baru.
Mendapatkan URL endpoint feed
- Buka tab Detail untuk feed tersebut.
- Di bagian Endpoint Information, salin Feed endpoint URL.
Format URL-nya adalah:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateatau
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreateSimpan URL ini untuk langkah berikutnya.
Klik Done.
Membuat kunci Google Cloud API
Chronicle memerlukan kunci API untuk autentikasi. Buat kunci API yang dibatasi di Konsol Google Cloud.
Buat kunci API
- Buka halaman Kredensial Konsol Google Cloud.
- Pilih project Anda (project yang terkait dengan instance Chronicle Anda).
- Klik Create credentials > API key.
- Kunci API dibuat dan ditampilkan dalam dialog.
- Klik Edit API key untuk membatasi kunci.
Membatasi kunci API
- Di halaman setelan kunci API:
- Name: Masukkan nama deskriptif (misalnya,
Chronicle FingerprintJS Webhook API Key).
- Name: Masukkan nama deskriptif (misalnya,
- Di bagian Pembatasan API:
- Pilih Restrict key.
- Di drop-down Select APIs, telusuri dan pilih Google SecOps API (atau Chronicle API).
- Klik Simpan.
- Salin nilai kunci API dari kolom kunci API di bagian atas halaman.
Simpan kunci API dengan aman.
Konfigurasi webhook FingerprintJS
Buat URL webhook
Gabungkan URL endpoint Chronicle dan kunci API:
<ENDPOINT_URL>?key=<API_KEY>Contoh:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
Membuat webhook di Dasbor FingerprintJS
- Login ke Dasbor FingerprintJS.
- Buka Dasbor > Webhook.
- Klik Tambahkan webhook.
- Berikan detail konfigurasi berikut:
- URL: Tempelkan URL endpoint lengkap dengan kunci API dari atas.
- Lingkungan (opsional): Jika Anda memilih lingkungan, webhook hanya akan melaporkan peristiwa dari lingkungan yang cocok. Biarkan kosong untuk menerima peristiwa dari semua lingkungan.
- Autentikasi dasar (opsional): Perluas Autentikasi dasar jika Anda ingin menambahkan autentikasi tambahan. Untuk integrasi Chronicle, Anda dapat membiarkannya kosong karena autentikasi ditangani melalui kunci API dan kunci rahasia.
- Klik Create Webhook.
- Modal keberhasilan menampilkan Webhook dibuat.
- Penting: Jika Anda menggunakan tanda tangan webhook (khusus paket Enterprise), salin dan simpan kunci enkripsi yang ditampilkan di modal keberhasilan. Kunci hanya ditampilkan satu kali.
Menambahkan kunci rahasia Chronicle ke webhook
FingerprintJS tidak mendukung header HTTP kustom selama pembuatan webhook. Anda harus menambahkan kunci rahasia Chronicle sebagai parameter kueri di URL webhook.
Perbarui URL webhook untuk menyertakan kunci rahasia:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>Contoh:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
Untuk memperbarui URL webhook:
- Di Dasbor FingerprintJS, buka Dashboard > Webhooks.
- Temukan webhook Anda dalam tabel, lalu klik ikon Edit.
- Perbarui kolom URL dengan URL lengkap yang mencakup kunci API dan kunci rahasia.
- Klik Edit webhook.
Menguji webhook
- Di Dasbor FingerprintJS, buka Dashboard > Webhooks.
- Temukan webhook Anda di tabel.
- Klik Send test event.
- Tunggu konfirmasi bahwa peristiwa pengujian berhasil dikirim.
Pastikan webhook menampilkan status pengiriman berhasil.
Referensi metode autentikasi
Feed webhook Chronicle mendukung beberapa metode autentikasi. Webhook FingerprintJS menggunakan parameter kueri untuk autentikasi.
Metode parameter kueri
FingerprintJS tidak mendukung header HTTP kustom selama pembuatan webhook, sehingga kredensial harus ditambahkan ke URL.
Format URL:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>Contoh:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
Format permintaan:
POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1 Content-Type: application/json { "visitorId": "3HNey93AkBW6CRbxV6xP", "requestId": "1708102555327.NLOjmg", "timestamp": 1582299576512 }
Tabel pemetaan UDM
| Kolom Log | Pemetaan UDM | Logika |
|---|---|---|
| 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 | Digabungkan dari label yang dibuat dari kolom sumber |
| has_principal, has_target, has_target_resource | metadata.event_type | Ditetapkan ke "NETWORK_CONNECTION" jika has_principal dan has_target benar, atau "USER_RESOURCE_ACCESS" jika has_target_resource benar, atau "STATUS_UPDATE" jika has_principal benar, atau "GENERIC_EVENT" |
| source_type | metadata.product_event_type | Nilai disalin secara langsung |
| requestId | metadata.product_log_id | Nilai disalin secara langsung |
| browserDetails.userAgent | network.http.parsed_user_agent | Diuraikan dari browserDetails.userAgent |
| browserDetails.browserName | network.http.parsed_user_agent.browser | Nilai disalin secara langsung |
| browserDetails.browserFullVersion | network.http.parsed_user_agent.browser_version | Nilai disalin secara langsung |
| browserDetails.device | network.http.parsed_user_agent.device | Nilai disalin secara langsung |
| network.http.parsed_user_agent.family | Tetapkan ke "USER_DEFINED" | |
| browserDetails.os | network.http.parsed_user_agent.os | Nilai disalin secara langsung |
| browserDetails.clientReferrer | network.http.referral_url | Nilai disalin secara langsung |
| browserDetails.userAgent, userAgent | network.http.user_agent | Nilai dari userAgent jika tidak kosong, atau browserDetails.userAgent |
| tag.session | network.session_id | Nilai disalin secara langsung |
| rawDeviceAttributes.vendor.value | principal.administrative_domain | Nilai disalin secara langsung |
| ip | principal.asset.ip | Nilai disalin secara langsung |
| ip | principal.ip | Nilai disalin secara langsung |
| ipInfo.v4.geolocation.city.name | principal.location.city | Nilai disalin secara langsung |
| ipInfo.v4.geolocation.country.name | principal.location.country_or_region | Nilai disalin secara langsung |
| ipInfo.v4.geolocation.latitude | principal.location.region_coordinates.latitude | Dikonversi ke float |
| ipInfo.v4.geolocation.longitude | principal.location.region_coordinates.longitude | Dikonversi ke float |
| browserDetails.osVersion, rawDeviceAttributes.platform.value | principal.platform_version | Nilai dari rawDeviceAttributes.platform.value jika tidak kosong, atau 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 | Digabungkan dari label yang dibuat dari kolom sumber |
| 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 | Digabungkan dari label yang dibuat dari kolom sumber |
| rawDeviceAttributes.webGlBasics.value.vendor | target.administrative_domain | Nilai disalin secara langsung |
| ipInfo.v6.address | target.asset.ip | Nilai disalin secara langsung |
| ipInfo.v6.address | target.ip | Nilai disalin secara langsung |
| ipInfo.v6.geolocation.city.name | target.location.city | Nilai disalin secara langsung |
| ipInfo.v6.geolocation.country.name | target.location.country_or_region | Nilai disalin secara langsung |
| ipInfo.v6.geolocation.latitude | target.location.region_coordinates.latitude | Dikonversi ke float |
| ipInfo.v6.geolocation.longitude | target.location.region_coordinates.longitude | Dikonversi ke float |
| jalur | target.path | Nilai disalin secara langsung |
| rawDeviceAttributes.webGlBasics.value.version | target.platform_version | Nilai disalin secara langsung |
| 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 | Digabungkan dari label yang dibuat dari kolom sumber |
| url | target.url | Nilai disalin secara langsung |
| metadata.product_name | Tetapkan ke "FINGERPRINT_JS" | |
| metadata.vendor_name | Tetapkan ke "FINGERPRINT_JS" |
Log Perubahan
Melihat Log Perubahan untuk parser ini
Perlu bantuan lain? Dapatkan jawaban dari anggota Komunitas dan profesional Google SecOps.