使用 Cloud Asset Inventory 分析 Secret

本页介绍了如何使用 Cloud Asset Inventory 监控密钥、导出数据以进行分析,以及运行强大的查询以获取所需的数据分析。

概览

Cloud Asset Inventory 会分析您的环境,并记录云资源(例如虚拟机、数据库、存储分区,在本上下文中是 Secret Manager 密钥)的任何更改。 Google Cloud Secret Manager 与 Cloud Asset Inventory 的集成可帮助您执行以下操作:

  • 运行查询:搜索特定密钥或识别密钥中的模式。

  • 设置提醒:配置 Cloud Asset Inventory,以便在发生特定事件(例如创建、修改或删除 Secret)时向 Pub/Sub 发送通知。

  • 导出数据:将您的秘密商品目录导出到 BigQuery,以进行深入分析和生成报告。

  • 管理和分析密钥:在一个位置查看所有密钥(包括项目和整个组织中的密钥),并找出可能配置错误或违反贵组织安全政策的密钥。例如,您可以发现未定期轮替或缺少适当访问控制的 Secret。

这是面向 Secret Manager 用户的高级任务。在阅读本页之前,我们建议您先阅读以下内容:

查询 Secret Manager

如需使用类似 SQL 的查询分析密文,我们建议您将密文和密文版本导出到 BigQuery。Secret Manager 未与资源搜索政策分析器集成。这些查询使用 Google Cloud CLI 和 BigQuery 来搜索您的资产。

限制

使用 Cloud Asset Inventory 分析 Secret Manager 资源存在以下限制:

  • Cloud Asset Inventory 仅支持导出和列出过去五周内的快照。

监控资产更改

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

查询示例

您可以使用以下示例查询来查找具有特定属性的密文和密文版本。

过去两周内创建的 Secret

查找过去两周内添加到贵组织的密文(及其属性)。

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 替换为包含要分析的 Secret 的项目的 ID。

自动复制的 Secret

查找自动复制的所有密文。

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 替换为包含要分析的 Secret 的项目的 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:Secret 的 Google Cloud 位置

创建时间超过 180 天的 Secret 版本

列出超过 180 天前创建的所有 Secret 版本。

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 替换为包含要分析的 Secret 的项目的 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 替换为包含要分析的 Secret 的项目的 ID。

将在接下来的 30 天内过期的密文

列出将在接下来的 30 天内过期的 Secret。

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 替换为包含要分析的 Secret 的项目的 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 替换为包含要分析的 Secret 的项目的 ID。

后续步骤