Analizar secretos con Inventario de Recursos de Cloud

En esta página se explica cómo usar Inventario de Recursos de Cloud para monitorizar tus secretos, exportar datos para analizarlos y ejecutar consultas eficaces para obtener la información valiosa que necesitas.

Información general

Cloud Asset Inventory analiza tu Google Cloud entorno y registra cualquier cambio que se produzca en tus recursos en la nube, como máquinas virtuales, bases de datos, segmentos de almacenamiento y, en este contexto, tus secretos de Secret Manager. La integración entre Secret Manager e Inventario de recursos de Cloud te permite hacer lo siguiente:

  • Ejecutar consultas: busca secretos específicos o identifica patrones en tus secretos.

  • Configurar alertas: configure Cloud Asset Inventory para que envíe notificaciones a Pub/Sub cuando se produzcan eventos específicos, como cuando se creen, modifiquen o eliminen secretos.

  • Exportar datos: exporta tu inventario secreto a BigQuery para hacer análisis y generar informes detallados.

  • Gestionar y analizar tus secretos: consulta todos tus secretos en un mismo lugar (en todos los proyectos y en toda tu organización) e identifica los que puedan estar mal configurados o infringir las políticas de seguridad de tu organización. Por ejemplo, puedes encontrar secretos que no se roten con regularidad o que no tengan controles de acceso adecuados.

Se trata de una tarea avanzada para los usuarios de Secret Manager. Antes de leer esta página, te recomendamos que consultes lo siguiente:

Consultar Secret Manager

Para analizar tus secretos con consultas similares a SQL, te recomendamos que exportes tus secretos y versiones de secretos a BigQuery. Secret Manager no está integrado con Búsqueda de recursos ni con Analizador de políticas. Estas consultas usan la CLI de Google Cloud y BigQuery para buscar tus recursos.

Limitaciones

El uso de Inventario de Recursos de Cloud para analizar recursos de Secret Manager tiene la siguiente limitación:

  • Inventario de recursos de Cloud solo admite la exportación y la creación de listas de las últimas cinco semanas.

Monitorizar cambios de recursos

Inventario de recursos de Cloud registra las actualizaciones en tiempo real y permite monitorizar estos cambios. Puedes configurar feeds para que envíen notificaciones a un conjunto de temas de Pub/Sub configurados cada vez que se modifiquen tus recursos. Además, Cloud Asset Inventory permite configurar condiciones en tus feeds para que puedas monitorizar cambios específicos de determinados tipos de recursos. Para saber cómo activar flujos de trabajo cuando cambian los recursos, consulta la documentación de Pub/Sub.

Exportar recursos a BigQuery

Al exportar tus secretos y versiones de secretos a BigQuery, puedes ejecutar consultas similares a SQL en grandes cantidades de datos y obtener información valiosa sobre tus recursos. Antes de exportar tus recursos, asegúrate de que tu conjunto de datos y tus cuentas de servicio estén configurados correctamente.

Para exportar tus recursos, ejecuta el siguiente comando:

gcloud

Antes de usar los datos de los comandos que se indican a continuación, haz los siguientes cambios:

  • CONTENT_TYPE: el tipo de contenido del recurso (RESOURCE).
  • PROJECT_ID: el ID del proyecto que contiene los secretos que se van a analizar.
  • SNAPSHOT_TIME: la hora a la que se hará la instantánea de los recursos. Puede ser entre la hora actual y 5 semanas anteriores.
  • BIGQUERY_PROJECT_ID: el ID del proyecto en el que se encuentra la tabla de BigQuery.
  • DATASET_ID: el ID del conjunto de datos de BigQuery.
  • TABLE_NAME: la tabla a la que vas a exportar los metadatos. Si no existe, se crea.

Ejecuta el siguiente comando:

Linux, macOS o 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

Para obtener más información, consulta el artículo sobre cómo exportar datos a BigQuery.

Consultas de ejemplo

Utilice estas consultas de ejemplo para encontrar secretos y versiones de secretos con propiedades específicas.

Secretos creados en las últimas dos semanas

Busca los secretos (y sus propiedades) que se hayan añadido a tu organización en las dos últimas semanas.

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);
  

Sustituye BIGQUERY_TABLE por la ruta completa a la tabla de BigQuery a la que has exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

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"
  

Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.

Los secretos se replican automáticamente

Encuentra todos los secretos replicados automáticamente.

BigQuery

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

Sustituye BIGQUERY_TABLE por la ruta completa a la tabla de BigQuery a la que has exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

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"
  

Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.

Secretos replicados en una ubicación específica

Busca todos los secretos almacenados en una ubicación específica, como 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;
  

Sustituye BIGQUERY_TABLE por la ruta completa a la tabla de BigQuery a la que has exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

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"
  

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto que contiene los secretos que se van a analizar
  • LOCATION: la Google Cloud ubicación del secreto

Versiones de secretos creadas hace más de 180 días

Lista todas las versiones de secretos que se crearon hace más de 180 días.

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";
  

Sustituye BIGQUERY_TABLE por la ruta completa a la tabla de BigQuery a la que has exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

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"
  

Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.

Secretos sin CMEK configurada

Lista todos los secretos que no están cifrados con claves de cifrado gestionadas por el cliente (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
      );
  

Sustituye BIGQUERY_TABLE por la ruta completa a la tabla de BigQuery a la que has exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

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"
  

Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.

Secretos con CMEK configurada

Lista todos los secretos que están cifrados con 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
    );
  

Sustituye BIGQUERY_TABLE por la ruta completa a la tabla de BigQuery a la que has exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

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"
  

Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.

Secretos encriptados con una CMEK específica

Buscar secretos cifrados con una CMEK específica.

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
      );
  

Haz los cambios siguientes:

  • BIGQUERY_TABLE: la ruta completa a la tabla de BigQuery a la que ha exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

  • KMS_KEY_NAME: el ID de la clave o el identificador completo de la clave

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"
  

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto que contiene los secretos que se van a analizar
  • KMS_KEY_NAME: el ID de la clave o el identificador completo de la clave

Versiones de secretos sin CMEK configurada

Busca todas las versiones de secretos habilitadas que no estén cifradas con 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";
  

Sustituye BIGQUERY_TABLE por la ruta completa a la tabla de BigQuery a la que has exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

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"
  

Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.

Versiones de secretos cifradas con una CMEK específica

Lista todas las versiones de secretos habilitadas cifradas con una versión de CMEK específica.

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";
  

Haz los cambios siguientes:

  • BIGQUERY_TABLE: la ruta completa a la tabla de BigQuery a la que ha exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

  • KMS_KEY_VERSION_NAME: el número de versión de la clave de 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"
  

Haz los cambios siguientes:

  • PROJECT_ID: el ID del proyecto que contiene los secretos que se van a analizar
  • KMS_KEY_VERSION_NAME: ID de la versión de la clave

Secretos sin rotación configurada

Busca todos los secretos que no tengan una programación de rotación.

BigQuery

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

Sustituye BIGQUERY_TABLE por la ruta completa a la tabla de BigQuery a la que has exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

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"
  

Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.

Secretos con un periodo de rotación específico

Para encontrar todos los secretos que se van a rotar menos de una vez cada 90 días, haz lo siguiente:

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)
  

Sustituye BIGQUERY_TABLE por la ruta completa a la tabla de BigQuery a la que has exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

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"
  

Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.

Secretos que caducarán en los próximos 30 días

Lista los secretos que caducarán en los próximos 30 días.

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);
  

Sustituye BIGQUERY_TABLE por la ruta completa a la tabla de BigQuery a la que has exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

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"
  

Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.

Secretos con un tema de Pub/Sub configurado

Lista todos los secretos que tengan al menos un tema de Pub/Sub configurado.

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
  

Sustituye BIGQUERY_TABLE por la ruta completa a la tabla de BigQuery a la que has exportado todos los recursos en la sección Exportar recursos a BigQuery de este documento.

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"
  

Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.

Siguientes pasos