Cette page explique comment utiliser inventaire des éléments cloud pour surveiller vos secrets, exporter des données à des fins d'analyse et exécuter des requêtes puissantes afin d'obtenir les insights dont vous avez besoin.
Présentation
Inventaire des éléments cloud analyse votre Google Cloud environnement et enregistre toutes les modifications apportées à vos ressources cloud, telles que les machines virtuelles, les bases de données, les buckets de stockage et, dans ce contexte, vos secrets Secret Manager. L'intégration entre Secret Manager et inventaire des éléments cloud vous permet d'effectuer les opérations suivantes :
-
Exécuter des requêtes : recherchez des secrets spécifiques ou identifiez des modèles dans vos secrets.
-
Configurer des alertes : configurez Cloud Asset Inventory pour envoyer des notifications à Pub/Sub lorsque des événements spécifiques se produisent, par exemple lorsque des secrets sont créés, modifiés ou supprimés.
-
Exporter des données : exportez votre inventaire de secrets vers BigQuery pour une analyse approfondie et des rapports.
-
Gérer et analyser vos secrets : affichez tous vos secrets au même endroit (dans tous les projets et dans l’ensemble de votre organisation) et identifiez ceux qui peuvent être mal configurés ou qui enfreignent les règles de sécurité de votre organisation. Par exemple, vous pouvez trouver des secrets qui ne sont pas renouvelés régulièrement ou qui ne disposent pas de contrôles d'accès appropriés.
Il s'agit d'une tâche avancée pour les utilisateurs de Secret Manager. Avant de lire cette page, nous vous recommandons de consulter les ressources suivantes :
-
Présentation de Secret Manager pour comprendre les concepts et les fonctionnalités clés de Secret Manager
-
Présentation de Cloud Asset Inventory pour comprendre inventaire des éléments cloud et découvrir ses fonctionnalités complètes de gestion des éléments
Interroger Secret Manager
Pour analyser vos secrets à l'aide de requêtes de type SQL, nous vous recommandons d' exporter vos secrets et vos versions de secrets vers BigQuery. Secret Manager n'est pas intégré à Asset Search ni à Policy Analyzer. Ces requêtes utilisent la Google Cloud CLI et BigQuery pour rechercher vos éléments.
Limites
L'utilisation de Cloud Asset Inventory pour analyser les ressources de Secret Manager présente la limite suivante :
-
Inventaire des éléments cloud ne permet d'exporter et de répertorier les instantanés qu'au cours des cinq dernières semaines.
Surveiller les modifications apportées aux éléments
L'inventaire des éléments cloud suit les mises à jour en temps réel et permet de surveiller ces modifications. Vous pouvez configurer des flux pour envoyer des notifications à un ensemble de sujets Pub/Sub configurés chaque fois que vos ressources sont modifiées. De plus, inventaire des éléments cloud accepte la configuration de conditions sur vos flux, ce qui vous permet de surveiller des modifications spécifiques pour certains types d'éléments. Pour découvrir comment déclencher des workflows sur les modifications d'éléments, consultez la documentation Pub/Sub.
Exporter des éléments vers BigQuery
L'exportation de vos secrets et de vos versions de secrets vers BigQuery vous permet d'exécuter des requêtes de type SQL sur de grandes quantités de données et de générer des insights pertinents sur vos éléments. Avant d'exporter vos éléments, assurez-vous que votre ensemble de données et vos comptes de service sont correctement configurés.
Pour exporter vos éléments, exécutez la commande suivante :
gcloud
Avant d'utiliser les données de la commande ci-dessous, effectuez les remplacements suivants :
- CONTENT_TYPE : type de contenu de l'élément (
RESOURCE). - PROJECT_ID : ID du projet contenant les secrets à analyser.
- SNAPSHOT_TIME : heure à laquelle prendre un instantané des ressources. La période est comprise entre maintenant et les cinq dernières semaines.
- BIGQUERY_PROJECT_ID : ID du projet dans lequel se trouve la table BigQuery.
- DATASET_ID : ID de l'ensemble de données BigQuery.
- TABLE_NAME : table vers laquelle vous exportez les métadonnées. Si elle n'existe pas, elle est créée.
Exécutez la commande suivante :
Linux, macOS ou 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
Pour en savoir plus, consultez la page Exporter vers BigQuery.
Exemples de requêtes
Utilisez ces exemples de requêtes pour rechercher des secrets et des versions de secrets avec des propriétés spécifiques.
Secrets créés au cours des deux dernières semaines
Recherchez les secrets (et leurs propriétés) qui ont été ajoutés à votre organisation au cours des deux dernières semaines.
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);
Remplacez BIGQUERY_TABLE par le chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
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"
Remplacez PROJECT_ID par l'ID du projet contenant les secrets à analyser.
Secrets répliqués automatiquement
Recherchez tous les secrets répliqués automatiquement.
BigQuery
SELECT * FROM BIGQUERY_TABLE WHERE asset_type='secretmanager.googleapis.com/Secret' AND JSON_EXTRACT(resource.data, '$.replication.automatic') IS NOT NULL;
Remplacez BIGQUERY_TABLE par le chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
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"
Remplacez PROJECT_ID par l'ID du projet contenant les secrets à analyser.
Secrets répliqués dans un emplacement spécifique
Recherchez tous les secrets stockés dans un emplacement spécifique, tel que 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;
Remplacez BIGQUERY_TABLE par le chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
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"
Remplacez les éléments suivants :
- PROJECT_ID : ID du projet contenant les secrets à analyser
- LOCATION : l' Google Cloud emplacement du secret
Versions de secrets créées il y a plus de 180 jours
Répertoriez toutes les versions de secrets créées il y a plus de 180 jours.
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";
Remplacez BIGQUERY_TABLE par le chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
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"
Remplacez PROJECT_ID par l'ID du projet contenant les secrets à analyser.
Secrets sans CMEK configuré
Répertoriez tous les secrets qui ne sont pas chiffrés avec des clés de chiffrement Customer-Manager (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 );
Remplacez BIGQUERY_TABLE par le chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
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"
Remplacez PROJECT_ID par l'ID du projet contenant les secrets à analyser.
Secrets avec CMEK configuré
Répertoriez tous les secrets qui sont chiffrés avec 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 );
Remplacez BIGQUERY_TABLE par le chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
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"
Remplacez PROJECT_ID par l'ID du projet contenant les secrets à analyser.
Secrets chiffrés avec une clé CMEK spécifique
Recherchez les secrets qui sont chiffrés avec une clé CMEK spécifique.
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 );
Remplacez les éléments suivants :
-
BIGQUERY_TABLE : chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
-
KMS_KEY_NAME : ID de la clé ou identifiant complet de la clé
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"
Remplacez les éléments suivants :
- PROJECT_ID : ID du projet contenant les secrets à analyser
- KMS_KEY_NAME : ID de la clé ou identifiant complet de la clé
Versions de secrets sans CMEK configuré
Recherchez toutes les versions de secrets activées qui ne sont pas chiffrées avec 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";
Remplacez BIGQUERY_TABLE par le chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
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"
Remplacez PROJECT_ID par l'ID du projet contenant les secrets à analyser.
Versions de secrets chiffrées avec une clé CMEK spécifique
Répertoriez toutes les versions de secrets activées chiffrées avec une version de CMEK spécifique.
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";
Remplacez les éléments suivants :
-
BIGQUERY_TABLE : chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
-
KMS_KEY_VERSION_NAME : numéro de version de la clé 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"
Remplacez les éléments suivants :
- PROJECT_ID : ID du projet contenant les secrets à analyser
- KMS_KEY_VERSION_NAME : ID de la version de la clé
Secrets sans rotation configurée
Recherchez tous les secrets qui ne disposent pas d'un calendrier de rotation.
BigQuery
SELECT * FROM BIGQUERY_TABLE WHERE asset_type='secretmanager.googleapis.com/Secret' AND JSON_EXTRACT(resource.data, '$.rotation') IS NULL;
Remplacez BIGQUERY_TABLE par le chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
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"
Remplacez PROJECT_ID par l'ID du projet contenant les secrets à analyser.
Secrets avec une période de rotation spécifique
Recherchez tous les secrets dont la rotation est prévue moins d'une fois tous les 90 jours :
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)
Remplacez BIGQUERY_TABLE par le chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
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"
Remplacez PROJECT_ID par l'ID du projet contenant les secrets à analyser.
Secrets qui expireront dans les 30 prochains jours
Répertoriez les secrets qui expireront dans les 30 prochains jours.
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);
Remplacez BIGQUERY_TABLE par le chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
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"
Remplacez PROJECT_ID par l'ID du projet contenant les secrets à analyser.
Secrets avec un sujet Pub/Sub configuré
Répertoriez tous les secrets pour lesquels au moins un sujet Pub/Sub est configuré.
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
Remplacez BIGQUERY_TABLE par le chemin d'accès complet à la table BigQuery vers laquelle vous avez exporté tous les éléments dans la section Exporter des éléments vers BigQuery de ce document.
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"
Remplacez PROJECT_ID par l'ID du projet contenant les secrets à analyser.
Étape suivante
- Découvrez comment utiliser Secret Manager avec d'autres produits.