Analizza i secret con Cloud Asset Inventory

Questa pagina spiega come utilizzare Cloud Asset Inventory per monitorare i secret, esportare i dati per l'analisi ed eseguire query avanzate per ottenere le informazioni di cui hai bisogno.

Panoramica

Cloud Asset Inventory analizza il tuo Google Cloud ambiente e registra eventuali modifiche alle risorse cloud, come macchine virtuali, database, bucket di archiviazione e, in questo contesto, i secret di Secret Manager. L'integrazione tra Secret Manager e Cloud Asset Inventory ti consente di:

  • Eseguire query: cerca secret specifici o identifica pattern nei tuoi secret.

  • Configurare avvisi: configura Cloud Asset Inventory per inviare notifiche a Pub/Sub quando si verificano eventi specifici, ad esempio quando vengono creati, modificati o eliminati secret.

  • Esportare i dati: esporta l'inventario dei secret in BigQuery per analisi approfondite e report.

  • Gestire e analizzare i secret: visualizza tutti i secret in un unico posto (tra progetti e l'intera organizzazione) e identifica i secret che potrebbero essere configurati in modo errato o violare le norme di sicurezza della tua organizzazione. Ad esempio, puoi trovare secret che non vengono ruotati regolarmente o che non dispongono di controlli di accesso appropriati.

Questa è un'attività avanzata per gli utenti di Secret Manager. Prima di leggere questa pagina, ti consigliamo di leggere quanto segue:

Eseguire query su Secret Manager

Per analizzare i secret con query di tipo SQL, ti consigliamo di esportare i secret e le relative versioni in BigQuery. Secret Manager non è integrato con Asset Search o Policy Analyzer. Queste query utilizzano Google Cloud CLI e BigQuery per cercare gli asset.

Limitazioni

L'utilizzo di Cloud Asset Inventory per analizzare le risorse di Secret Manager presenta la seguente limitazione:

  • Cloud Asset Inventory supporta l'esportazione e l'elenco degli snapshot solo per le ultime cinque settimane.

Monitorare le modifiche degli asset

Cloud Asset Inventory tiene traccia degli aggiornamenti in tempo reale e supporta il monitoraggio di queste modifiche. Puoi configurare i feed per inviare notifiche a un insieme di argomenti Pub/Sub configurati ogni volta che viene modificata una risorsa. Inoltre, Cloud Asset Inventory supporta la configurazione delle condizioni sui feed, in modo da poter monitorare modifiche specifiche per determinati tipi di asset. Per scoprire come attivare i flussi di lavoro in caso di modifiche agli asset, consulta la documentazione di Pub/Sub.

Esportare asset in BigQuery

L'esportazione dei secret e delle relative versioni in BigQuery consente di eseguire query di tipo SQL su grandi quantità di dati e di ottenere informazioni significative sugli asset. Prima di esportare gli asset, assicurati che il set di dati e gli account di servizio siano configurati correttamente.

Per esportare gli asset, esegui il seguente comando:

gcloud

Prima di utilizzare i dati dei comandi riportati di seguito, effettua le seguenti sostituzioni:

  • CONTENT_TYPE: il tipo di contenuto dell'asset (RESOURCE).
  • PROJECT_ID: l'ID del progetto contenente i secret da analizzare.
  • SNAPSHOT_TIME: l'ora in cui creare lo snapshot delle risorse. Può essere compresa tra l'ora attuale e 5 settimane fa.
  • BIGQUERY_PROJECT_ID: l'ID del progetto in cui si trova la tabella BigQuery.
  • DATASET_ID: l'ID del set di dati BigQuery.
  • TABLE_NAME: la tabella in cui esporti i metadati. Se non esiste, viene creata.

Esegui questo 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

Per ulteriori informazioni, consulta la sezione Esportare in BigQuery.

Query di esempio

Utilizza queste query di esempio per trovare secret e versioni di secret con proprietà specifiche.

Secret creati nelle ultime due settimane

Trova i secret (e le relative proprietà) aggiunti alla tua organizzazione nelle ultime due settimane.

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

Sostituisci BIGQUERY_TABLE con il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo 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"
  

Sostituisci PROJECT_ID con l'ID del progetto contenente i secret da analizzare.

Secret replicati automaticamente

Trova tutti i secret replicati automaticamente.

BigQuery

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

Sostituisci BIGQUERY_TABLE con il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo 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"
  

Sostituisci PROJECT_ID con l'ID del progetto contenente i secret da analizzare.

Secret replicati in una località specifica

Trova tutti i secret archiviati in una località specifica, ad esempio 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;
  

Sostituisci BIGQUERY_TABLE con il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo 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"
  

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto contenente i secret da analizzare
  • LOCATION: la Google Cloud località del secret

Versioni di secret create più di 180 giorni fa

Elenca tutte le versioni di secret create più di 180 giorni fa.

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

Sostituisci BIGQUERY_TABLE con il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo 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"
  

Sostituisci PROJECT_ID con l'ID del progetto contenente i secret da analizzare.

Secret senza CMEK configurata

Elenca tutti i secret non criptati con chiavi di crittografia gestite dal 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
      );
  

Sostituisci BIGQUERY_TABLE con il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo 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"
  

Sostituisci PROJECT_ID con l'ID del progetto contenente i secret da analizzare.

Secret con CMEK configurata

Elenca tutti i secret criptati 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
    );
  

Sostituisci BIGQUERY_TABLE con il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo 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"
  

Sostituisci PROJECT_ID con l'ID del progetto contenente i secret da analizzare.

Secret criptati con una CMEK specifica

Trova i secret criptati con una CMEK specifica.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret'
      AND (
        JSON_VALUE(resource.data, "$.replication.automatic.customerManagedEncryption.kmsKeyName&quot;) = KMS_KEY_NAME
        OR JSON_VALUE(resource.data, "$.replication.userManaged.replicas[0].customerManagedEncryption.kmsKeyName") = KMS_KEY_NAME
      );
  

Sostituisci quanto segue:

  • BIGQUERY_TABLE: il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo documento.

  • KMS_KEY_NAME: l'ID della chiave o l'identificatore completo della chiave

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"
  

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto contenente i secret da analizzare
  • KMS_KEY_NAME: l'ID della chiave o l'identificatore completo della chiave

Versioni di secret senza CMEK configurata

Trova tutte le versioni di secret abilitate che non sono criptate 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";
  

Sostituisci BIGQUERY_TABLE con il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo 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"
  

Sostituisci PROJECT_ID con l'ID del progetto contenente i secret da analizzare.

Versioni di secret criptate con una CMEK specifica

Elenca tutte le versioni di secret abilitate criptate con una versione CMEK specifica.

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&quot;) = KMS_KEY_VERSION_NAME
    )
    AND JSON_VALUE(resource.data,"$.state")="ENABLED";
  

Sostituisci quanto segue:

  • BIGQUERY_TABLE: il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo documento.

  • KMS_KEY_VERSION_NAME: il numero di versione della chiave di 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"
  

Sostituisci quanto segue:

  • PROJECT_ID: l'ID del progetto contenente i secret da analizzare
  • KMS_KEY_VERSION_NAME: l'ID della versione della chiave

Secret senza rotazione configurata

Trova tutti i secret che non hanno una pianificazione di rotazione.

BigQuery

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

Sostituisci BIGQUERY_TABLE con il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo 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"
  

Sostituisci PROJECT_ID con l'ID del progetto contenente i secret da analizzare.

Secret con un periodo di rotazione specifico

Trova tutti i secret la cui rotazione è pianificata meno di una volta ogni 90 giorni:

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)
  

Sostituisci BIGQUERY_TABLE con il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo 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"
  

Sostituisci PROJECT_ID con l'ID del progetto contenente i secret da analizzare.

Secret che scadranno nei prossimi 30 giorni

Elenca i secret che scadranno nei prossimi 30 giorni.

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

Sostituisci BIGQUERY_TABLE con il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo 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"
  

Sostituisci PROJECT_ID con l'ID del progetto contenente i secret da analizzare.

Secret con un argomento Pub/Sub configurato

Elenca tutti i secret che hanno almeno un argomento Pub/Sub configurato.

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
  

Sostituisci BIGQUERY_TABLE con il percorso completo della tabella BigQuery in cui hai esportato tutti gli asset nella sezione Esportare asset in BigQuery di questo 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"
  

Sostituisci PROJECT_ID con l'ID del progetto contenente i secret da analizzare.

Passaggi successivi