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:
-
Descripción general de Secret Manager para conocer los conceptos y las funciones clave de Secret Manager
-
Descripción general de Inventario de Recursos de Cloud para conocer Inventario de Recursos de Cloud y sus funciones de gestión de recursos
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 regionales 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 resource.location <> "global" 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.location != global AND resource.data.createTime>-P2W"
Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.
Secretos regionales 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 asset_type='secretmanager.googleapis.com/Secret' AND resource.location = "us-central1";
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.location = LOCATION AND resource.data.createTime>-P2W"
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 de los secretos
Versiones de secretos regionales 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' resource.location <> "global" 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.location != global AND 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 regionales 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' resource.location <> "global" AND JSON_VALUE(resource.data, "$.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/SecretVersion' \ --snapshot-time=$NOW \ --content-type='resource' \ --filter="(resource.location != global AND resource.data.customerManagedEncryption.kmsKeyVersionName = NULL) AND resource.data.state=ENABLED"
Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.
Secretos regionales 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' resource.location <> "global" AND JSON_VALUE(resource.data, "$.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.location != global AND resource.data.customerManagedEncryption != NULL"
Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.
Secretos regionales cifrados 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' resource.location <> "global" AND JSON_VALUE(resource.data, "$.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 beta asset list --project=PROJECT_ID \ --asset-types='secretmanager.googleapis.com/Secret' \ --snapshot-time=$NOW \ --content-type='resource' \ --filter="resource.location != global AND resource.data.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 secretas regionales 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' resource.location <> "global" AND JSON_VALUE(resource.data, "$.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.location != global AND resource.data.customerManagedEncryption.kmsKeyVersionName = 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 regionales 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' resource.location <> "global" AND JSON_VALUE(resource.data, "$.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.location != global AND resource.data.customerManagedEncryption.kmsKeyVersionName = KMS_KEY_VERSION_NAME) AND resource.data.state=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 regionales sin rotación configurada
Busca todos los secretos que no tengan una programación de rotación.
BigQuery
SELECT name FROM BIGQUERY_TABLE WHERE asset_type='secretmanager.googleapis.com/Secret' AND resource.location <> "global" 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.location != global AND resource.data.rotation = NULL"
Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.
Secretos regionales 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 asset_type='secretmanager.googleapis.com/Secret' AND resource.location <> "global" AND 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.location != global AND 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 regionales 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 resource.location <> "global" 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.location != global AND resource.data.expireTime < PD30"
Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.
Secretos regionales 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 resource.location <> "global" 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.location != global AND resource.data.topics != NULL"
Sustituye PROJECT_ID por el ID del proyecto que contiene los secretos que se van a analizar.
Siguientes pasos
- Consulta las prácticas recomendadas.