使用 Cloud Asset Inventory 分析密碼

本頁說明如何使用 Cloud Asset Inventory 監控密鑰、匯出資料以進行分析,以及執行強大的查詢來取得所需洞察資料。

總覽

Cloud Asset Inventory 會分析您的 Google Cloud 環境,並記錄雲端資源的任何變更,例如虛擬機器、資料庫、儲存空間值區,以及本文中的 Secret Manager 密鑰。整合 Secret Manager 和 Cloud Asset Inventory 可協助您執行下列操作:

  • 執行查詢:搜尋特定密碼或找出密碼的模式。

  • 設定快訊:設定 Cloud Asset Inventory,在發生特定事件時傳送通知至 Pub/Sub,例如建立、修改或刪除密鑰。

  • 匯出資料:將機密項目清單匯出至 BigQuery,進行深入分析和產生報表。

  • 管理及分析密鑰:在單一位置查看所有密鑰 (包括專案和整個機構),並找出可能設定錯誤或違反機構安全政策的密鑰。舉例來說,您可以找出未定期輪替或缺乏適當存取控管的密碼。

這是 Secret Manager 使用者的進階工作。建議您先閱讀下列內容,再繼續閱讀本頁:

查詢 Secret Manager

如要使用類似 SQL 的查詢分析密鑰,建議您將密鑰和密鑰版本匯出至 BigQuery。Secret Manager 未與 Asset SearchPolicy Analyzer 整合。這些查詢會使用 Google Cloud CLI 和 BigQuery 搜尋資產。

限制

使用 Cloud Asset Inventory 分析 Secret Manager 資源時,有以下限制:

  • Cloud Asset Inventory 僅支援匯出及列出過去五週的快照。

監控資產變更

Cloud Asset Inventory 會追蹤即時更新,並支援監控這些變更。 您可以設定動態消息,在資源每次修改時,將通知傳送至一組已設定的 Pub/Sub 主題。此外,Cloud Asset Inventory 支援在動態饋給中設定條件,方便您監控特定資產類型的特定變更。如要瞭解如何根據資產異動觸發工作流程,請參閱 Pub/Sub 說明文件

將資產匯出至 BigQuery

將密鑰和密鑰版本匯出至 BigQuery 後,您就能對大量資料執行類似 SQL 的查詢,並產生有關資產的實用洞察資訊。匯出資產前,請確認資料集和服務帳戶已正確設定

如要匯出資產,請執行下列指令:

gcloud

使用下方的任何指令資料之前,請先替換以下項目:

  • CONTENT_TYPE:素材資源內容類型 (RESOURCE)。
  • PROJECT_ID:包含要分析的密鑰的專案 ID。
  • SNAPSHOT_TIME:要擷取資源快照的時間。時間範圍可介於目前時間和 5 週前。
  • BIGQUERY_PROJECT_ID:BigQuery 資料表所在的專案 ID。
  • DATASET_ID:BigQuery 資料集的 ID。
  • TABLE_NAME:要將中繼資料匯出至的資料表。如果不存在,系統會建立該目錄。

執行下列指令:

Linux、macOS 或 Cloud Shell

gcloud asset export \
  --content-type=CONTENT_TYPE \
  --project=PROJECT_ID \
  --snapshot-time=SNAPSHOT_TIME \
  --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME \
  --output-bigquery-force

Windows (PowerShell)

gcloud asset export `
  --content-type=CONTENT_TYPE `
  --project=PROJECT_ID `
  --snapshot-time=SNAPSHOT_TIME `
  --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME `
  --output-bigquery-force

Windows (cmd.exe)

gcloud asset export ^
  --content-type=CONTENT_TYPE ^
  --project=PROJECT_ID ^
  --snapshot-time=SNAPSHOT_TIME ^
  --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME ^
  --output-bigquery-force

詳情請參閱「匯出至 BigQuery」。

查詢範例

使用這些範例查詢,找出具有特定屬性的密鑰和密鑰版本。

過去兩週內建立的密鑰

找出過去兩週內新增至貴機構的密碼 (及其屬性)。

BigQuery

  SELECT name, FROM BIGQUERY_TABLE
  WHERE asset_type='secretmanager.googleapis.com/Secret' AND
  DATE(JSON_VALUE(resource.data, '$.createTime')) > DATE_SUB(CURRENT_DATE(), INTERVAL 2 WEEK);
  

BIGQUERY_TABLE 替換為 BigQuery 資料表的完整路徑,您已將所有資產匯出至該資料表,請參閱本文「將資產匯出至 BigQuery」一節。

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/Secret' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.data.createTime>-P2W"
  

PROJECT_ID 替換為含有待分析密碼的專案 ID。

自動複製密鑰

找出所有自動複製的密碼。

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
    JSON_EXTRACT(resource.data, '$.replication.automatic') IS NOT NULL;
  

BIGQUERY_TABLE 替換為 BigQuery 資料表的完整路徑,您已將所有資產匯出至該資料表,請參閱本文「將資產匯出至 BigQuery」一節。

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/Secret' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.data.replication.automatic != NULL"
  

PROJECT_ID 替換為含有待分析密碼的專案 ID。

複製到特定位置的密鑰

找出儲存在特定位置 (例如 us-central1) 的所有密碼。

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE
    (
      SELECT * FROM
      UNNEST(JSON_EXTRACT_ARRAY(resource.data, '$.replication.userManaged.replicas')) AS location
      WHERE JSON_VALUE(JSON_EXTRACT(location, '$.location')) = "us-central1"
    )
    IS NOT NULL;
  

BIGQUERY_TABLE 替換為 BigQuery 資料表的完整路徑,您已將所有資產匯出至該資料表,請參閱本文「將資產匯出至 BigQuery」一節。

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/Secret' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.data.replication.userManaged.replicas.location=LOCATION"
  

更改下列內容:

  • PROJECT_ID:包含要分析密碼的專案 ID
  • LOCATION:密鑰的 Google Cloud 位置

超過 180 天前建立的密鑰版本

列出所有建立時間超過 180 天的密鑰版本。

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/SecretVersion' AND
      DATE(JSON_VALUE(resource.data, '$.createTime')) < DATE_SUB(CURRENT_DATE(), INTERVAL 180 DAY) AND
      JSON_VALUE(resource.data, '$.state') = "ENABLED";
  

BIGQUERY_TABLE 替換為 BigQuery 資料表的完整路徑,您已將所有資產匯出至該資料表,請參閱本文「將資產匯出至 BigQuery」一節。

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.data.createTime < P6M AND resource.data.state=ENABLED"
  

PROJECT_ID 替換為含有待分析密碼的專案 ID。

未設定 CMEK 的密鑰

列出使用客戶自行管理的加密金鑰 (CMEK) 加密的所有密鑰:

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret'
      AND (
        JSON_VALUE(resource.data, "$.replication.automatic.customerManagedEncryption.kmsKeyName") IS NULL
        AND JSON_VALUE(resource.data, "$.replication.userManaged.replicas[0].customerManagedEncryption.kmsKeyName") IS NULL
      );
  

BIGQUERY_TABLE 替換為 BigQuery 資料表的完整路徑,您已將所有資產匯出至該資料表,請參閱本文「將資產匯出至 BigQuery」一節。

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.data.createTime < P6M AND resource.data.state=ENABLED"
  

PROJECT_ID 替換為含有待分析密碼的專案 ID。

已設定 CMEK 的密鑰

列出所有以 CMEK 加密的密鑰。

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret'
    AND (
      JSON_VALUE(resource.data, "$.replication.automatic.customerManagedEncryption.kmsKeyName") IS NOT NULL
      OR JSON_VALUE(resource.data, "$.replication.userManaged.replicas[0].customerManagedEncryption.kmsKeyName") IS NOT NULL
    );
  

BIGQUERY_TABLE 替換為 BigQuery 資料表的完整路徑,您已將所有資產匯出至該資料表,請參閱本文「將資產匯出至 BigQuery」一節。

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/Secret' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.data.replication.userManaged.replicas.customerManagedEncryption != NULL OR resource.data.replication.automatic.customerManagedEncryption!=NULL"
  

PROJECT_ID 替換為含有待分析密碼的專案 ID。

使用特定 CMEK 加密的密鑰

找出以特定 CMEK 加密的密鑰。

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret'
      AND (
        JSON_VALUE(resource.data, "$.replication.automatic.customerManagedEncryption.kmsKeyName") = KMS_KEY_NAME
        OR JSON_VALUE(resource.data, "$.replication.userManaged.replicas[0].customerManagedEncryption.kmsKeyName") = KMS_KEY_NAME
      );
  

更改下列內容:

  • BIGQUERY_TABLE:您在本文「將資產匯出至 BigQuery」一節中,將所有資產匯出至 BigQuery 資料表時使用的完整路徑。

  • KMS_KEY_NAME:金鑰的 ID 或金鑰的完整 ID

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/Secret' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.data.replication.userManaged.replicas.customerManagedEncryption.kmsKeyName=KMS_KEY_NAME"
  

更改下列內容:

  • PROJECT_ID:包含要分析密碼的專案 ID
  • KMS_KEY_NAME:金鑰的 ID 或金鑰的完整 ID

未設定 CMEK 的密鑰版本

找出所有已啟用但未以 CMEK 加密的密鑰版本。

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/SecretVersion'
    AND (
      JSON_VALUE(resource.data, "$.replicationStatus.automatic.customerManagedEncryption.kmsKeyVersionName") IS NULL
      AND JSON_VALUE(resource.data, "$.replicationStatus.userManaged.replicas[0].customerManagedEncryption.kmsKeyVersionName") IS NULL
    )
    AND JSON_VALUE(resource.data, "$.state") = "ENABLED";
  

BIGQUERY_TABLE 替換為 BigQuery 資料表的完整路徑,您已將所有資產匯出至該資料表,請參閱本文「將資產匯出至 BigQuery」一節。

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="(resource.data.replicationStatus.userManaged.replicas.customerManagedEncryption = NULL OR resource.data.replicationStatus.automatic.customerManagedEncryption=NULL) AND resource.data.state=ENABLED"
  

PROJECT_ID 替換為含有待分析密碼的專案 ID。

以特定 CMEK 加密的密鑰版本

列出以特定 CMEK 版本加密的所有已啟用密鑰版本。

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/SecretVersion'
    AND (
      JSON_VALUE(resource.data, "$.replicationStatus.automatic.customerManagedEncryption.kmsKeyVersionName") = KMS_KEY_VERSION_NAME
      OR JSON_VALUE(resource.data, "$.replicationStatus.userManaged.replicas[0].customerManagedEncryption.kmsKeyVersionName") = KMS_KEY_VERSION_NAME
    )
    AND JSON_VALUE(resource.data,"$.state")="ENABLED";
  

更改下列內容:

  • BIGQUERY_TABLE:您在本文「將資產匯出至 BigQuery」一節中,將所有資產匯出至 BigQuery 資料表時使用的完整路徑。

  • KMS_KEY_VERSION_NAME:Cloud Key Management Service 金鑰版本號碼

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.data.replicationStatus.userManaged.replicas.customerManagedEncryption.kmsKeyVersionName=$FULL_KMS_KEY_VERSION_RESOURCE_NAME AND resource.data.status=ENABLED"
  

更改下列內容:

  • PROJECT_ID:包含要分析密碼的專案 ID
  • KMS_KEY_VERSION_NAME:金鑰版本的 ID

未設定輪替的密鑰

找出所有沒有輪替時間表的密鑰。

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
       JSON_EXTRACT(resource.data, '$.rotation') IS NULL;
  

BIGQUERY_TABLE 替換為 BigQuery 資料表的完整路徑,您已將所有資產匯出至該資料表,請參閱本文「將資產匯出至 BigQuery」一節。

gcloud

  NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
  gcloud asset list --project=PROJECT_ID \
      --asset-types='secretmanager.googleapis.com/Secret' \
      --snapshot-time=$NOW \
      --content-type='resource' \
      --filter="resource.data.rotation=NULL"
  

PROJECT_ID 替換為含有待分析密碼的專案 ID。

具有特定輪替週期的密鑰

找出所有排定每 90 天輪替一次以下的密鑰:

BigQuery

    SELECT *
    FROM BIGQUERY_TABLE
    WHERE
      CAST(
        TRIM(
          JSON_VALUE(JSON_EXTRACT(resource.data, "$.rotation.rotationPeriod")),"s")
        AS INT64)
    < 86400 * 90 #Rotation period in seconds (86400s in 1 day * 90 days)
  

BIGQUERY_TABLE 替換為 BigQuery 資料表的完整路徑,您已將所有資產匯出至該資料表,請參閱本文「將資產匯出至 BigQuery」一節。

gcloud

  NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
  ROTATION_PERIOD_SECONDS=$((90 * 24 * 60 * 60))
  gcloud asset list --project=PROJECT_ID \
      --asset-types='secretmanager.googleapis.com/Secret' \
      --snapshot-time=$NOW \
      --content-type='resource' \
      --filter="resource.data.rotation != null AND resource.data.rotation.rotationPeriod < ${ROTATION_PERIOD_SECONDS}s"
  

PROJECT_ID 替換為含有待分析密碼的專案 ID。

未來 30 天內會過期的密鑰

列出會在未來 30 天內過期的密鑰。

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
      DATE(JSON_VALUE(resource.data, '$.expireTime')) < DATE_ADD(CURRENT_DATE(), INTERVAL 30 DAY);
  

BIGQUERY_TABLE 替換為 BigQuery 資料表的完整路徑,您已將所有資產匯出至該資料表,請參閱本文「將資產匯出至 BigQuery」一節。

gcloud

  NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
  gcloud asset list --project=PROJECT_ID \
      --asset-types='secretmanager.googleapis.com/Secret' \
      --snapshot-time=$NOW \
      --content-type='resource' \
      --filter="resource.data.expireTime < PD30"
  

PROJECT_ID 替換為含有待分析密碼的專案 ID。

已設定 Pub/Sub 主題的密鑰

列出至少設定一個 Pub/Sub 主題的所有密鑰。

BigQuery

    SELECT name, ARRAY_LENGTH(JSON_EXTRACT_ARRAY(resource.data, '$.topics')) AS topics_count,
    FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
      ARRAY_LENGTH(JSON_EXTRACT_ARRAY(resource.data, '$.topics')) > 0
  

BIGQUERY_TABLE 替換為 BigQuery 資料表的完整路徑,您已將所有資產匯出至該資料表,請參閱本文「將資產匯出至 BigQuery」一節。

gcloud

  NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
  gcloud asset list --project=PROJECT_ID \
      --asset-types='secretmanager.googleapis.com/Secret' \
      --snapshot-time=$NOW \
      --content-type='resource' \
      --filter="resource.data.topics !=NULL"
  

PROJECT_ID 替換為含有待分析密碼的專案 ID。

後續步驟