安全洞察的 SQL 查詢

您可以在「Observability Analytics」頁面執行 BigQuery 標準 SQL 查詢,匯總及分析 Cloud Logging 稽核記錄。分析稽核記錄有助於監控管理活動、追蹤資料存取情形,以及找出Google Cloud 資源中違反政策或可疑的活動。

關於稽核記錄

Google Cloud服務可寫入四種稽核記錄:

  • 管理員活動稽核記錄:管理員活動稽核記錄會記錄 API 呼叫,或修改資源設定或中繼資料的其他動作。系統一律會寫入這些記錄,您無法設定、排除或停用。

  • 資料存取稽核記錄:資料存取稽核記錄會記載讀取資源設定或中繼資料的 API 呼叫,以及建立、修改或讀取使用者所提供資源資料的使用者驅動 API 呼叫。由於存取資料是常見的 API 作業,因此這些記錄預設為停用 (BigQuery 除外)。

  • 系統事件稽核記錄:系統事件稽核記錄包含Google Cloud 動作的記錄項目,這些動作會修改資源設定。這些記錄是由 Google 系統產生,而非由使用者動作產生。您無法設定、排除或停用系統事件稽核記錄。

  • 政策遭拒稽核記錄:當 Google Cloud 服務因違反安全性政策而拒絕使用者或服務帳戶的存取要求時,系統會記錄這類事件。這些記錄無法停用,但您可以使用排除篩選器,防止這些記錄儲存在 Logging 中。

如要進一步瞭解稽核記錄,請參閱「稽核記錄總覽」。如要查看與稽核記錄整合的服務清單,請參閱「Google Cloud 具備稽核記錄的服務」。

使用稽核記錄找出違反政策或可疑活動

您可以使用稽核記錄找出違反政策或可疑的活動:

  • 如要找出可能透過 Identity and Access Management (IAM) 提權,或停用 Logging 來規避防禦措施的行為,請使用管理員活動稽核記錄。如需識別這種情況的查詢範例,請參閱「Logging 設定變更」。

  • 如要找出可能濫用 API 的行為,或託管於 Cloud Storage 或 BigQuery 等服務中的資料,請使用資料存取稽核記錄。如需找出這種情況的查詢範例,請參閱「找出 API 使用量偏高的主體」。

  • 如要找出資料存取頻率和存取者,請查詢所有稽核記錄。如需找出這種情況的查詢範例,請參閱「判斷過去一個月內最常執行的動作」。

事前準備

  • 確認您有會產生稽核記錄的 Google Cloud 專案、資料夾或組織。

  • 請確認您有權存取稽核記錄轉送至的記錄檔 bucket 檢視畫面。必須升級記錄檔 bucket,才能使用 Observability Analytics。如要瞭解如何建立升級為使用 Observability Analytics 的記錄檔 bucket,請參閱「設定記錄檔 bucket」。

  • 如要取得建立接收器和查看記錄檔所需的權限,請要求管理員授予您下列 IAM 角色:

    如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

    您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

    視您要查看的稽核記錄而定,您可能需要不同的角色或權限。如要瞭解如何設定 IAM 角色,請參閱 Logging 的「使用 IAM 存取控管」說明文件。

  • 如要在「Observability Analytics」頁面使用本文中的查詢,請按照下列步驟操作:

    1. 在 Google Cloud 控制台中,前往 「Observability Analytics」(觀測能力分析) 頁面:

      前往「Observability Analytics」(觀測能力分析) 頁面

      如果您是使用搜尋列尋找這個頁面,請選取子標題為「Logging」的結果。

    2. 找出要查詢的記錄檢視表名稱。

      如要找出這個名稱,請前往「Log views」(記錄檔檢視表) 清單,找到記錄檔檢視表,然後選取「Query」(查詢)。「Query」(查詢) 窗格會填入預設查詢,其中包含查詢的記錄檢視表資料表名稱。資料表名稱的格式為 project_ID.region.bucket_ID.view_ID。

      如要進一步瞭解如何存取預設查詢,請參閱「查詢記錄檢視表」。

    3. 將 VIEW 替換為要查詢的記錄檢視表名稱,然後複製查詢。

    4. 在「查詢」窗格中貼上查詢,然後點選「執行查詢」。

查詢範例

本節提供查詢稽核記錄的 SQL 查詢範例。

記錄設定變更

如要找出稽核記錄停用的時間,或預設 Logging 設定變更的時間,請查詢管理員活動稽核記錄:

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
  `VIEW`
WHERE
  proto_payload.audit_log.service_name = "logging.googleapis.com"
  AND log_id = "cloudaudit.googleapis.com/activity"

判斷過去一個月最常執行的動作

如要找出過去 30 天內最常執行的動作,請查詢所有稽核記錄:

SELECT
  proto_payload.audit_log.method_name,
  proto_payload.audit_log.service_name,
  resource.type,
  COUNT(*) AS counter
FROM
  `VIEW`
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

上述查詢會搜尋過去 30 天內的所有稽核記錄,並傳回 100 項最常執行的動作,以及 method_name、service_name、資源類型和執行動作計數器的相關資訊。

偵測授予服務帳戶的角色

如要找出服務帳戶模擬,或授予服務帳戶的角色,請查詢管理員活動稽核記錄:

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
  `VIEW`,
  UNNEST(JSON_QUERY_ARRAY(proto_payload.audit_log.service_data.policyDelta.bindingDeltas)) AS bindingDelta
WHERE
  timestamp >= TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 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

上述查詢會搜尋稽核記錄,找出將角色授予服務帳戶主體的記錄。服務帳戶權杖建立者角色可讓主體模擬服務帳戶。查詢也會指定過去七天的時間範圍,並排除已核准的被授權者 (%@example.com)。

找出 API 用量偏高的主體

如要找出 API 使用量異常偏高的主體,請查詢所有稽核記錄:

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 `VIEW`
    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

針對指定的主體 principal_email,查詢會計算每天的平均 API 呼叫次數,以及這些 API 呼叫的標準差。如果 API 呼叫的平均數量大於移動平均值加上標準差的三倍,查詢就會顯示下列資訊:

  • 執行動作的計數器。
  • 計算出的每日平均動作次數。
  • 執行的特定動作。

後續步驟