本页面介绍如何使用 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 仅支持导出和列出过去 5 周的快照。
监控资产更改
Cloud Asset Inventory 会跟踪实时更新并支持 监控这些更改。 您可以配置 Feed ,以便在资源发生修改时向一组已配置的 Pub/Sub 主题发送通知 。此外,Cloud Asset Inventory 还支持 在 Feed 上配置条件, 以便您可以监控特定资产类型的特定更改。如需了解如何在资产 更改时触发工作流,请参阅 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 或密钥的完全限定标识符
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 或密钥的完全限定标识符
未配置 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 与其他产品搭配使用。