Google Cloud 中的安全性記錄檔分析

Last reviewed 2024-05-21 UTC

本指南說明安全性從業人員如何導入 Google Cloud記錄檔,以供安全性分析使用。執行安全分析,協助貴機構防範、偵測及回應惡意軟體、網路釣魚、勒索軟體和設定不當的資產等威脅。

本指南說明如何執行下列操作:

本指南中的資訊屬於 Google Cloud Autonomic Security Operations 的一部分,其中包含工程師主導的偵測與回應做法轉型,以及安全分析,以改善威脅偵測能力。

在本指南中,記錄檔會提供要分析的資料來源。不過,您可以將本指南的概念套用至其他與安全性相關的補充資料,例如 Google Cloud中的Security Command Center 安全性發現項目。Security Command Center Premium 提供的清單中,列出定期更新的受控偵測器,可近乎即時地找出系統中的威脅、安全漏洞和錯誤設定。您可以根據本指南的說明,分析 Security Command Center 提供的這些信號,並與安全分析工具中擷取的記錄建立關聯,從更廣泛的角度瞭解潛在的資安威脅。

下圖顯示安全性資料來源、安全性分析工具和 CSA 查詢如何協同運作。

安全性分析工具和內容。

這張圖表首先列出以下安全性資料來源:Cloud Logging 的記錄、Cloud Asset Inventory 的資產變更,以及 Security Command Center 的安全性發現項目。接著,圖表會顯示這些安全性資料來源會路由至您選擇的安全性分析工具:Cloud Logging 中的 Log Analytics、BigQuery、Google Security Operations 或第三方 SIEM。最後,圖表顯示如何使用 CSA 查詢與分析工具,分析匯總的安全性資料。

安全性記錄分析工作流程

本節說明如何在Google Cloud中設定安全性記錄分析。工作流程包含下圖所示的三個步驟,並在下文中加以說明:

設定安全性記錄分析的三個步驟:(1) 啟用記錄、(2) 轉送記錄,以及 (3) 分析記錄。

  • 啟用記錄:Google Cloud提供多種安全性記錄。每個記錄都包含不同的資訊,可用於回答特定安全性問題。根據預設,系統會啟用管理員活動稽核記錄等部分記錄;其他記錄則需要手動啟用,因為這些記錄會在 Cloud Logging 中產生額外的擷取費用。因此,工作流程的第一步是優先處理與安全性分析需求最相關的安全性記錄,並個別啟用這些特定記錄。

    為協助您評估記錄的資訊可視性和威脅偵測涵蓋範圍,本指南提供記錄範圍工具。這項工具會將每個記錄對應至 MITRE ATT&CK® 企業版矩陣中的相關威脅策略和技術。這項工具也會將 Security Command Center 中的 Event Threat Detection 規則對應至依賴的記錄檔。無論您使用哪種數據分析工具,都可以使用記錄範圍工具評估記錄。

  • 轉送記錄:在識別並啟用要分析的記錄後,下一步就是轉送及匯總機構的記錄,包括任何包含的資料夾、專案和帳單帳戶。記錄轉送方式取決於您使用的數據分析工具。

    本指南將說明常見的記錄路由目的地,並說明如何使用 Cloud Logging 匯總接收器,將全公司記錄檔路由至 Cloud Logging 記錄值區或 BigQuery 資料集,具體取決於您選擇使用 Log Analytics 或 BigQuery 進行分析。

  • 分析記錄:將記錄導向分析工具後,下一步就是分析這些記錄,找出任何潛在的安全威脅。分析記錄的方式取決於您使用的分析工具。如果您使用 Log Analytics 或 BigQuery,可以使用 SQL 查詢來分析記錄。如果您使用 Google 安全作業服務,可以使用 YARA-L 規則分析記錄。如果您使用第三方 SIEM 工具,請使用該工具指定的查詢語言。

    本指南提供可用於分析 Log Analytics 或 BigQuery 記錄檔的 SQL 查詢。本指南提供的 SQL 查詢來自 Community Security Analytics (CSA) 專案。CSA 是一套開放原始碼基礎安全分析工具,旨在提供預先建構的查詢和規則,讓您重複使用這些工具來分析 Google Cloud 記錄。

以下各節將詳細說明如何設定及套用安全性記錄分析工作流程的各個步驟。

啟用記錄功能

啟用記錄的程序包含下列步驟:

  1. 使用本指南中的記錄範圍工具,找出所需的記錄。
  2. 記錄記錄範圍工具產生的記錄篩選器,以便日後設定記錄接收器時使用。
  3. 為每個已識別的記錄類型或 Google Cloud 服務啟用記錄功能。視服務而定,您可能還需要啟用對應的資料存取稽核記錄,請參閱本節後續的詳細說明。

使用記錄範圍工具找出記錄

如要找出符合安全性和法規遵循需求的記錄,您可以使用本節所述的記錄範圍工具。這項工具提供互動式表格,列出各項安全相關記錄,包括Google Cloud Cloud 稽核記錄、資料存取透明化控管機制記錄、網路記錄和多個平台記錄。這項工具會將每個記錄類型對應至下列區域:

記錄範圍工具也會產生記錄篩選器,該篩選器會在表格後方立即顯示。找出所需的記錄後,請在工具中選取這些記錄,自動更新記錄篩選器。

以下簡短程序說明如何使用記錄範圍工具:

  • 如要在記錄範圍工具中選取或移除記錄,請按一下記錄名稱旁的切換按鈕。
  • 如要選取或移除所有記錄,請按一下「記錄類型」標題旁的切換鈕。
  • 如要查看各個記錄類型可監控哪些 MITRE ATT&CK 技術,請按一下「MITRE ATT&CK 戰術和技術」標題旁的

記錄範圍界定工具

記錄記錄檔篩選器

記錄範圍工具自動產生的記錄篩選器,包含您在工具中選取的所有記錄。您可以直接使用篩選器,也可以視需求進一步調整記錄篩選器。舉例來說,您只能在一個或多個特定專案中加入 (或排除) 資源。建立符合記錄需求的記錄篩選器後,您需要儲存篩選器,以便在轉送記錄時使用。舉例來說,您可以將篩選器儲存在文字編輯器中,或儲存在環境變數中,如下所示:

  1. 在工具後方的「自動產生的記錄篩選器」專區中,複製記錄篩選器的程式碼。
  2. 選用步驟:編輯複製的程式碼,以便精進篩選器。
  3. Cloud Shell 中,建立用於儲存記錄篩選器的變數:

    export LOG_FILTER='LOG_FILTER'
    

    LOG_FILTER 替換為記錄篩選器的程式碼。

啟用服務專屬平台記錄

針對您在記錄範圍工具中選取的每個平台記錄,必須逐項服務啟用這些記錄 (通常是在資源層級)。舉例來說,Cloud DNS 記錄會在 VPC 網路層級啟用。同樣地,系統會在子網路層級為子網路中的所有 VM 啟用虛擬私有雲流量記錄,並在個別防火牆規則層級啟用防火牆規則記錄的記錄。

每個平台記錄都有專屬的啟用記錄功能說明。不過,您可以使用記錄範圍工具,快速開啟各個平台記錄的相關操作說明。

如要瞭解如何啟用特定平台記錄檔的記錄功能,請按照下列步驟操作:

  1. 在記錄範圍工具中,找出要啟用的平台記錄。
  2. 在「預設啟用」欄中,按一下對應該記錄的「啟用」連結。點選連結即可查看詳細操作說明,瞭解如何啟用該服務的記錄功能。

啟用資料存取稽核記錄

如您在記錄範圍工具中看到的,Cloud 稽核記錄中的資料存取稽核記錄可提供廣泛的威脅偵測範圍。不過,這些檔案的數量可能相當龐大。因此,啟用這些資料存取稽核記錄可能會產生額外費用,用於擷取、儲存、匯出及處理這些記錄。本節將說明如何啟用這些記錄,並提供一些最佳做法,協助您在價值和成本之間取得平衡。

「資料存取」稽核記錄 (BigQuery 除外) 預設為停用。如要為 Google Cloud BigQuery 以外的服務設定資料存取稽核記錄,您必須明確啟用這些記錄,方法是使用 Google Cloud 控制台使用 Google Cloud CLI 編輯身分與存取權管理 (IAM) 政策物件。啟用資料存取稽核記錄後,您也可以設定要記錄哪些類型的作業。資料存取稽核記錄有三種類型:

  • ADMIN_READ:記錄讀取中繼資料或設定資訊的作業。
  • DATA_READ:記錄讀取使用者所提供資料的作業。
  • DATA_WRITE:記錄寫入使用者所提供資料的作業。

請注意,您無法設定 ADMIN_WRITE 作業的記錄功能,因為這類作業會寫入中繼資料或設定資訊。ADMIN_WRITE 作業會納入 Cloud 稽核記錄的管理員活動稽核記錄,因此無法停用。

管理資料存取稽核記錄的數量

啟用資料存取稽核記錄時,目標是盡可能提高其安全性可視度,同時限制其成本和管理額外負擔。為協助您達成這個目標,建議您採取下列做法,篩除價值低且數量龐大的記錄:

  • 優先處理相關服務,例如代管機密工作負載、金鑰和資料的服務。如需優先處理的服務特定範例,請參閱「資料存取稽核記錄設定範例」。
  • 將相關專案列為優先順序,例如託管實際工作負載的專案,而非託管開發人員和測試環境的專案。如要篩除特定專案的所有記錄,請將下列運算式新增至接收器的記錄篩選器。將 PROJECT_ID 替換為您要篩除所有記錄的專案 ID:

    專案 記錄檔篩選器運算式
    排除特定專案中的所有記錄
    NOT logName =~ "^projects/PROJECT_ID"
        
  • 為少數記錄作業的資料存取作業子集合排序,例如 ADMIN_READDATA_READDATA_WRITE。舉例來說,Cloud DNS 等部分服務會寫入所有三種作業,但您只能為 ADMIN_READ 作業啟用記錄功能。設定這三種資料存取作業類型後,您可能會想排除特定的大量作業。您可以修改接收器的記錄篩選器,排除這些大量操作。舉例來說,您決定啟用完整的資料存取稽核記錄功能,包括對部分重要儲存空間服務執行 DATA_READ 作業。如要排除此情況下特定的高流量資料讀取作業,您可以將下列建議的記錄檔篩選器運算式新增至接收器的記錄檔篩選器:

    服務 記錄檔篩選器運算式
    從 Cloud Storage 排除大量記錄檔
    NOT (resource.type="gcs_bucket" AND
        (protoPayload.methodName="storage.buckets.get" OR
        protoPayload.methodName="storage.buckets.list")) 
    排除 Cloud SQL 中的大量記錄檔
    NOT (resource.type="cloudsql_database" AND
        protoPayload.request.cmd="select") 
  • 優先考量相關資源,例如用於代管最機密工作負載和資料的資源。您可以根據資源處理的資料價值和安全風險 (例如是否可供外部存取) 對資源進行分類。雖然每項服務都會啟用資料存取稽核記錄,但您可以透過記錄篩選器篩除特定資源或資源類型。

  • 排除特定主體,不記錄其資料存取。例如,您可以使內部測試帳戶不必記錄其作業。詳情請參閱資料存取稽核記錄說明文件中的「設定豁免條款」一節。

資料存取稽核記錄設定範例

下表提供資料存取稽核記錄的基準設定,您可以將其用於 Google Cloud 專案,以便限制記錄量,同時獲得寶貴的安全性資訊:

級別 服務 資料存取稽核記錄類型 MITRE ATT&CK 戰術
驗證與授權服務 IAM
Identity-Aware Proxy (IAP)1
Cloud KMS
Secret Manager
Resource Manager
ADMIN_READ
DATA_READ
探索
憑證存取
提權
儲存服務 BigQuery (預設為啟用)
Cloud Storage1, 2
DATA_READ
DATA_WRITE
收集
資料竊取
基礎架構服務 Compute Engine
機構政策
ADMIN_READ 探索

1 當 IAP 保護的網頁資源或 Cloud Storage 物件有大量流量時,啟用 IAP 或 Cloud Storage 的資料存取稽核記錄,可能會產生大量記錄。

2 啟用 Cloud Storage 的資料存取稽核記錄功能,可能會導致無法使用經過驗證的瀏覽器下載作業存取非公開物件。如需更多詳細資訊和建議的解決方法,請參閱 Cloud Storage 疑難排解指南

在範例設定中,請注意服務如何根據基礎資料、中繼資料或設定,依敏感度層級分組。這些層級說明資料存取稽核記錄的下列建議精細程度:

  • 驗證和授權服務:對於這類服務,我們建議您稽核所有資料存取作業。這類稽核可協助您監控敏感金鑰、密鑰和 IAM 政策的存取權。監控這項存取權可能有助於偵測 MITRE ATT&CK 策略,例如探索憑證存取權限提升
  • 儲存空間服務:對於這類服務,我們建議您稽核涉及使用者提供資料的資料存取作業。這類稽核作業有助於監控貴重和機密資料的存取權。監控這項存取權可能有助於偵測 MITRE ATT&CK 戰術,例如針對資料進行收集竊取
  • 基礎架構服務:對於這類服務,我們建議您稽核涉及中繼資料或設定資訊的資料存取作業。這類稽核作業可協助您監控基礎架構設定的掃描作業。監控這項存取權可能有助於偵測 MITRE ATT&CK 戰術,例如針對工作負載執行Discovery

路線記錄

識別並啟用記錄後,下一步就是將記錄路由至單一目的地。轉送目的地、路徑和複雜度會因您使用的分析工具而異,如下圖所示。

記錄轉送方式:使用記錄接收器將記錄轉送至 BigQuery 和 Log Analytics、使用記錄接收器和 Pub/Sub 將記錄轉送至第三方 SIEM,以及使用直接擷取功能將記錄轉送至 Google Security Operations。

下圖顯示以下路由選項:

  • 如果您使用 Log Analytics,就需要匯總接收端,將貴 Google Cloud 組織的記錄檔匯總到單一 Cloud Logging 值區。

  • 如果您使用 BigQuery,就需要匯總資料接收端,將機構組織內的記錄檔匯總到單一 BigQuery 資料集。 Google Cloud

  • 如果您使用 Google Security Operations,且這個預先定義的記錄子集符合您的安全分析需求,您可以使用內建的 Google Security Operations 擷取功能,自動將這些記錄匯入 Google Security Operations 帳戶。您也可以查看記錄範圍工具的「可直接匯出至 Google Security Operations」欄,查看這組預先定義的記錄。如要進一步瞭解如何匯出這些預先定義的記錄,請參閱「將記錄匯入 Google Cloud Google Security Operations」

  • 如果您使用 BigQuery 或第三方 SIEM,或是想要將擴充的記錄集匯出至 Google Security Operations,則圖表顯示在啟用記錄和分析記錄之間,需要額外執行一個步驟。這個額外步驟包括設定匯總接收器,以便適當地轉送所選記錄。如果您使用 BigQuery,只要透過這個接收端將記錄轉送至 BigQuery,如果您使用的是第三方 SIEM,則必須先讓匯入器在 Pub/Sub 或 Cloud Storage 中匯總所選的記錄,才能將記錄拉入分析工具。

本指南未涵蓋 Google Security Operations 和第三方 SIEM 的路由選項。不過,以下各節會提供將記錄檔轉送至 Log Analytics 或 BigQuery 的詳細步驟:

  1. 設定單一目的地
  2. 建立匯總記錄接收器。
  3. 授予接收器存取權。
  4. 設定對目的地的讀取存取權。
  5. 確認記錄已順利傳送至目的地。

設定單一目的地

記錄檔分析

  1. 在您要匯入記錄檔的 Google Cloud 專案中,開啟 Google Cloud 控制台。

    前往 Google Cloud 控制台

  2. Cloud Shell 終端機中,執行下列 gcloud 指令來建立記錄值區:

    gcloud logging buckets create BUCKET_NAME \
      --location=BUCKET_LOCATION \
      --project=PROJECT_ID
    

    更改下列內容:

    • PROJECT_ID:匯總記錄的儲存位置 Google Cloud 專案 ID。
    • BUCKET_NAME:新的記錄值區名稱。
    • BUCKET_LOCATION:新記錄值區的地理位置。支援的位置為 globaluseu。如要進一步瞭解這些儲存空間區域,請參閱「支援的區域」。如果您未指定位置,系統會使用 global 區域,也就是說,記錄可以實際位於任何區域。

  3. 確認值區是否已建立:

    gcloud logging buckets list --project=PROJECT_ID
    
  4. (選用) 設定值區中記錄檔的保留期限。以下範例會將值區中記錄檔的保留期限延長至 365 天:

    gcloud logging buckets update BUCKET_NAME \
      --location=BUCKET_LOCATION \
      --project=PROJECT_ID \
      --retention-days=365
    
  5. 按照這些步驟升級新 bucket,以便使用 Log Analytics。

BigQuery

  1. 在您要匯入記錄檔的 Google Cloud 專案中,開啟 Google Cloud 控制台。

    前往 Google Cloud 控制台

  2. Cloud Shell 終端機中,執行下列 bq mk 指令建立資料集:

    bq --location=DATASET_LOCATION mk \
        --dataset \
        --default_partition_expiration=PARTITION_EXPIRATION \
        PROJECT_ID:DATASET_ID
    

    更改下列內容:

    • PROJECT_ID:匯總記錄的儲存位置 ( Google Cloud 專案) ID。
    • DATASET_ID:新 BigQuery 資料集的 ID。
    • DATASET_LOCATION:資料集的地理位置。資料集在建立之後,該位置就無法改變。

    • PARTITION_EXPIRATION:由記錄匯入端建立的分區資料表中分區的預設生命週期 (以秒為單位)。您將在下一節中設定記錄接收器。您設定的記錄匯入會使用分區資料表,這些資料表會根據記錄項目的時間戳記,按天分區。分區 (包括相關聯的記錄項目) 會在分區日期的 PARTITION_EXPIRATION 秒後刪除。

建立匯總記錄檔接收器

您可以在機構層級建立匯總接收器,將貴機構的記錄轉送至目的地。如要納入記錄範圍工具中選取的所有記錄,請使用記錄範圍工具產生的記錄篩選器設定接收器。

記錄檔分析

  1. Cloud Shell 終端機中,執行下列 gcloud 指令,在組織層級建立匯入集區:

    gcloud logging sinks create SINK_NAME \
      logging.googleapis.com/projects/PROJECT_ID/locations/BUCKET_LOCATION/buckets/BUCKET_NAME \
      --log-filter="LOG_FILTER" \
      --organization=ORGANIZATION_ID \
      --include-children
    

    更改下列內容:

    • SINK_NAME:路由記錄的接收器名稱。
    • PROJECT_ID:匯總記錄的儲存位置 ( Google Cloud 專案) ID。
    • BUCKET_LOCATION:您為記錄儲存空間建立的記錄值區位置。
    • BUCKET_NAME:您為記錄儲存空間建立的記錄值區名稱。
    • LOG_FILTER:您從記錄範圍設定工具儲存的記錄篩選器。
    • ORGANIZATION_ID:機構的資源 ID。

    --include-children 標記非常重要,因為這樣才能納入貴機構內所有Google Cloud 專案的記錄。詳情請參閱「彙整及路由組織層級記錄至支援的目的地」。

  2. 確認已建立接收器:

    gcloud logging sinks list --organization=ORGANIZATION_ID
    
  3. 取得與您剛剛建立的接收器相關聯的服務帳戶名稱:

    gcloud logging sinks describe SINK_NAME --organization=ORGANIZATION_ID
    

    輸出看起來類似以下內容:

    writerIdentity: serviceAccount:p1234567890-12345@logging-o1234567890.iam.gserviceaccount.com`
    
  4. 複製 writerIdentity 的整個字串,開頭為 serviceAccount:。這個 ID 是接收器的服務帳戶。除非您將記錄值區的寫入存取權授予這個服務帳戶,否則無法從這個接收器路由記錄。您會在下一節中授予接收器的寫入者身分寫入權限。

BigQuery

  1. Cloud Shell 終端機中執行下列 gcloud 指令,在組織層級建立匯入集區:

    gcloud logging sinks create SINK_NAME \
      bigquery.googleapis.com/projects/PROJECT_ID/datasets/DATASET_ID \
      --log-filter="LOG_FILTER" \
      --organization=ORGANIZATION_ID \
      --use-partitioned-tables \
      --include-children
    

    更改下列內容:

    • SINK_NAME:路由記錄的接收器名稱。
    • PROJECT_ID:您要匯入記錄的 Google Cloud 專案 ID。
    • DATASET_ID:您建立的 BigQuery 資料集 ID。
    • LOG_FILTER:您從記錄範圍設定工具儲存的記錄篩選器。
    • ORGANIZATION_ID:機構的資源 ID。

    --include-children 標記非常重要,因為這樣才能納入貴機構內所有Google Cloud 專案的記錄。詳情請參閱「彙整及路由組織層級記錄至支援的目的地」。

    --use-partitioned-tables 標記非常重要,因為這樣系統就能根據記錄項目的 timestamp 欄位,將資料依天分區。這可簡化資料查詢作業,並減少查詢掃描的資料量,有助於降低查詢成本。分區資料表的另一個優點是,您可以在資料集層級設定預設分區到期時間,以符合記錄保留規定。您在上一節建立資料集目的地時,已設定預設分區到期時間。您也可以選擇在個別資料表層級設定分區到期時間,根據記錄類型提供精細的資料保留控制項。

  2. 確認已建立接收器:

    gcloud logging sinks list --organization=ORGANIZATION_ID
    
  3. 取得與您剛剛建立的接收器相關聯的服務帳戶名稱:

    gcloud logging sinks describe SINK_NAME --organization=ORGANIZATION_ID
    

    輸出看起來類似以下內容:

    writerIdentity: serviceAccount:p1234567890-12345@logging-o1234567890.iam.gserviceaccount.com`
    
  4. 複製 writerIdentity 的整個字串,開頭為 serviceAccount:。這個 ID 是接收器的服務帳戶。除非您將 BigQuery 資料集的寫入存取權授予這個服務帳戶,否則無法從這個接收器路由記錄。您將在下一節中授予接收端的寫入身分存取權。

授予接收器存取權

建立記錄匯入後,您必須授予匯入的寫入權限,無論是記錄值區或 BigQuery 資料集皆然。

記錄檔分析

如要將權限新增至接收端的服務帳戶,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中,前往「IAM」頁面:

    前往「身分與存取權管理」頁面

  2. 請確認您已選取目的地 Google Cloud 專案,該專案包含您為集中記錄儲存空間建立的記錄檔值區。

  3. 按一下「授予存取權」

  4. 在「新增主體」欄位中,輸入匯出服務帳戶,但不要加上 serviceAccount: 前置字串。請回想一下,這個身分識別資訊來自您在建立匯流程後,在上一節中擷取的 writerIdentity 欄位。

  5. 在「Select a role」下拉式選單中,選取「Logs Bucket Writer」

  6. 按一下「新增 IAM 限制條件」,將服務帳戶的存取權限制在您建立的記錄值區。

  7. 輸入條件的「標題」和「說明」

  8. 在「Condition type」下拉式選單中,依序選取「Resource」 >「Name」

  9. 在「運算子」下拉式選單中,選取「結尾為」

  10. 在「Value」欄位中輸入值區的位置和名稱,如下所示:

    locations/BUCKET_LOCATION/buckets/BUCKET_NAME
    
  11. 按一下「儲存」即可加入條件。

  12. 按一下「儲存」即可設定權限。

BigQuery

如要將權限新增至接收端的服務帳戶,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「BigQuery」頁面:

    前往 BigQuery

  2. 開啟您用於集中記錄檔儲存空間而建立的 BigQuery 資料集。

  3. 在「資料集資訊」分頁中,按一下「分享」 下拉式選單,然後點選「權限」

  4. 在「資料集權限」側邊面板中,按一下「新增主體」

  5. 在「新增主體」欄位中,輸入匯出服務帳戶,但不要加上 serviceAccount: 前置字串。請回想一下,這個身分識別資訊來自您在建立匯流程後,在上一節中擷取的 writerIdentity 欄位。

  6. 在「角色」下拉式選單中,選取「BigQuery 資料編輯者」

  7. 按一下 [儲存]

授予接收器存取權後,記錄項目就會開始填入接收器目的地:記錄桶或 BigQuery 資料集。

設定對目的地的讀取權限

記錄接收器會將整個機構的記錄轉送至單一目的地,因此您可以搜尋所有這些記錄。使用 IAM 權限管理權限,並視需要授予存取權。

記錄檔分析

如要授予查看及查詢新記錄值區中的記錄的權限,請按照下列步驟操作。

  1. 在 Google Cloud 控制台中,前往「IAM」頁面:

    前往「身分與存取權管理」頁面

    請確認您已選取用來匯總記錄檔的 Google Cloud 專案。

  2. 按一下「新增」圖示

  3. 在「新增主體」欄位中新增電子郵件帳戶。

  4. 在「請選擇角色」下拉式選單中,選取「Logs Views Accessor」

    這個角色可讓新加入的主體取得 Google Cloud 專案中任何值區的所有檢視畫面的讀取權限。如要限制使用者的存取權,請新增條件,讓使用者只能讀取新值區。

    1. 按一下「新增條件」

    2. 輸入條件的「標題」和「說明」

    3. 在「Condition type」下拉式選單中,依序選取「Resource」 >「Name」

    4. 在「運算子」下拉式選單中,選取「結尾為」

    5. 在「Value」欄位中,輸入值區的位置和名稱,以及預設的記錄檢視畫面 _AllLogs,如下所示:

      locations/BUCKET_LOCATION/buckets/BUCKET_NAME/views/_AllLogs
      
    6. 按一下「儲存」即可加入條件。

  5. 按一下「儲存」即可設定權限。

BigQuery

如要授予查看及查詢 BigQuery 資料集中記錄的權限,請按照 BigQuery 說明文件「授予資料集存取權」一節中的步驟操作。

確認記錄檔已順利轉送至目的地

記錄檔分析

將記錄檔轉送至已升級至 Log Analytics 的記錄檔值區後,您就能透過單一記錄檔檢視畫面查看及查詢所有記錄檔項目,並為所有記錄檔類型提供統一結構定義。請按照下列步驟驗證記錄是否已正確轉送。

  1. 在 Google Cloud 控制台中,前往「Log Analytics」(記錄檔分析) 頁面:

    前往「Log Analytics」

    請確認您已選取用來匯總記錄檔的 Google Cloud 專案。

  2. 按一下「Log Views」分頁標籤。

  3. 如果您尚未展開所建立的記錄桶 (即 BUCKET_NAME) 下的記錄檢視表,請展開該記錄桶。

  4. 選取預設記錄檢視畫面 _AllLogs。您現在可以在右側面板中檢查完整的記錄架構,如以下螢幕截圖所示:

    選取 cloudaudit_googleapis_com_data_access 表的 Log Analytics。

  5. 按一下「_AllLogs」旁的「查詢」。這會在查詢編輯器中填入 SQL 範例查詢,用於擷取最近路由的記錄項目。

  6. 按一下「執行查詢」,即可查看最近轉送的記錄項目。

視 Google Cloud 機構專案的活動程度而定,您可能需要等待幾分鐘,讓系統產生部分記錄,然後將其路由至記錄值區。

BigQuery

將記錄導向 BigQuery 資料集時,Cloud Logging 會建立 BigQuery 資料表,用於保留記錄項目,如下圖所示:

選取 cloudaudit_googleapis_com_data_access 資料表的 BigQuery Explorer。

這張螢幕截圖顯示 Cloud Logging 如何根據記錄項目所屬記錄的名稱,為每個 BigQuery 表格命名。舉例來說,螢幕截圖中選取的 cloudaudit_googleapis_com_data_access 表格包含資料存取稽核記錄,其記錄 ID 為 cloudaudit.googleapis.com%2Fdata_access。除了根據對應的記錄項目命名之外,每個資料表也會根據每個記錄項目的時間戳記進行分割。

視貴機構 Google Cloud 專案的活動量而定,您可能需要等待幾分鐘,系統才會產生部分記錄,然後將這些記錄路由至 BigQuery 資料集。

分析記錄檔

您可以對稽核記錄和平台記錄執行各式各樣的查詢。以下清單提供一組安全性問題範例,您可以根據自己的記錄來提出這些問題。針對清單中的每個問題,對應的 CSA 查詢有兩個版本:一個用於 Log Analytics,另一個用於 BigQuery。請使用與先前設定的接收器目的地相符的查詢版本。

記錄檔分析

使用下列任何 SQL 查詢之前,請將 MY_PROJECT_ID 替換為您建立記錄值區的 Google Cloud 專案 ID (即 PROJECT_ID)),並將 MY_DATASET_ID 替換為記錄值區的地區和名稱 (即 BUCKET_LOCATION.BUCKET_NAME)。

前往「Log Analytics」

BigQuery

使用下列任一 SQL 查詢前,請將 MY_PROJECT_ID 替換為您建立 BigQuery 資料集的 Google Cloud 專案 ID (即 PROJECT_ID)),並將 MY_DATASET_ID 替換為該資料集的名稱 (即 DATASET_ID)。

前往 BigQuery

  1. 登入和存取權問題
  2. 權限變更問題
  3. 佈建活動相關問題
  4. 工作負載使用問題
  5. 資料存取權問題
  6. 網路安全問題

登入和存取權問題

這些範例查詢會執行分析,以偵測可疑的登入嘗試或對 Google Cloud 環境的初始存取嘗試。

Google Workspace 是否標示任何可疑的登入嘗試?

透過搜尋 Google Workspace 登入稽核的一部分 Cloud Identity 記錄,以下查詢可偵測 Google Workspace 標示的可疑登入嘗試。這類登入嘗試可能來自 Google Cloud 控制台、管理控制台或 gcloud CLI。

記錄檔分析


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.method_name, parameter
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS parameter
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND proto_payload.audit_log IS NOT NULL
  AND proto_payload.audit_log.service_name = "login.googleapis.com"
  AND proto_payload.audit_log.method_name = "google.login.LoginService.loginSuccess"
  AND JSON_VALUE(parameter.name) = "is_suspicious"
  AND JSON_VALUE(parameter.boolValue) = "true"

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`,
  UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS parameter
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND protopayload_auditlog.metadataJson IS NOT NULL
  AND protopayload_auditlog.serviceName = "login.googleapis.com"
  AND protopayload_auditlog.methodName = "google.login.LoginService.loginSuccess"
  AND JSON_VALUE(parameter, '$.name') = "is_suspicious"
  AND JSON_VALUE(parameter, '$.boolValue') = "true"

是否有任何使用者身分登入失敗的情況?

透過搜尋 Google Workspace 登入稽核的 Cloud Identity 記錄,以下查詢可偵測過去 24 小時內連續登入失敗三次以上的使用者。

記錄檔分析


SELECT
  proto_payload.audit_log.authentication_info.principal_email,
  MIN(timestamp) AS earliest,
  MAX(timestamp) AS latest,
  count(*) AS attempts
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
  AND proto_payload.audit_log.service_name = "login.googleapis.com"
  AND proto_payload.audit_log.method_name = "google.login.LoginService.loginFailure"
GROUP BY
  1
HAVING
  attempts >= 3

BigQuery


SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  MIN(timestamp) AS earliest,
  MAX(timestamp) AS latest,
  count(*) AS attempts
FROM
 `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
  AND protopayload_auditlog.serviceName="login.googleapis.com"
  AND protopayload_auditlog.methodName="google.login.LoginService.loginFailure"
GROUP BY
  1
HAVING
  attempts >= 3

是否有任何違反 VPC Service Controls 的存取嘗試?

透過分析 Cloud 稽核記錄中的「Policy Denied」稽核記錄,以下查詢可偵測到 VPC Service Controls 封鎖的存取嘗試。任何查詢結果都可能代表潛在的惡意活動,例如使用遭竊憑證從未經授權的網路進行存取嘗試。

記錄檔分析


SELECT
  timestamp,
  log_name,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  JSON_VALUE(proto_payload.audit_log.metadata.violationReason) as violationReason, 
  IF(JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations) IS NULL, 'ingress', 'egress') AS violationType,
  COALESCE(
    JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations[0].targetResource),
    JSON_VALUE(proto_payload.audit_log.metadata.egressViolations[0].targetResource)
  ) AS  targetResource,
  COALESCE(
    JSON_VALUE(proto_payload.audit_log.metadata.ingressViolations[0].servicePerimeter),
    JSON_VALUE(proto_payload.audit_log.metadata.egressViolations[0].servicePerimeter)
  ) AS  servicePerimeter
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND proto_payload.audit_log IS NOT NULL
  AND JSON_VALUE(proto_payload.audit_log.metadata, '$."@type"') = 'type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata'
ORDER BY
  timestamp DESC
LIMIT 1000

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  JSON_VALUE(protopayload_auditlog.metadataJson, '$.violationReason') as violationReason, 
  IF(JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations') IS NULL, 'ingress', 'egress') AS violationType,
  COALESCE(
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations[0].targetResource'),
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.egressViolations[0].targetResource')
  ) AS  targetResource,
  COALESCE(
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.ingressViolations[0].servicePerimeter'),
    JSON_VALUE(protopayload_auditlog.metadataJson, '$.egressViolations[0].servicePerimeter')
  ) AS  servicePerimeter
FROM
 `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_policy`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 400 DAY)
  AND JSON_VALUE(protopayload_auditlog.metadataJson, '$."@type"') = 'type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata'
ORDER BY
  timestamp DESC
LIMIT 1000

是否有任何存取嘗試違反 IAP 存取控管機制?

以下查詢會分析外部應用程式負載平衡器記錄,偵測 IAP 封鎖的存取嘗試。任何查詢結果都可能代表初始存取嘗試或漏洞利用嘗試。

記錄檔分析


SELECT
  timestamp,
  http_request.remote_ip,
  http_request.request_method,
  http_request.status,
  JSON_VALUE(resource.labels.backend_service_name) AS backend_service_name,
  http_request.request_url
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND JSON_VALUE(json_payload.statusDetails) = "handled_by_identity_aware_proxy"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  httpRequest.remoteIp,
  httpRequest.requestMethod,
  httpRequest.status,
  resource.labels.backend_service_name,
  httpRequest.requestUrl,
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].requests`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND jsonpayload_type_loadbalancerlogentry.statusdetails = "handled_by_identity_aware_proxy"
ORDER BY
  timestamp DESC

權限變更相關問題

這些範例查詢會針對變更權限的管理員活動執行分析,包括 IAM 政策、群組和群組成員、服務帳戶以及任何相關金鑰的變更。這類權限變更可能會提供對敏感資料或環境的高度存取權。

是否有任何使用者加入了高權限群組?

以下查詢會分析 Google Workspace 管理員稽核稽核記錄,偵測已加入查詢中列出的任何高權限群組的使用者。您可以使用查詢中的規則運算式,定義要監控的群組 (例如 admin@example.comprod@example.com)。任何查詢結果都可能表示有惡意或意外的權限提升行為。

記錄檔分析


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.resource_name,
  (SELECT JSON_VALUE(x.value)
   FROM UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS x
   WHERE JSON_VALUE(x.name) = "USER_EMAIL") AS user_email,
  (SELECT JSON_VALUE(x.value)
   FROM UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS x
   WHERE JSON_VALUE(x.name) = "GROUP_EMAIL") AS group_email,
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 120 DAY)
  AND proto_payload.audit_log.service_name = "admin.googleapis.com"
  AND proto_payload.audit_log.method_name = "google.admin.AdminService.addGroupMember"
  AND EXISTS(
    SELECT * FROM UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.metadata.event[0].parameter)) AS x
    WHERE
      JSON_VALUE(x.name) = "GROUP_EMAIL"
      AND REGEXP_CONTAINS(JSON_VALUE(x.value), r'(admin|prod).*') -- Update regexp with other sensitive groups if applicable
  )

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.methodName,
  protopayload_auditlog.resourceName,
  (SELECT JSON_VALUE(x, '$.value')
   FROM UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS x
   WHERE JSON_VALUE(x, '$.name') = "USER_EMAIL") AS userEmail,
  (SELECT JSON_VALUE(x, '$.value')
   FROM UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS x
   WHERE JSON_VALUE(x, '$.name') = "GROUP_EMAIL") AS groupEmail,
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 120 DAY)
  AND protopayload_auditlog.serviceName = "admin.googleapis.com"
  AND protopayload_auditlog.methodName = "google.admin.AdminService.addGroupMember"
  AND EXISTS(
    SELECT * FROM UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.metadataJson, '$.event[0].parameter')) AS x
    WHERE
      JSON_VALUE(x, '$.name') = 'GROUP_EMAIL'
      AND REGEXP_CONTAINS(JSON_VALUE(x, '$.value'), r'(admin|prod).*') -- Update regexp with other sensitive groups if applicable
  )

是否已授予服務帳戶任何權限?

透過分析 Cloud 稽核記錄中的管理員活動稽核記錄,以下查詢會偵測任何已透過服務帳戶授予任何主體的權限。例如,您可以授予模擬服務帳戶或建立服務帳戶金鑰的權限。任何查詢結果都可能表示有特權提升事件或憑證外洩風險。

記錄檔分析


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email as grantor,
  JSON_VALUE(bindingDelta.member) as grantee,
  JSON_VALUE(bindingDelta.role) as role,
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.service_data.policyDelta.bindingDeltas)) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 400 DAY)
  -- AND log_id = "cloudaudit.googleapis.com/activity"
  AND (
    (resource.type = "service_account"
    AND proto_payload.audit_log.method_name LIKE "google.iam.admin.%.SetIAMPolicy")
    OR
    (resource.type IN ("project", "folder", "organization")
    AND proto_payload.audit_log.method_name = "SetIamPolicy"
    AND JSON_VALUE(bindingDelta.role) LIKE "roles/iam.serviceAccount%")
  )
  AND JSON_VALUE(bindingDelta.action) = "ADD"
  -- Principal (grantee) exclusions
  AND JSON_VALUE(bindingDelta.member) NOT LIKE "%@example.com"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail as grantor,
  bindingDelta.member as grantee,
  bindingDelta.role,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName,
FROM
  `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`,
  UNNEST(protopayload_auditlog.servicedata_v1_iam.policyDelta.bindingDeltas) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY)
  AND (
    (resource.type = "service_account"
    AND protopayload_auditlog.methodName LIKE "google.iam.admin.%.SetIAMPolicy")
    OR
    (resource.type IN ("project", "folder", "organization")
    AND protopayload_auditlog.methodName = "SetIamPolicy"
    AND bindingDelta.role LIKE "roles/iam.serviceAccount%")
  )
  AND bindingDelta.action = 'ADD'
  -- Principal (grantee) exclusions
  AND bindingDelta.member NOT LIKE "%@example.com"
ORDER BY
  timestamp DESC

是否有任何由未核准身分建立的服務帳戶或金鑰?

透過分析管理員活動稽核記錄,下列查詢會偵測使用者手動建立的任何服務帳戶或金鑰。舉例來說,您可以遵循最佳做法,只允許已核准的服務帳戶在自動化工作流程中建立服務帳戶。因此,如果在該工作流程以外建立服務帳戶,就會視為不符合規定,且可能有惡意。

記錄檔分析


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.resource_name,
  JSON_VALUE(proto_payload.audit_log.response.email) as service_account_email
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="service_account"
  AND proto_payload.audit_log.method_name LIKE "%CreateServiceAccount%"
  AND proto_payload.audit_log.authentication_info.principal_email NOT LIKE "%.gserviceaccount.com"

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.methodName,
  protopayload_auditlog.resourceName,
  JSON_VALUE(protopayload_auditlog.responseJson, "$.email") as serviceAccountEmail
FROM
  `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 180 DAY)
  AND resource.type="service_account"
  AND protopayload_auditlog.methodName LIKE "%CreateServiceAccount%"
  AND protopayload_auditlog.authenticationInfo.principalEmail NOT LIKE "%.gserviceaccount.com"

是否有任何使用者新增至 (或從) 敏感 IAM 政策?

透過搜尋管理員活動稽核記錄,下列查詢可偵測任何使用者或群組存取 IAP 安全資源 (例如 Compute Engine 後端服務) 的變更。以下查詢會搜尋所有 IAM 政策更新,針對涉及 IAM 角色 roles/iap.httpsResourceAccessor 的 IAP 資源。這個角色提供存取 HTTPS 資源或後端服務的權限。任何查詢結果都可能表示有人試圖繞過可能暴露於網際網路的後端服務防護機制。

記錄檔分析


SELECT
  timestamp,
  proto_payload.audit_log.authentication_info.principal_email,
  resource.type,
  proto_payload.audit_log.resource_name,
  JSON_VALUE(binding, '$.role') as role,
  JSON_VALUE_ARRAY(binding, '$.members') as members
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.response, '$.bindings')) AS binding
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  -- AND log_id = "cloudaudit.googleapis.com/activity"
  AND proto_payload.audit_log.service_name = "iap.googleapis.com"
  AND proto_payload.audit_log.method_name LIKE "%.IdentityAwareProxyAdminService.SetIamPolicy"
  AND JSON_VALUE(binding, '$.role') = "roles/iap.httpsResourceAccessor"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  protopayload_auditlog.authenticationInfo.principalEmail,
  resource.type,
  protopayload_auditlog.resourceName,
  JSON_VALUE(binding, '$.role') as role,
  JSON_VALUE_ARRAY(binding, '$.members') as members
FROM
  `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`,
  UNNEST(JSON_QUERY_ARRAY(protopayload_auditlog.responseJson, '$.bindings')) AS binding
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 400 DAY)
  AND protopayload_auditlog.serviceName = "iap.googleapis.com"
  AND protopayload_auditlog.methodName LIKE "%.IdentityAwareProxyAdminService.SetIamPolicy"
  AND JSON_VALUE(binding, '$.role') = "roles/iap.httpsResourceAccessor"
ORDER BY
  timestamp DESC

佈建活動問題

這些查詢範例會執行分析,以偵測可疑或異常的管理員活動,例如佈建及設定資源。

是否有任何記錄設定變更?

透過搜尋管理員活動稽核記錄,以下查詢可偵測到任何記錄設定變更。監控記錄設定有助於偵測意外或惡意停用稽核記錄和類似防禦規避技巧的行為。

記錄檔分析


SELECT
  receive_timestamp, timestamp AS eventTimestamp,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.authentication_info.principal_email, 
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM 
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  proto_payload.audit_log.service_name = "logging.googleapis.com"
  AND log_id = "cloudaudit.googleapis.com/activity"

BigQuery


SELECT
  receiveTimestamp, timestamp AS eventTimestamp,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.authenticationInfo.principalEmail, 
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  protopayload_auditlog.serviceName = "logging.googleapis.com"

是否有任何虛擬私有雲流量記錄檔已停用?

透過搜尋管理員活動稽核記錄,下列查詢會偵測任何已主動停用虛擬私有雲流量記錄的子網路。監控 VPC 流量記錄設定有助於偵測意外或惡意停用 VPC 流量記錄檔和類似的防禦規避技巧。

記錄檔分析


SELECT
  receive_timestamp, timestamp AS eventTimestamp,
  proto_payload.audit_log.request_metadata.caller_ip,
  proto_payload.audit_log.authentication_info.principal_email, 
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM 
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  proto_payload.audit_log.method_name = "v1.compute.subnetworks.patch" 
  AND (
    JSON_VALUE(proto_payload.audit_log.request, "$.logConfig.enable") = "false"
    OR JSON_VALUE(proto_payload.audit_log.request, "$.enableFlowLogs") = "false"
  )

BigQuery


SELECT
  receiveTimestamp, timestamp AS eventTimestamp,
  protopayload_auditlog.requestMetadata.callerIp,
  protopayload_auditlog.authenticationInfo.principalEmail, 
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
protopayload_auditlog.methodName = "v1.compute.subnetworks.patch" 
AND JSON_VALUE(protopayload_auditlog.requestJson, "$.logConfig.enable") = "false"

過去一週內是否有異常大量的防火牆規則修改作業?

透過搜尋「管理員活動」稽核記錄,下列查詢會偵測過去一週內任一天的防火牆規則異常變更次數。為了判斷是否有異常值,查詢會針對防火牆規則變更的每日計數執行統計分析。系統會查看 90 天的回溯期內先前的每日計數,藉此計算每個日期的平均值和標準差。如果每日計數超過平均值的兩個標準差,就會視為異常值。您可以根據雲端佈建活動設定,設定查詢 (包括標準差係數和回溯期),以減少偽陽性情形。

記錄檔分析

SELECT
  *
FROM (
  SELECT
    *,
    AVG(counter) OVER (
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
    STDDEV(counter) OVER (
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
    COUNT(*) OVER (
      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
  FROM (
    SELECT
      EXTRACT(DATE FROM timestamp) AS day,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.method_name IGNORE NULLS) AS actions,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.authentication_info.principal_email IGNORE NULLS) AS actors,
      COUNT(*) AS counter
    FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
    WHERE
      timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
      AND proto_payload.audit_log.method_name LIKE "v1.compute.firewalls.%"
      AND proto_payload.audit_log.method_name NOT IN ("v1.compute.firewalls.list", "v1.compute.firewalls.get")
    GROUP BY
      day
  )
)
WHERE
  counter > avg + 2 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) 
ORDER BY
  counter DESC

BigQuery


SELECT
  *,
  AVG(counter) OVER (
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
  STDDEV(counter) OVER (
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
  COUNT(*) OVER (
    RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
FROM (
  SELECT
    EXTRACT(DATE FROM timestamp) AS day,
    ARRAY_AGG(DISTINCT protopayload_auditlog.methodName IGNORE NULLS) AS actions,
    ARRAY_AGG(DISTINCT protopayload_auditlog.authenticationInfo.principalEmail IGNORE NULLS) AS actors,
    COUNT(*) AS counter
  FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
  WHERE
    timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 90 DAY)
    AND protopayload_auditlog.methodName LIKE "v1.compute.firewalls.%"
    AND protopayload_auditlog.methodName NOT IN ("v1.compute.firewalls.list", "v1.compute.firewalls.get")
  GROUP BY
    day
)
WHERE TRUE
QUALIFY
  counter > avg + 2 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) 
ORDER BY
  counter DESC

過去一週內是否有任何 VM 遭到刪除?

透過搜尋「管理員活動」稽核記錄,下列查詢會列出過去一週內刪除的任何 Compute Engine 執行個體。這項查詢可協助您稽核資源刪除作業,並偵測潛在的惡意活動。

記錄檔分析

SELECT
  timestamp,
  JSON_VALUE(resource.labels.instance_id) AS instance_id,
  proto_payload.audit_log.authentication_info.principal_email, 
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.method_name
FROM 
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  resource.type = "gce_instance"
  AND proto_payload.audit_log.method_name = "v1.compute.instances.delete"
  AND operation.first IS TRUE
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY
  timestamp desc,
  instance_id
LIMIT
  1000

BigQuery


SELECT
  timestamp,
  resource.labels.instance_id,
  protopayload_auditlog.authenticationInfo.principalEmail,
  protopayload_auditlog.resourceName,
  protopayload_auditlog.methodName
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance"
  AND protopayload_auditlog.methodName = "v1.compute.instances.delete"
  AND operation.first IS TRUE
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
ORDER BY
  timestamp desc,
  resource.labels.instance_id
LIMIT
  1000

工作負載使用情況問題

這些範例查詢會執行分析,瞭解誰在使用您的雲端工作負載和 API,以及使用方式,協助您偵測內部或外部潛在的惡意行為。

過去一週內,有任何使用者身分出現異常高的 API 使用量嗎?

透過分析所有 Cloud Audit Logs,下列查詢可偵測過去一週內任何一天,任何使用者身分是否有異常高的 API 使用量。這種異常高的使用量,可能是 API 濫用、內部威脅或憑證外洩的潛在指標。為了判斷是否有異常值,這項查詢會針對每位實體的每日動作計數執行統計分析。系統會回溯 60 天的回溯期,查看先前的每日計數,為每個日和每個主要項目計算平均值和標準差。如果使用者的每日計數超過平均值的三個標準差,就會視為異常值。您可以根據雲端佈建活動設定檔,設定查詢 (包括標準差係數和回溯期),以盡量減少偽陽性。

記錄檔分析


SELECT
  *
FROM (
  SELECT
    *,
    AVG(counter) OVER (
      PARTITION BY principal_email
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
    STDDEV(counter) OVER (
      PARTITION BY principal_email
      ORDER BY day
      ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
    COUNT(*) OVER (
      PARTITION BY principal_email
      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
  FROM (
    SELECT
      proto_payload.audit_log.authentication_info.principal_email,
      EXTRACT(DATE FROM timestamp) AS day,
      ARRAY_AGG(DISTINCT proto_payload.audit_log.method_name IGNORE NULLS) AS actions,
      COUNT(*) AS counter
    FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
    WHERE
      timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
      AND proto_payload.audit_log.authentication_info.principal_email IS NOT NULL
      AND proto_payload.audit_log.method_name NOT LIKE "storage.%.get"
      AND proto_payload.audit_log.method_name NOT LIKE "v1.compute.%.list"
      AND proto_payload.audit_log.method_name NOT LIKE "beta.compute.%.list"
    GROUP BY
      proto_payload.audit_log.authentication_info.principal_email,
      day
  )
)
WHERE
  counter > avg + 3 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) 
ORDER BY
  counter DESC

BigQuery


SELECT
  *,
  AVG(counter) OVER (
    PARTITION BY principalEmail
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS avg,
  STDDEV(counter) OVER (
    PARTITION BY principalEmail
    ORDER BY day
    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS stddev,
  COUNT(*) OVER (
    PARTITION BY principalEmail
    RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS numSamples
FROM (
  SELECT
    protopayload_auditlog.authenticationInfo.principalEmail,
    EXTRACT(DATE FROM timestamp) AS day,
    ARRAY_AGG(DISTINCT protopayload_auditlog.methodName IGNORE NULLS) AS actions,
    COUNT(*) AS counter
  FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_*`
  WHERE
    timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
    AND protopayload_auditlog.authenticationInfo.principalEmail IS NOT NULL
    AND protopayload_auditlog.methodName NOT LIKE "storage.%.get"
    AND protopayload_auditlog.methodName NOT LIKE "v1.compute.%.list"
    AND protopayload_auditlog.methodName NOT LIKE "beta.compute.%.list"
  GROUP BY
    protopayload_auditlog.authenticationInfo.principalEmail,
    day
)
WHERE TRUE
QUALIFY
  counter > avg + 3 * stddev
  AND day >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY) 
ORDER BY
  counter DESC

過去一個月內,每天的自動調度資源用量為何?

下列查詢會分析管理員活動稽核記錄,回報上個月的資源自動調度使用情形 (按天劃分)。您可以使用這項查詢,找出需要進一步進行安全調查的模式或異常狀況。

記錄檔分析


SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  proto_payload.audit_log.method_name,
  COUNT(*) AS counter
FROM
   `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  resource.type = "gce_instance_group_manager"
  AND log_id = "cloudaudit.googleapis.com/activity"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  1, 2

BigQuery


SELECT
  TIMESTAMP_TRUNC(timestamp, DAY) AS day,
  protopayload_auditlog.methodName AS methodName,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_activity`
WHERE
  resource.type = "gce_instance_group_manager"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  1, 2

資料存取權問題

這些範例查詢會執行分析,以瞭解誰在 Google Cloud中存取或修改資料。

哪些使用者在過去一週最常存取資料?

下列查詢會使用「資料存取稽核記錄」,找出過去一週最常存取 BigQuery 資料表資料的使用者身分。

記錄檔分析


SELECT
  proto_payload.audit_log.authentication_info.principal_email,
  COUNT(*) AS COUNTER
FROM 
   `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  (proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.Query")
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
  AND log_id = "cloudaudit.googleapis.com/data_access"
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

BigQuery


SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.Query")
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

哪些使用者在上個月曾存取「帳戶」資料表中的資料?

下列查詢會使用資料存取稽核記錄,找出過去一個月內最常查詢特定 accounts 資料表的使用者身分。除了 BigQuery 匯出目的地的 MY_DATASET_IDMY_PROJECT_ID 預留位置,以下查詢還使用 DATASET_IDPROJECT_ID 預留位置。您需要替換 DATASET_IDPROJECT_ID 預留位置,才能指定要分析存取權的目標資料表,例如本例中的 accounts 資料表。

記錄檔分析


SELECT
  proto_payload.audit_log.authentication_info.principal_email,
  COUNT(*) AS COUNTER
FROM 
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`,
  UNNEST(proto_payload.audit_log.authorization_info) authorization_info
WHERE
  (proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   proto_payload.audit_log.method_name = "google.cloud.bigquery.v2.JobService.Query")
  AND authorization_info.permission = "bigquery.tables.getData"
  AND authorization_info.resource = "projects/[PROJECT_ID]/datasets/[DATASET_ID]/tables/accounts"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

BigQuery


SELECT
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNT(*) AS COUNTER
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`,
  UNNEST(protopayload_auditlog.authorizationInfo) authorizationInfo
WHERE
  (protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.InsertJob" OR
   protopayload_auditlog.methodName = "google.cloud.bigquery.v2.JobService.Query")
  AND authorizationInfo.permission = "bigquery.tables.getData"
  AND authorizationInfo.resource = "projects/[PROJECT_ID]/datasets/[DATASET_ID]/tables/accounts"
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1
ORDER BY
  2 desc, 1
LIMIT
  100

哪些使用者最常存取哪些資料表?

下列查詢會使用「資料存取稽核記錄」,找出過去一個月內讀取和修改資料次數最多的 BigQuery 資料表。這項資訊會顯示相關聯的使用者身分,並列出資料讀取和修改的總次數。

記錄檔分析


SELECT
  proto_payload.audit_log.resource_name,
  proto_payload.audit_log.authentication_info.principal_email,
  COUNTIF(JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataRead") IS NOT NULL) AS dataReadEvents,
  COUNTIF(JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataChange") IS NOT NULL) AS dataChangeEvents,
  COUNT(*) AS totalEvents
FROM 
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  STARTS_WITH(resource.type, 'bigquery') IS TRUE
  AND (JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataRead") IS NOT NULL
    OR JSON_VALUE(proto_payload.audit_log.metadata, "$.tableDataChange") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  5 DESC, 1, 2
LIMIT 1000

BigQuery


SELECT
  protopayload_auditlog.resourceName,
  protopayload_auditlog.authenticationInfo.principalEmail,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL) AS dataReadEvents,
  COUNTIF(JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL) AS dataChangeEvents,
  COUNT(*) AS totalEvents
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  STARTS_WITH(resource.type, 'bigquery') IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataRead") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.tableDataChange") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  1, 2
ORDER BY
  5 DESC, 1, 2
LIMIT 1000

過去一週的前 10 大 BigQuery 查詢是?

下列查詢會使用「資料存取稽核記錄」,找出過去一週最常見的查詢。並列出對應的使用者和參照的資料表。

記錄檔分析


SELECT
  COALESCE(
   JSON_VALUE(proto_payload.audit_log.metadata, "$.jobChange.job.jobConfig.queryConfig.query"),
   JSON_VALUE(proto_payload.audit_log.metadata, "$.jobInsertion.job.jobConfig.queryConfig.query")) as query,
  STRING_AGG(DISTINCT proto_payload.audit_log.authentication_info.principal_email, ',') as users,
  ANY_VALUE(COALESCE(
   JSON_EXTRACT_ARRAY(proto_payload.audit_log.metadata, "$.jobChange.job.jobStats.queryStats.referencedTables"),
   JSON_EXTRACT_ARRAY(proto_payload.audit_log.metadata, "$.jobInsertion.job.jobStats.queryStats.referencedTables"))) as tables,
  COUNT(*) AS counter
FROM 
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  (resource.type = 'bigquery_project' OR resource.type = 'bigquery_dataset')
  AND operation.last IS TRUE
  AND (JSON_VALUE(proto_payload.audit_log.metadata, "$.jobChange") IS NOT NULL
    OR JSON_VALUE(proto_payload.audit_log.metadata, "$.jobInsertion") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  query
ORDER BY
  counter DESC
LIMIT 10

BigQuery


SELECT
  COALESCE(
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobChange.job.jobConfig.queryConfig.query"),
   JSON_EXTRACT_SCALAR(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobConfig.queryConfig.query")) as query,
  STRING_AGG(DISTINCT protopayload_auditlog.authenticationInfo.principalEmail, ',') as users,
  ANY_VALUE(COALESCE(
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobChange.job.jobStats.queryStats.referencedTables"),
   JSON_EXTRACT_ARRAY(protopayload_auditlog.metadataJson, "$.jobInsertion.job.jobStats.queryStats.referencedTables"))) as tables,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  (resource.type = 'bigquery_project' OR resource.type = 'bigquery_dataset')
  AND operation.last IS TRUE
  AND (JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobChange") IS NOT NULL
    OR JSON_EXTRACT(protopayload_auditlog.metadataJson, "$.jobInsertion") IS NOT NULL)
  AND timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY)
GROUP BY
  query
ORDER BY
  counter DESC
LIMIT 10

過去一個月以來,在資料存取記錄檔中記錄到最常用的動作是?

下列查詢會使用 Cloud 稽核記錄中的所有記錄,找出過去一個月記錄到的最常用動作 100 項。

記錄檔分析


SELECT
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND log_id="cloudaudit.googleapis.com/data_access"
GROUP BY
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

BigQuery


SELECT
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type,
  COUNT(*) AS counter
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].cloudaudit_googleapis_com_data_access`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
GROUP BY
  protopayload_auditlog.methodName,
  protopayload_auditlog.serviceName,
  resource.type
ORDER BY
  counter DESC
LIMIT 100

網路安全性問題

這些查詢範例會針對 Google Cloud中的網路活動執行分析。

是否有從新 IP 位址連線至特定子網路的連線?

下列查詢會分析虛擬私有雲流量記錄,偵測任何新來源 IP 位址與特定子網路的連線。在這個範例中,如果來源 IP 位址在過去 60 天的回溯期內,在過去 24 小時內首次出現,就會被視為新來源。您可能會想在符合 PCI 等特定法規要求的子網路上使用及調整這項查詢。

記錄檔分析


SELECT
  JSON_VALUE(json_payload.connection.src_ip) as src_ip,
  -- TIMESTAMP supports up to 6 digits of fractional precision, so drop any more digits to avoid parse errors
  MIN(TIMESTAMP(REGEXP_REPLACE(JSON_VALUE(json_payload.start_time), r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS firstInstance,
  MAX(TIMESTAMP(REGEXP_REPLACE(JSON_VALUE(json_payload.start_time), r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS lastInstance,
  ARRAY_AGG(DISTINCT JSON_VALUE(resource.labels.subnetwork_name)) as subnetNames,
  ARRAY_AGG(DISTINCT JSON_VALUE(json_payload.dest_instance.vm_name)) as vmNames,
  COUNT(*) numSamples
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND JSON_VALUE(json_payload.reporter) = 'DEST'
  AND JSON_VALUE(resource.labels.subnetwork_name) IN ('prod-customer-data')
GROUP BY
  src_ip
HAVING firstInstance >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
ORDER BY
  lastInstance DESC,
  numSamples DESC

BigQuery


SELECT
  jsonPayload.connection.src_ip as src_ip,
  -- TIMESTAMP supports up to 6 digits of fractional precision, so drop any more digits to avoid parse errors
  MIN(TIMESTAMP(REGEXP_REPLACE(jsonPayload.start_time, r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS firstInstance,
  MAX(TIMESTAMP(REGEXP_REPLACE(jsonPayload.start_time, r'\.(\d{0,6})\d+(Z)?$', '.\\1\\2'))) AS lastInstance,
  ARRAY_AGG(DISTINCT resource.labels.subnetwork_name) as subnetNames,
  ARRAY_AGG(DISTINCT jsonPayload.dest_instance.vm_name) as vmNames,
  COUNT(*) numSamples
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].compute_googleapis_com_vpc_flows`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND jsonPayload.reporter = 'DEST'
  AND resource.labels.subnetwork_name IN ('prod-customer-data')
GROUP BY
  src_ip
HAVING firstInstance >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 DAY)
ORDER BY
  lastInstance DESC,
  numSamples DESC

有任何連線遭 Google Cloud Armor 封鎖嗎?

下列查詢可協助偵測潛在的攻擊行為,方法是分析外部應用程式負載平衡器記錄,找出 Google Cloud Armor 中設定的安全性政策封鎖的任何連線。這項查詢假設您已在外部應用程式負載平衡器上設定 Google Cloud Armor 安全性政策。這項查詢也假設您已啟用外部應用程式負載平衡器記錄功能,如記錄範圍工具中的「啟用」連結所提供的操作說明所述。

記錄檔分析


SELECT
  timestamp,
  http_request.remote_ip,
  http_request.request_method,
  http_request.status,
  JSON_VALUE(json_payload.enforcedSecurityPolicy.name) AS security_policy_name,
  JSON_VALUE(resource.labels.backend_service_name) AS backend_service_name,
  http_request.request_url,
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND JSON_VALUE(json_payload.statusDetails) = "denied_by_security_policy"
ORDER BY
  timestamp DESC

BigQuery


SELECT
  timestamp,
  httpRequest.remoteIp,
  httpRequest.requestMethod,
  httpRequest.status,
  jsonpayload_type_loadbalancerlogentry.enforcedsecuritypolicy.name,
  resource.labels.backend_service_name,
  httpRequest.requestUrl,
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].requests`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="http_load_balancer"
  AND jsonpayload_type_loadbalancerlogentry.statusdetails = "denied_by_security_policy"
ORDER BY
  timestamp DESC

Cloud IDS 是否偵測到任何高嚴重性病毒或惡意軟體?

以下查詢會搜尋 Cloud IDS 威脅記錄,並顯示 Cloud IDS 偵測到的任何高嚴重性病毒或惡意軟體。這項查詢會假設您已設定 Cloud IDS 端點

記錄檔分析


SELECT
  JSON_VALUE(json_payload.alert_time) AS alert_time,
  JSON_VALUE(json_payload.name) AS name,
  JSON_VALUE(json_payload.details) AS details,
  JSON_VALUE(json_payload.application) AS application,
  JSON_VALUE(json_payload.uri_or_filename) AS uri_or_filename,
  JSON_VALUE(json_payload.ip_protocol) AS ip_protocol,
FROM `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="ids.googleapis.com/Endpoint"
  AND JSON_VALUE(json_payload.alert_severity) IN ("HIGH", "CRITICAL")
  AND JSON_VALUE(json_payload.type) = "virus"
ORDER BY 
  timestamp DESC

BigQuery


SELECT
  jsonPayload.alert_time,
  jsonPayload.name,
  jsonPayload.details,
  jsonPayload.application,
  jsonPayload.uri_or_filename,
  jsonPayload.ip_protocol
FROM `[MY_PROJECT_ID].[MY_DATASET_ID].ids_googleapis_com_threat`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY)
  AND resource.type="ids.googleapis.com/Endpoint"
  AND jsonPayload.alert_severity IN ("HIGH", "CRITICAL")
  AND jsonPayload.type = "virus"
ORDER BY 
  timestamp DESC

虛擬私有雲網路中,哪些網域的 Cloud DNS 查詢次數最多?

以下查詢會列出過去 60 天內,您 VPC 網路中 Cloud DNS 查詢次數最多的前 10 個網域。這項查詢假設您已為虛擬私有雲網路啟用 Cloud DNS 記錄功能,如記錄範圍工具中的「啟用」連結所提供的操作說明所述。

記錄檔分析


SELECT
  JSON_VALUE(json_payload.queryName) AS query_name,
  COUNT(*) AS total_queries
FROM
  `[MY_PROJECT_ID].[MY_LOG_BUCKET_REGION].[MY_LOG_BUCKET_NAME]._AllLogs`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
  AND log_id="dns.googleapis.com/dns_queries"
GROUP BY
  query_name
ORDER BY
  total_queries DESC
LIMIT
  10

BigQuery


SELECT
 jsonPayload.queryname AS query_name,
 COUNT(*) AS total_queries
FROM
 `[MY_PROJECT_ID].[MY_DATASET_ID].dns_googleapis_com_dns_queries`
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 60 DAY)
GROUP BY
 query_name
ORDER BY
 total_queries DESC
LIMIT
 10

後續步驟