本頁說明如何使用 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 總覽:瞭解 Secret Manager 的重要概念和功能
-
Cloud Asset Inventory 總覽,瞭解 Cloud Asset Inventory 並查看其完整的資產管理功能
查詢 Secret Manager
如要使用類似 SQL 的查詢分析密鑰,建議您將密鑰和密鑰版本匯出至 BigQuery。Secret Manager 未與 Asset Search 或 Policy 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。
後續步驟
- 進一步瞭解如何搭配使用 Secret Manager 與其他產品。