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 ambiente Google Cloud e registra eventuali modifiche alle tue 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 aiuta a:

  • Esegui query: cerca segreti specifici o identifica pattern nei tuoi segreti.

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

  • Esportare i dati: esporta il tuo inventario segreto in BigQuery per analisi approfondite e report.

  • Gestisci e analizza i tuoi secret: visualizza tutti i tuoi secret in un unico posto (in tutti i progetti e in tutta l'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 dell'accesso adeguati.

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

Esecuzione di query su Secret Manager

Per analizzare i segreti con query di tipo SQL, ti consigliamo di esportare il segreto e le versioni del segreto in BigQuery. Secret Manager non è integrato con Asset Search o Analizzatore policy. Queste query utilizzano Google Cloud CLI e BigQuery per cercare gli asset.

Limitazioni

L'utilizzo di Cloud Asset Inventory per analizzare le risorse 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 agli 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 apportata una modifica alle tue risorse. Inoltre, Cloud Asset Inventory supporta la configurazione delle condizioni nei 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 segreti e delle relative versioni in BigQuery ti consente di eseguire query di tipo SQL su grandi quantità di dati e ottenere informazioni significative sulle tue risorse. Prima di esportare gli asset, assicurati che il set di dati e gli account di servizio siano configurati correttamente.

Per esportare gli asset, esegui questo comando:

gcloud

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

  • CONTENT_TYPE: il tipo di contenuti dell'asset (RESOURCE).
  • PROJECT_ID: l'ID del progetto contenente i segreti da analizzare.
  • SNAPSHOT_TIME: l'ora in cui creare lo snapshot delle risorse. Questo periodo può essere compreso tra l'ora corrente e 5 settimane nel passato.
  • 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 esportare i metadati. Se non esiste, viene creato.

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, vedi Esportazione in BigQuery.

Query di esempio

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

Secret creati nelle ultime due settimane

Trova i segreti (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 segreti da analizzare.

Segreti replicati automaticamente

Trova tutti i segreti 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 segreti da analizzare.

Segreti replicati in una posizione specifica

Trova tutti i secret archiviati in una posizione 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 posizione del secret

Versioni dei secret create più di 180 giorni fa

Elenca tutte le versioni del 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 segreti 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 segreti 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 segreti 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") = 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 secret senza CMEK configurata

Trova tutte le versioni del 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 segreti da analizzare.

Versioni dei secret criptate con una CMEK specifica

Elenca tutte le versioni del secret abilitate criptate con una specifica versione 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";
  

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 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 della 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 segreti da analizzare.

Secret con un periodo di rotazione specifico

Trova tutti i secret pianificati per essere ruotati 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 segreti da analizzare.

Segreti che scadranno nei prossimi 30 giorni

Elenca i segreti 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 segreti da analizzare.

Secret con un argomento Pub/Sub configurato

Elenca tutti i secret per cui è configurato almeno un argomento 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
  

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 segreti da analizzare.

Passaggi successivi