收集 Google Cloud Secure Web Proxy 記錄
本文說明如何使用 Google Cloud Storage V2,將 Secure Web Proxy 記錄檔擷取 Google Cloud 至 Google Security Operations。
Secure Web Proxy 是雲端優先服務,可協助您保護輸出網路流量 (HTTP 和 HTTPS)。這項解決方案提供受管理 Proxy,可根據雲端優先身分和網頁應用程式,制定彈性且精細的政策。Secure Web Proxy 會識別不符合政策規定的流量,並將流量記錄在 Cloud Logging 中,方便您監控網際網路使用情形、找出網路威脅,以及應對安全事件。
事前準備
請確認您已完成下列事前準備事項:
- Google SecOps 執行個體
- 已啟用 Cloud Storage API 的 Google Cloud 專案
- 建立及管理 GCS 值區的權限
- 管理 Google Cloud Storage 值區 IAM 政策的權限
- Secure Web Proxy 已在 Google Cloud 環境中啟用及設定
- Google Cloud 的特殊存取權,以及存取 Secure Web Proxy 記錄的適當權限
- 建立及管理 Cloud Logging 接收器的權限
建立 Google Cloud Storage 值區
使用 Google Cloud 控制台
- 前往 Google Cloud Console。
- 選取專案或建立新專案。
- 在導覽選單中,依序前往「Cloud Storage」>「Bucket」。
- 按一下「建立值區」。
請提供下列設定詳細資料:
設定 值 為 bucket 命名 輸入全域不重複的名稱 (例如 Google Cloud-swp-logs)位置類型 根據需求選擇 (區域、雙區域、多區域) 位置 選取位置 (例如 us-central1)儲存空間級別 標準 (建議用於經常存取的記錄) 存取控管 統一 (建議) 保護工具 選用:啟用物件版本管理或保留政策 點選「建立」。
使用 gcloud 指令列工具
或者,您也可以使用
gcloud指令建立值區:gcloud storage buckets create gs://gcp-swp-logs \ --location=us-central1 \ --default-storage-class=STANDARD- 取代:
gcp-swp-logs:您要使用的 bucket 名稱 (全域不重複)。us-central1:偏好的區域 (例如us-central1、europe-west1)。
- 取代:
設定 Cloud Logging,將 Secure Web Proxy 記錄檔匯出至 GCS
Secure Web Proxy 會自動將 Proxy 交易記錄檔記錄至 Cloud Logging。如要將這些記錄匯出至 Cloud Storage,您必須建立 Cloud Logging 接收器。
使用 Google Cloud 控制台
- 在 Google Cloud 控制台中,依序前往「Logging」>「Log Router」。
- 按一下「Create Sink」(建立接收器)。
- 請提供下列設定詳細資料:
- 接收器名稱:輸入描述性名稱 (例如
swp-export-sink)。 - 接收器說明:選填說明。
- 接收器名稱:輸入描述性名稱 (例如
- 點選「下一步」。
- 在「選取接收器服務」部分:
- 接收器服務:選取「Cloud Storage bucket」(Cloud Storage 值區)。
- 選取 Cloud Storage bucket:從下拉式選單中選取
gcp-swp-logs。
- 點選「下一步」。
在「選擇要納入接收器的記錄檔」部分,輸入下列篩選查詢:
logName="projects/<YOUR_PROJECT_ID>/logs/networkservices.googleapis.com/gateway_requests"- 將
<YOUR_PROJECT_ID>替換為您的 Google Cloud 專案 ID。
- 將
點選「下一步」。
檢查設定,然後按一下「建立接收器」。
建立接收器後,Cloud Logging 會顯示接收器的寫入者身分 (服務帳戶電子郵件地址)。複製這個服務帳戶電子郵件地址,以供下一個步驟使用。
使用 gcloud 指令列工具
或者,您也可以使用
gcloud指令建立接收器:gcloud logging sinks create swp-export-sink \ storage.googleapis.com/gcp-swp-logs \ --log-filter='logName="projects/<YOUR_PROJECT_ID>/logs/networkservices.googleapis.com/gateway_requests"'- 取代:
swp-export-sink:所需的接收器名稱。gcp-swp-logs:您的 GCS bucket 名稱。<YOUR_PROJECT_ID>:您的 Google Cloud 專案 ID。
- 取代:
將權限授予 Cloud Logging 服務帳戶
Cloud Logging 接收器寫入者身分服務帳戶需要有權限,才能將記錄檔寫入 GCS bucket。
使用 Google Cloud 控制台
- 依序前往「Cloud Storage」>「Buckets」。
- 按一下 bucket 名稱 (
gcp-swp-logs)。 - 前往「權限」分頁標籤。
- 按一下「授予存取權」。
- 請提供下列設定詳細資料:
- 新增主體:貼上 Cloud Logging 接收器寫入者身分服務帳戶電子郵件地址 (例如
serviceAccount:service-123456789@gcp-sa-logging.iam.gserviceaccount.com)。 - 指派角色:選取「Storage 物件管理員」。
- 新增主體:貼上 Cloud Logging 接收器寫入者身分服務帳戶電子郵件地址 (例如
按一下 [儲存]。
使用 gcloud 指令列工具
或者,使用
gcloud指令授予權限:gcloud storage buckets add-iam-policy-binding gs://gcp-swp-logs \ --member="serviceAccount:<LOGGING_SERVICE_ACCOUNT_EMAIL>" \ --role="roles/storage.objectAdmin"- 取代:
gcp-swp-logs:bucket 名稱。<LOGGING_SERVICE_ACCOUNT_EMAIL>:Cloud Logging 接收器寫入者身分服務帳戶電子郵件地址。
- 取代:
使用 gsutil 指令列工具 (舊版)
將 Object 管理員角色指派給記錄服務帳戶:
gsutil iam ch serviceAccount:<LOGGING_SERVICE_ACCOUNT_EMAIL>:objectAdmin \ gs://gcp-swp-logs
驗證權限
如要確認權限是否已正確授予,請按照下列步驟操作:
gcloud storage buckets get-iam-policy gs://gcp-swp-logs \ --flatten="bindings[].members" \ --filter="bindings.role:roles/storage.objectAdmin"
輸出內容中應該會顯示 Cloud Logging 服務帳戶電子郵件地址。
擷取 Google SecOps 服務帳戶
Google SecOps 會使用專屬服務帳戶,從 GCS bucket 讀取資料。您必須授予這個服務帳戶值區存取權。
在 Google SecOps 中設定資訊提供,擷取 GCP 安全網路 Proxy 記錄
- 依序前往「SIEM 設定」>「動態饋給」。
- 按一下「新增動態消息」。
- 按一下「設定單一動態饋給」。
- 在「動態饋給名稱」欄位中輸入動態饋給名稱 (例如
GGoogle CloudCP Secure Web Proxy Logs)。 - 選取「Google Cloud Storage V2」做為「來源類型」。
選取「GCP Secure Web Proxy」(GCP 安全網頁 Proxy) 做為「記錄類型」。
按一下「取得服務帳戶」。系統會顯示不重複的服務帳戶電子郵件地址,例如:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com複製這個電子郵件地址,以便在下一步中使用。
點選「下一步」。
指定下列輸入參數的值:
- 儲存空間 bucket URL:輸入 GCS bucket URI,並加上前置路徑:
gs://gcp-swp-logs/- 取代:
gcp-swp-logs:您的 GCS bucket 名稱。
來源刪除選項:根據偏好設定選取刪除選項:
- 永不:移轉後一律不刪除任何檔案 (建議用於測試)。
- 刪除已轉移的檔案:成功轉移檔案後刪除檔案。
刪除已轉移的檔案和空白目錄:成功轉移後刪除檔案和空白目錄。
檔案存在時間上限:包含在過去天數內修改的檔案。預設值為 180 天。
資產命名空間:資產命名空間。
擷取標籤:要套用至這個動態饋給事件的標籤。
點選「下一步」。
在「Finalize」(完成) 畫面中檢查新的動態饋給設定,然後按一下「Submit」(提交)。
將 IAM 權限授予 Google SecOps 服務帳戶
Google SecOps 服務帳戶需要 GCS bucket 的「Storage 物件檢視者」角色。
使用 Google Cloud 控制台
- 依序前往「Cloud Storage」>「Buckets」。
- 按一下 bucket 名稱。
- 前往「權限」分頁標籤。
- 按一下「授予存取權」。
- 請提供下列設定詳細資料:
- 新增主體:貼上 Google SecOps 服務帳戶電子郵件地址。
- 指派角色:選取「Storage 物件檢視者」。
- 按一下 [儲存]。
使用 gcloud 指令列工具
或者,使用
gcloud指令授予權限:gcloud storage buckets add-iam-policy-binding gs://gcp-swp-logs \ --member="serviceAccount:<SECOPS_SERVICE_ACCOUNT_EMAIL>" \ --role="roles/storage.objectViewer"- 取代:
gcp-swp-logs:bucket 名稱。<SECOPS_SERVICE_ACCOUNT_EMAIL>:Google SecOps 服務帳戶電子郵件地址。
- 取代:
使用 gsutil 指令列工具 (舊版)
執行下列指令,授予 SecOps 服務帳戶物件檢視者權限:
gsutil iam ch serviceAccount:<SECOPS_SERVICE_ACCOUNT_EMAIL>:objectViewer \ gs://gcp-swp-logs
驗證權限
如要確認權限是否已正確授予,請按照下列步驟操作:
gcloud storage buckets get-iam-policy gs://gcp-swp-logs \ --flatten="bindings[].members" \ --filter="bindings.role:roles/storage.objectViewer"
輸出內容應會顯示 Google SecOps 服務帳戶電子郵件地址。
UDM 對應表
| 記錄欄位 | UDM 對應 | 邏輯 |
|---|---|---|
| httpRequest.latency、jsonPayload.@type、logName | additional.fields | 與 latency_label (鍵為「HTTPRequest Latency」,值來自延遲時間)、type_label (鍵為「Log Type」,值來自 @type)、logname (鍵為「Log Name」,值來自 logName) 合併 |
| receiveTimestamp | metadata.collected_timestamp | 剖析為 RFC3339 時間戳記 |
| metadata.event_type | 如果 has_principal 為 true、has_target 為 true,且通訊協定符合 (?i)http,則設為 NETWORK_HTTP;如果 has_principal 為 true、has_target 為 true,且 network != "",則設為 NETWORK_CONNECTION;如果 has_principal 為 true、has_target 為 true,且 has_principal_user 為 true,則設為 USER_LOGIN;如果 has_principal 為 true,則設為 STATUS_UPDATE;否則設為 GENERIC_EVENT | |
| insertId | metadata.product_log_id | 直接複製值 |
| httpRequest.protocol | network.application_protocol | 使用 grok 模式 %{DATA:protocol}/%{INT:http_version} 擷取的通訊協定,如果位於 ["HTTP","HTTPS"] 中,則會設定 |
| httpRequest.protocol | network.application_protocol_version | 使用 grok 模式 %{DATA:protocol}/%{INT:http_version} 擷取 http_version |
| httpRequest.requestMethod | network.http.method | 直接複製值 |
| httpRequest.userAgent | network.http.parsed_user_agent | 直接複製值,並轉換為已剖析的 useragent |
| httpRequest.status | network.http.response_code | 轉換為字串,然後轉換為整數 |
| httpRequest.userAgent | network.http.user_agent | 直接複製值 |
| httpRequest.responseSize | network.received_bytes | 直接複製值,並轉換為 uinteger |
| httpRequest.requestSize | network.sent_bytes | 直接複製值,並轉換為 uinteger |
| httpRequest.serverIp | principal.asset.ip | 使用 grok 模式 %{IP:server_ip} 擷取 IP,如果不是空白就設定 |
| httpRequest.serverIp | principal.ip | 使用 grok 模式 %{IP:server_ip} 擷取 IP,如果不是空白就設定 |
| jsonPayload.enforcedGatewaySecurityPolicy.matchedRules[].action | security_result.action | 如果 rule.action == ALLOW,則設為 ALLOW;如果 rule.action == DENIED,則設為 BLOCK |
| jsonPayload.enforcedGatewaySecurityPolicy.matchedRules[].action | security_result.action_details | 直接從 rule.action 複製的值 |
| jsonPayload.enforcedGatewaySecurityPolicy.requestWasTlsIntercepted、resource.labels.gateway_name、resource.labels.resource_container、resource.labels.gateway_type | security_result.detection_fields | 與 tls_intercepted_label (鍵「requestWasTlsIntercepted」,值來自 requestWasTlsIntercepted)、gateway_name_label (鍵「gateway-name」,值來自 gateway_name)、resource_container_label (鍵「resource_container」,值來自 resource_container)、gateway_type_label (鍵「gateway-type」,值來自 gateway_type) 合併 |
| jsonPayload.enforcedGatewaySecurityPolicy.matchedRules[].name | security_result.rule_name | 直接複製值 |
| 嚴重性 | security_result.severity | 如果嚴重程度為 CRITICAL,則設為 CRITICAL;如果嚴重程度為 ERROR,則設為 ERROR;如果嚴重程度為 ALERT 或 EMERGENCY,則設為 HIGH;如果嚴重程度為 INFO 或 NOTICE,則設為 INFORMATIONAL;如果嚴重程度為 DEBUG,則設為 LOW;如果嚴重程度為 WARNING,則設為 MEDIUM;否則設為 UNKNOWN_SEVERITY |
| jsonPayload.enforcedGatewaySecurityPolicy.hostname | target.asset.hostname | 直接複製值 |
| httpRequest.remoteIp | target.asset.ip | 使用 grok 模式 %{IP:remote_ip} 擷取的 IP,如果不是空白,則會設定 |
| jsonPayload.enforcedGatewaySecurityPolicy.hostname | target.hostname | 直接複製值 |
| httpRequest.remoteIp | target.ip | 使用 grok 模式 %{IP:remote_ip} 擷取的 IP,如果不是空白,則會設定 |
| resource.labels.location | target.resource.attribute.cloud.availability_zone | 直接複製值 |
| resource.labels.network_name、resource.type | target.resource.attribute.labels | 與 rc_network_name_label (鍵為「rc_network_name」,值來自 network_name)、resource_type (鍵為「Resource Type」,值來自 resource.type) 合併 |
| httpRequest.requestUrl | target.url | 直接複製值 |
還有其他問題嗎?向社群成員和 Google SecOps 專業人員尋求答案。