收集指紋記錄
剖析器版本:1.0
本文說明如何設定 Fingerprint (舊稱 FingerprintJS),透過 Webhook 將記錄檔推送至 Google Security Operations。
Fingerprint 是裝置智慧平台,提供訪客識別和詐欺偵測功能。這項服務會產生專屬訪客 ID,並提供智慧信號,包括機器人偵測、VPN 偵測、無痕模式偵測和其他裝置智慧洞察資料。透過 FingerprintJS JavaScript 代理程式識別訪客時,Webhook 可以將識別事件資料即時傳送至 Google Security Operations。
事前準備
請確認您已完成下列事前準備事項:
- Google SecOps 執行個體
- 支援 Webhook 的 FingerprintJS 帳戶
- 存取 Google Cloud 控制台 (用於建立 API 金鑰)
- 網站或應用程式上安裝的 FingerprintJS JavaScript 代理程式
在 Google SecOps 中建立 Webhook 動態饋給
建立動態饋給
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 在下一個頁面中,按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
FingerprintJS Identification Events)。 - 選取「Webhook」做為「來源類型」。
- 選取「FingerprintJS」做為「記錄類型」。
- 點選「下一步」。
- 指定下列輸入參數的值:
- 分割分隔符 (選填):留空。每個 Webhook 要求都包含單一識別事件。
- 資產命名空間:資產命名空間。
- 擷取標籤:要套用至這個動態饋給事件的標籤。
- 點選「下一步」。
- 在「Finalize」(完成) 畫面中檢查新的動態饋給設定,然後按一下「Submit」(提交)。
產生並儲存密鑰
建立動態饋給後,您必須產生驗證用的密鑰:
- 在動態饋給詳細資料頁面中,按一下「產生密鑰」。
- 對話方塊會顯示密鑰。
- 複製並妥善儲存密鑰。
重要事項:密鑰只會顯示一次,之後便無法擷取,如果遺失,就必須產生新的密鑰。
取得動態消息端點網址
- 前往動態消息的「詳細資料」分頁。
- 在「端點資訊」部分,複製「動態消息端點網址」。
網址格式為:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate或
https://<REGION>-malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate請儲存這個網址,以供後續步驟使用。
按一下 [完成]。
建立 Google Cloud API 金鑰
Chronicle 需要 API 金鑰才能進行驗證。在 Google Cloud 控制台中建立受限制的 API 金鑰。
建立 API 金鑰
- 前往 Google Cloud 控制台的「憑證」頁面。
- 選取專案 (與 Chronicle 執行個體相關聯的專案)。
- 依序按一下「建立憑證」>「API 金鑰」。
- 系統會建立 API 金鑰,並顯示在對話方塊中。
- 按一下「編輯 API 金鑰」即可限制金鑰。
限制 API 金鑰
- 在「API 金鑰」設定頁面中:
- 名稱:輸入描述性名稱 (例如
Chronicle FingerprintJS Webhook API Key)。
- 名稱:輸入描述性名稱 (例如
- 在「API 限制」下方:
- 選取「Restrict key」(限制金鑰)。
- 在「選取 API」下拉式選單中,搜尋並選取「Google SecOps API」 (或「Chronicle API」)。
- 按一下 [儲存]。
- 複製頁面頂端「API key」(API 金鑰) 欄位中的 API 金鑰值。
安全地儲存 API 金鑰。
設定 FingerprintJS Webhook
建構 Webhook 網址
合併 Chronicle 端點網址和 API 金鑰:
<ENDPOINT_URL>?key=<API_KEY>範例:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...
在 FingerprintJS 資訊主頁中建立 Webhook
- 登入 FingerprintJS 資訊主頁。
- 前往「資訊主頁」>「Webhook」。
- 按一下 [Add Webhook]。
- 請提供下列設定詳細資料:
- 網址:貼上上述包含 API 金鑰的完整端點網址。
- 環境 (選用):如果選取環境,Webhook 只會回報相符環境的事件。如要接收來自所有環境的事件,請將這個欄位留空。
- 基本驗證 (選用):如要新增其他驗證方式,請展開「基本驗證」。如要整合 Chronicle,您可以將這個欄位留空,因為驗證作業會透過 API 金鑰和私密金鑰處理。
- 按一下「建立 Webhook」。
- 成功建立 Webhook 後,系統會顯示「已建立 Webhook」的成功訊息。
- 重要事項:如果您使用 Webhook 簽章 (僅限企業方案),請複製並儲存成功訊息視窗中顯示的加密金鑰。金鑰只會顯示一次。
將 Chronicle 密鑰新增至 webhook
建立 Webhook 時,FingerprintJS 不支援自訂 HTTP 標頭。您必須在 Webhook 網址中新增 Chronicle 密鑰做為查詢參數。
更新 webhook 網址,加入密鑰:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>範例:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
如要更新 Webhook 網址,請按照下列步驟操作:
- 在 FingerprintJS 資訊主頁中,依序前往「Dashboard」(資訊主頁) >「Webhooks」(Webhook)。
- 在表格中找出網路鉤子,然後按一下「編輯」圖示。
- 在「URL」欄位中,更新包含 API 金鑰和私密金鑰的完整網址。
- 按一下「編輯 Webhook」。
測試 Webhook
- 在 FingerprintJS 資訊主頁中,依序前往「Dashboard」(資訊主頁) >「Webhooks」(Webhook)。
- 在表格中找出所需 Webhook。
- 按一下「傳送測試事件」。
- 等待系統確認測試事件已成功傳送。
確認網路鉤子顯示成功傳送狀態。
驗證方法參考資料
Chronicle 網頁掛鉤動態消息支援多種驗證方法。FingerprintJS Webhook 會使用查詢參數進行驗證。
查詢參數方法
FingerprintJS 在建立 Webhook 時不支援自訂 HTTP 標頭,因此必須將憑證附加至網址。
網址格式:
<ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY>範例:
https://malachiteingestion-pa.googleapis.com/v2/unstructuredlogentries:batchCreate?key=AIzaSyD...&secret=abcd1234...
要求格式:
POST <ENDPOINT_URL>?key=<API_KEY>&secret=<SECRET_KEY> HTTP/1.1 Content-Type: application/json { "visitorId": "3HNey93AkBW6CRbxV6xP", "requestId": "1708102555327.NLOjmg", "timestamp": 1582299576512 }
UDM 對應表
| 記錄欄位 | UDM 對應 | 邏輯 |
|---|---|---|
| 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 | 從來源欄位建立的標籤合併而來 |
| has_principal、has_target、has_target_resource | metadata.event_type | 如果 has_principal 和 has_target 為 true,則設為「NETWORK_CONNECTION」;如果 has_target_resource 為 true,則設為「USER_RESOURCE_ACCESS」;如果 has_principal 為 true,則設為「STATUS_UPDATE」;否則設為「GENERIC_EVENT」 |
| source_type | metadata.product_event_type | 直接複製值 |
| requestId | metadata.product_log_id | 直接複製值 |
| browserDetails.userAgent | network.http.parsed_user_agent | 從 browserDetails.userAgent 剖析 |
| browserDetails.browserName | network.http.parsed_user_agent.browser | 直接複製值 |
| browserDetails.browserFullVersion | network.http.parsed_user_agent.browser_version | 直接複製值 |
| browserDetails.device | network.http.parsed_user_agent.device | 直接複製值 |
| network.http.parsed_user_agent.family | 設為「USER_DEFINED」 | |
| browserDetails.os | network.http.parsed_user_agent.os | 直接複製值 |
| browserDetails.clientReferrer | network.http.referral_url | 直接複製值 |
| browserDetails.userAgent、userAgent | network.http.user_agent | 如果 userAgent 不是空白,則為 userAgent 的值,否則為 browserDetails.userAgent |
| tag.session | network.session_id | 直接複製值 |
| rawDeviceAttributes.vendor.value | principal.administrative_domain | 直接複製值 |
| ip | principal.asset.ip | 直接複製值 |
| ip | principal.ip | 直接複製值 |
| ipInfo.v4.geolocation.city.name | principal.location.city | 直接複製值 |
| ipInfo.v4.geolocation.country.name | principal.location.country_or_region | 直接複製值 |
| ipInfo.v4.geolocation.latitude | principal.location.region_coordinates.latitude | 已轉換為浮點數 |
| ipInfo.v4.geolocation.longitude | principal.location.region_coordinates.longitude | 已轉換為浮點數 |
| browserDetails.osVersion、rawDeviceAttributes.platform.value | principal.platform_version | 如果 rawDeviceAttributes.platform.value 不為空白,則為該值,否則為 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 | 從來源欄位建立的標籤合併而來 |
| 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 | 從來源欄位建立的標籤合併而來 |
| rawDeviceAttributes.webGlBasics.value.vendor | target.administrative_domain | 直接複製值 |
| ipInfo.v6.address | target.asset.ip | 直接複製值 |
| ipInfo.v6.address | target.ip | 直接複製值 |
| ipInfo.v6.geolocation.city.name | target.location.city | 直接複製值 |
| ipInfo.v6.geolocation.country.name | target.location.country_or_region | 直接複製值 |
| ipInfo.v6.geolocation.latitude | target.location.region_coordinates.latitude | 已轉換為浮點數 |
| ipInfo.v6.geolocation.longitude | target.location.region_coordinates.longitude | 已轉換為浮點數 |
| 路徑 | target.path | 直接複製值 |
| rawDeviceAttributes.webGlBasics.value.version | target.platform_version | 直接複製值 |
| 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 | 從來源欄位建立的標籤合併而來 |
| 網址 | target.url | 直接複製值 |
| metadata.product_name | 設為「FINGERPRINT_JS」 | |
| metadata.vendor_name | 設為「FINGERPRINT_JS」 |
變更記錄
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。