收集 F5 Shape 記錄
剖析器版本:1.0
本文說明如何使用 Google Cloud Storage V2,將 F5 Shape 記錄檔擷取至 Google Security Operations。
F5 Distributed Cloud Bot Defense (前身為 Shape Security) 可識別並防範惡意機器人,保護應用程式免於自動化攻擊。Bot Defense 會使用 JavaScript 和原生 Mobile SDK,從用戶端瀏覽器和行動裝置收集遙測資料,並在要求送達應用程式前檢查這些資料。這項服務提供整合式資訊主頁和報表,可查看分析流量的詳細資訊,包括安全性事件、存取記錄和稽核記錄。
事前準備
請確認您已完成下列事前準備事項:
- Google SecOps 執行個體
- 已啟用 Cloud Storage API 的 GCP 專案
- 建立及管理 GCS bucket 的權限
- 管理 Google Cloud Storage 值區 IAM 政策的權限
- F5 Distributed Cloud Console 的特殊存取權
- 具有 Multi-Cloud Network Connect 或 Shared Configuration 服務存取權的 F5 Distributed Cloud 帳戶
建立 Google Cloud Storage bucket
- 前往 Google Cloud 控制台。
- 選取專案或建立新專案。
- 在導覽選單中,依序前往「Cloud Storage」>「Bucket」。
- 按一下「建立值區」。
請提供下列設定詳細資料:
設定 值 為 bucket 命名 輸入全域不重複的名稱 (例如 f5-xc-logs)。位置類型 請根據需求選擇 (區域、雙區域、多區域)。 位置 選取位置 (例如 us-central1)。儲存空間級別 標準 (建議用於經常存取的記錄)。 存取控管 一致 (建議)。 保護工具 選用:啟用物件版本管理或保留政策。 點選「建立」。
產生 F5 Shape API 憑證
F5 Distributed Cloud 使用 API 憑證 (mTLS) 或 API 權杖進行驗證。建議使用 API 憑證來提升安全性。
建立 API 憑證
- 登入 F5 Distributed Cloud Console。
- 在管理中心首頁中,選取「管理」。
- 在左側導覽選單中,依序前往「個人管理」>「憑證」。
- 點選「Add Credentials」。
- 在「Metadata」(中繼資料) 專區中,輸入憑證的「Name」(名稱),例如
secops-integration。 - 在「憑證類型」清單中,選取「API 憑證」。
- 輸入「密碼」,然後在「確認密碼」欄位中確認密碼。
從日曆清單中選取「到期日」。
按一下「下載」,即可產生並下載
.p12檔案格式的憑證。請妥善儲存下載的憑證檔案和密碼,以備後續使用。
在 F5 Distributed Cloud 中建立 GCP Cloud 憑證
F5 Distributed Cloud 需要 Google Cloud 服務帳戶憑證,才能將記錄寫入 GCS bucket。
建立 Google Cloud 服務帳戶
- 在 GCP 控制台中,依序前往「IAM & Admin」(IAM 與管理) >「Service Accounts」(服務帳戶)。
- 按一下「Create Service Account」(建立服務帳戶)。
- 提供下列設定詳細資料:
- 「服務帳戶名稱」:輸入
f5-xc-log-writer(或您偏好的名稱)。 - 服務帳戶說明:輸入
Service account for F5 Distributed Cloud to write logs to GCS。
- 「服務帳戶名稱」:輸入
- 按一下「建立並繼續」。
- 在「將專案存取權授予這個服務帳戶」部分:
- 按一下「選擇角色」。
- 搜尋並選取「Storage 物件管理員」。
- 按一下「繼續」。
- 按一下 [完成]。
授予 GCS 值區的 IAM 權限
- 依序前往「Cloud Storage」>「Buckets」。
- 按一下 bucket 名稱 (例如
f5-xc-logs)。 - 前往「權限」分頁標籤。
- 按一下「授予存取權」。
- 提供下列設定詳細資料:
- 新增主體:輸入服務帳戶電子郵件地址 (例如
f5-xc-log-writer@PROJECT_ID.iam.gserviceaccount.com)。 - 指派角色:選取「Storage 物件管理員」。
- 新增主體:輸入服務帳戶電子郵件地址 (例如
- 按一下 [儲存]。
建立服務帳戶金鑰
- 在 GCP 控制台中,依序前往「IAM & Admin」(IAM 與管理) >「Service Accounts」(服務帳戶)。
- 找到服務帳戶 (例如
f5-xc-log-writer),然後按一下。 - 前往「金鑰」分頁標籤。
- 依序點選「新增金鑰」>「建立新的金鑰」。
- 選取「JSON」做為金鑰類型。
- 點選「建立」。
- 系統會自動下載 JSON 金鑰檔案。請妥善保存這個檔案。
將 Google Cloud 雲端憑證新增至 F5 Distributed Cloud
- 在 F5 Distributed Cloud Console 的首頁中,選取「Multi-Cloud Network Connect」(多雲網路連線) 或「Shared Configuration」(共用設定)。
- 在左側導覽選單中,依序前往「管理」>「網站管理」>「雲端憑證」。
- 按一下「新增雲端憑證」。
- 在「Metadata」(中繼資料) 區段中,輸入「Name」(名稱),例如
gcp-secops-logs。 - 在「Cloud Credentials Type」清單中,選取「GCP Credentials」。
- 在「GCP 憑證」部分,按一下「設定」。
- 在「服務帳戶金鑰」部分:
- 在「Secret Type」清單中選取「Blindfolded Secret」。
- 在「動作」清單中,選取「Blindfold New Secret」。
- 在「政策類型」清單中選取「內建」。
- 在「Secret to Blindfold」欄位中,貼上您下載的 JSON 金鑰檔案所有內容。
- 按一下「套用」。
- 按一下「儲存並結束」。
設定 GCS 的全域記錄接收器
F5 Distributed Cloud Global Log Receiver 會以 NDJSON 格式 (以換行符號分隔的 JSON) 將記錄串流至 GCS,每 5 分鐘一次。
建立全域記錄接收器
- 在 F5 Distributed Cloud Console 的首頁中,選取「Multi-Cloud Network Connect」(多雲網路連線) 或「Shared Configuration」(共用設定)。
- 如為 Multi-Cloud Network Connect:依序前往「管理」>「記錄管理」>「全域記錄接收器」。
- 如要使用共用設定,請依序前往「管理」> 全域記錄接收器。
- 按一下「新增全域記錄接收器」。
- 在「Metadata」(中繼資料) 區段中,輸入「Name」(名稱),例如
secops-gcs-receiver。 - 視需要新增「標籤」和「說明」。
在「記錄類型」清單中,選取要收集的記錄類型:
- 要求記錄:負載平衡器的 HTTP 存取記錄
- 安全性事件:Bot Defense 和 WAF 安全性事件
- 稽核記錄:設定和管理稽核記錄
- DNS 請求記錄:DNS 查詢記錄
從「記錄訊息選取」清單中:
- 如果使用 Multi-Cloud Network Connect 服務,請選取「Select logs from current namespace」(從目前的命名空間選取記錄) (系統命名空間)。
- 如果使用「共用設定」服務,請選擇下列其中一個選項:
- 選取目前命名空間的記錄:只傳送共用命名空間的記錄。
- 選取所有命名空間的記錄:傳送所有命名空間的記錄。
- 選取特定命名空間中的記錄:輸入特定命名空間名稱,然後按一下「新增項目」即可新增更多。
從「接收器設定」清單中,選取「GCP Bucket」。
在「GCP Bucket」(GCP Bucket) 區段中,提供下列設定:
- 「GCP Bucket Name」(GCP bucket 名稱):輸入 GCS bucket 名稱 (例如
f5-xc-logs)。 - GCP Cloud 憑證:從清單中選取您建立的 Cloud 憑證 (例如
gcp-secops-logs)。
- 「GCP Bucket Name」(GCP bucket 名稱):輸入 GCS bucket 名稱 (例如
調整進階設定 (選用)
- 按一下「顯示進階欄位」切換鈕。
在「批次選項」部分,設定下列選項 (選用):
- 批次逾時選項:選取「逾時秒數」並輸入值 (預設值:
300秒)。 - 批次最多事件:選取「最多事件」,然後輸入介於 32 到 2000 之間的值 (選用)。
- 批次位元組:選取「最大位元組」,然後輸入介於 4096 和 1048576 之間的值 (預設值:
10485760位元組 / 10 MB)。
- 批次逾時選項:選取「逾時秒數」並輸入值 (預設值:
完成並測試設定
- 按一下「儲存並結束」,即可建立全域記錄接收器。
- 在「Global Log Receiver」(全域記錄接收器) 清單中,找出您的接收器 (例如
secops-gcs-receiver)。 - 在「動作」欄中,按一下三個點 ...,然後選取「測試連線」。
等待測試完成。如果看到成功訊息,表示連線正常運作。
確認記錄檔是否寫入 GCS:
- 前往 GCP Console 的「Cloud Storage」>「Buckets」頁面。
- 按一下 bucket 名稱 (例如
f5-xc-logs)。 - 5 到 10 分鐘內,您應該會看到建立的資料夾,結構如下:
- 每日資料夾:
YYYY-MM-DD/ - 每小時子資料夾:
YYYY-MM-DD/HH/ - 記錄檔:
YYYY-MM-DD/HH/logs_YYYYMMDDHHMMSS.ndjson.gz
- 每日資料夾:
設定防火牆許可清單
F5 Distributed Cloud 需要在防火牆中允許特定 IP 範圍,才能傳送記錄。
將下列 IP 位址範圍新增至防火牆的許可清單:
193.16.236.64/29185.160.8.152/29
擷取 Google SecOps 服務帳戶
Google SecOps 會使用專屬服務帳戶,從 GCS bucket 讀取資料。您必須授予這個服務帳戶值區存取權。
取得服務帳戶電子郵件地址
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
F5 Distributed Cloud Bot Defense)。 - 選取「Google Cloud Storage V2」做為「來源類型」。
- 選取「F5_SHAPE」做為「記錄類型」。
按一下「取得服務帳戶」。系統會顯示專屬服務帳戶電子郵件地址,例如:
secops-12345678@secops-gcp-prod.iam.gserviceaccount.com複製電子郵件地址,以便在下一步中使用。
點選「下一步」。
指定下列輸入參數的值:
儲存空間 bucket URL:輸入 GCS bucket URI,並加上前置路徑:
gs://f5-xc-logs/- 請將
f5-xc-logs替換成實際的 GCS 值區名稱。 - 如果您在全域記錄接收器中設定了特定前置字元,請將其納入路徑 (例如
gs://f5-xc-logs/bot-defense/)。
- 請將
來源刪除選項:根據偏好設定選取刪除選項:
- 永不:移轉後一律不刪除任何檔案 (建議用於測試)。
- 刪除已轉移的檔案:成功轉移檔案後刪除檔案。
刪除已轉移的檔案和空白目錄:成功轉移後刪除檔案和空白目錄。
檔案存在時間上限:包含在過去天數內修改的檔案 (預設為 180 天)。
資產命名空間:資產命名空間。
擷取標籤:要套用至這個動態饋給事件的標籤。
點選「下一步」。
在「Finalize」(完成) 畫面中檢查新的動態饋給設定,然後按一下「Submit」(提交)。
將 IAM 權限授予 Google SecOps 服務帳戶
Google SecOps 服務帳戶需要 GCS bucket 的「Storage 物件檢視者」角色。
- 依序前往「Cloud Storage」>「Buckets」。
- 按一下 bucket 名稱 (例如
f5-xc-logs)。 - 前往「權限」分頁標籤。
- 按一下「授予存取權」。
- 提供下列設定詳細資料:
- 新增主體:貼上 Google SecOps 服務帳戶電子郵件地址
- 指派角色:選取「Storage 物件檢視者」
- 按一下 [儲存]。
UDM 對應表
| 記錄欄位 | UDM 對應 | 邏輯 |
|---|---|---|
| msg.requestHeaders.Proxy-Client-IP、msg.requestHeaders.WF-Forwarded-For、msg.requestHeaders.X-Forwarded-For、msg.requestHeaders.wl-proxy-client-ip、msg.hashedUserAgent、msg.transactionId、msg.hashedUsername、msg.dcgShapeFailedOn、ShapeShifterId、eventType、eventId、latRequest、latResponse、latTotal、latRspWait、count、latEccWait | additional.fields | 從不同欄位建立的標籤合併而來 |
| 中介 | 中介 | 如果值不是空白,則直接複製 |
| 說明 | metadata.description | 直接複製值 |
| target、has_principal_machine | metadata.event_type | 如果目標 != "",則設為 NETWORK_HTTP;如果 has_principal_machine == true,則設為 STATUS_UPDATE;否則設為 GENERIC_EVENT |
| 應用程式 | network.application_protocol | 值已轉換為大寫 |
| requestMethod、msg.method | network.http.method | 如果 requestMethod 不是空白,則為 requestMethod 的值,否則為 msg.method |
| requestClientApplication, msg.requestHeaders.User-Agent | network.http.parsed_user_agent | 如果 requestClientApplication 不為空白,則為該值;否則為 msg.requestHeaders.User-Agent,並轉換為剖析後的使用者代理程式 |
| requestContext、msg.requestHeaders.Referer | network.http.referral_url | 如果 requestContext 不為空白,則為該值,否則為 msg.requestHeaders.Referer |
| msg.sseResponseCode, prCode | network.http.response_code | 如果 msg.sseResponseCode 不是空白,則為該值,否則為 prCode,並轉換為整數 |
| requestClientApplication, msg.requestHeaders.User-Agent | network.http.user_agent | 如果 requestClientApplication 不為空白,則為該值,否則為 msg.requestHeaders.User-Agent |
| requestHeader.x-shape-src-virtual | observer.ip | 直接複製值 |
| 主體 | 主體 | 直接複製值 |
| msg.host | principal.asset.hostname | 直接複製值 |
| src、msg.src、msg.trueClientIP、requestHeader.X-Forwarded-For | principal.asset.ip | 如果 src 不是空白,則為 src 的值;否則為 msg.src;否則為 msg.trueClientIP;否則為 X-Forwarded-For 中的第一個 IP (如果 != src) |
| msg.host | principal.hostname | 直接複製值 |
| src、msg.src、msg.trueClientIP、requestHeader.X-Forwarded-For | principal.ip | 如果 src 不是空白,則為 src 的值;否則為 msg.src;否則為 msg.trueClientIP;否則為 X-Forwarded-For 中的第一個 IP (如果 != src) |
| msg.requestHeaders | principal.resource.attribute.labels | 從 msg.requestHeaders 中的鍵/值組合合併 |
| msg.uri | principal.url | 直接複製值 |
| security_result | security_result | 直接複製值 |
| deviceExternalId | security_result.about.asset_id | 直接複製值 |
| flowLabel、agentLabel、requestHeader.Content-Length、requestHeader.Content-Type、requestHeader.Accept、requestHeader.Accept-Encoding、browserType、accountInfo、requestHeader.Via、asn、tid、ctag、requestHeader.Cache-Control、transactionResult | security_result.about.labels | 從不同欄位建立的標籤合併而來 |
| act, msg.transactionResult | security_result.action | 如果 act 符合 PASS 且為 isAttack,則設為 ALLOW,否則設為 UNKNOWN_ACTION;如果 msg.transactionResult == Success,則設為 ALLOW,如果為 Failure,則設為 BLOCK |
| act, msg.transactionResult | security_result.action_details | 如果 act 不是空白,則為 act 的值,否則為 msg.transactionResult |
| 嚴重性 | security_result.severity | 如果為 Error、error、warning,請設為 HIGH;如果符合 critical,請設為 CRITICAL;如果為 notice,請設為 MEDIUM;如果為 information、info、INFO,請設為 LOW |
| 嚴重性 | security_result.severity_details | 直接複製值 |
| attackCause | security_result.threat_name | 直接複製值 |
| 目標 | 目標 | 直接複製值 |
| appName | target.application | 直接複製值 |
| dst、msg.dst | target.asset.ip | 如果 dst 不是空白,則為 dst 的值,否則為 msg.dst |
| dhost | target.hostname | 直接複製值 |
| dst、msg.dst | target.ip | 如果 dst 不是空白,則為 dst 的值,否則為 msg.dst |
| countryName | target.location.country_or_region | 直接複製值 |
| dpt | target.port | 已轉換為整數 |
| msg.responseHeaders | target.resource.attribute.labels | 從 msg.responseHeaders 中的鍵/值組合合併 |
| 要求 | target.url | 直接複製值 |
| requestHeader.X-Forwarded-For | intermediary.ip | 設為 X-Forwarded-For 陣列中的後續 IP |
| metadata.product_name | 設為「形狀」 | |
| metadata.vendor_name | 設為「F5」 | |
requestHeaders_id_array.User-Agent |
network.http.user_agent |
從變更記錄對應 |
requestHeaders_id_array.Referer |
network.http.referral_url |
從變更記錄對應 |
requestHeaders_id_array.Proxy-Client-IP", "requestHeaders_id_array.WF-Forwarded-For", "requestHeaders_id_array.X-Forwarded-For", and "requestHeaders_id_array.wl-proxy-client-ip |
additional.fields |
從變更記錄對應 |
變更記錄
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求解答。