Secrets mit Cloud Asset Inventory analysieren

Auf dieser Seite erfahren Sie, wie Sie mit Cloud Asset Inventory Ihre Secrets im Blick behalten, Daten zur Analyse exportieren und leistungsstarke Abfragen ausführen, um die erforderlichen Informationen zu erhalten.

Übersicht

Cloud Asset Inventory analysiert Ihre Google Cloud Umgebung und erfasst alle Änderungen an Ihren Cloud-Ressourcen, z. B. an virtuellen Maschinen, Datenbanken, Storage-Buckets und in diesem Zusammenhang an Ihren Secret Manager-Secrets. Die Integration von Secret Manager und Cloud Asset Inventory bietet folgende Vorteile:

  • Abfragen ausführen: Sie können nach bestimmten Geheimnissen suchen oder Muster in Ihren Geheimnissen erkennen.

  • Benachrichtigungen einrichten: Cloud Asset Inventory kann so konfiguriert werden, dass bei bestimmten Ereignissen Benachrichtigungen an Pub/Sub gesendet werden, z. B. wenn Geheimnisse erstellt, geändert oder gelöscht werden.

  • Daten exportieren: Sie können Ihr geheimes Inventar nach BigQuery exportieren, um es ausführlich zu analysieren und Berichte zu erstellen.

  • Secrets verwalten und analysieren: Sie können alle Ihre Secrets an einem Ort (über Projekte und Ihre gesamte Organisation hinweg) aufrufen und Secrets identifizieren, die möglicherweise falsch konfiguriert sind oder gegen die Sicherheitsrichtlinien Ihrer Organisation verstoßen. So können Sie beispielsweise Geheimnisse finden, die nicht regelmäßig rotiert werden oder für die keine geeigneten Zugriffssteuerungen vorhanden sind.

Dies ist eine erweiterte Aufgabe für Secret Manager-Nutzer. Bevor Sie diese Seite lesen, sollten Sie sich mit den folgenden Themen vertraut machen:

Secret Manager abfragen

Wenn Sie Ihre Secrets mit SQL-ähnlichen Abfragen analysieren möchten, empfehlen wir Ihnen, Ihr Secret und Ihre Secret-Versionen nach BigQuery zu exportieren. Secret Manager ist nicht in Asset Search oder Policy Analyzer eingebunden. Bei diesen Abfragen werden die Google Cloud CLI und BigQuery verwendet, um Ihre Assets zu durchsuchen.

Beschränkungen

Die Verwendung von Cloud Asset Inventory zur Analyse von Secret Manager-Ressourcen hat die folgende Einschränkung:

  • Cloud Asset Inventory unterstützt das Exportieren und Auflisten von Snapshots nur für die letzten fünf Wochen.

Asset-Änderungen überwachen

Cloud Asset Inventory verfolgt Echtzeit-Updates und unterstützt das Monitoring dieser Änderungen. Sie können Feeds konfigurieren, um jedes Mal, wenn sich Ihre Ressourcen ändern, Benachrichtigungen an eine Reihe von konfigurierten Pub/Sub-Themen zu senden. Darüber hinaus unterstützt Cloud Asset Inventory das Konfigurieren von Bedingungen für Ihre Feeds, sodass Sie bestimmte Änderungen für bestimmte Asset-Typen überwachen können. In der Pub/Sub-Dokumentation erfahren Sie, wie Sie Workflows bei Asset-Änderungen auslösen.

Assets in BigQuery exportieren

Durch den Export Ihrer Secrets und Secret-Versionen nach BigQuery können Sie SQL-ähnliche Abfragen für große Datenmengen ausführen und wertvolle Informationen über Ihre Assets gewinnen. Prüfen Sie vor dem Export Ihrer Assets, ob Ihr Dataset und Ihre Dienstkonten ordnungsgemäß konfiguriert sind.

Führen Sie den folgenden Befehl aus, um Ihre Assets zu exportieren:

gcloud

Ersetzen Sie folgende Werte, bevor sie einen der Befehlsdaten verwenden:

  • CONTENT_TYPE: Asset-Inhaltstyp (RESOURCE).
  • PROJECT_ID: die ID des Projekts, das die zu analysierenden Geheimnisse enthält.
  • SNAPSHOT_TIME: Zeitpunkt, für den ein Ressourcen-Snapshot erstellt werden soll. Dieser liegt zwischen jetzt und 5 Wochen in der Vergangenheit.
  • BIGQUERY_PROJECT_ID: die ID des Projekts, in dem sich die BigQuery-Tabelle befindet.
  • DATASET_ID: Die ID des BigQuery-Datasets.
  • TABLE_NAME: die Tabelle, in die Sie Ihre Metadaten exportieren. Wenn das nicht der Fall ist, wird es erstellt.

Führen Sie folgenden Befehl aus:

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

Weitere Informationen finden Sie unter Nach BigQuery exportieren.

Beispielabfragen

Mit diesen Beispielabfragen können Sie nach Secrets und Secret-Versionen mit bestimmten Eigenschaften suchen.

Secrets, die in den letzten zwei Wochen erstellt wurden

Suchen Sie nach Secrets (und ihren Properties), die Ihrer Organisation in den letzten zwei Wochen hinzugefügt wurden.

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

Ersetzen Sie BIGQUERY_TABLE durch den vollständigen Pfad zur BigQuery-Tabelle, in die Sie alle Assets exportiert haben, wie im Abschnitt Assets in BigQuery exportieren dieses Dokuments beschrieben.

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"
  

Ersetzen Sie PROJECT_ID durch die ID des Projekts, das die zu analysierenden Geheimnisse enthält.

Automatisch replizierte Secrets

Alle automatisch replizierten Secrets finden

BigQuery

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

Ersetzen Sie BIGQUERY_TABLE durch den vollständigen Pfad zur BigQuery-Tabelle, in die Sie alle Assets exportiert haben, wie im Abschnitt Assets in BigQuery exportieren dieses Dokuments beschrieben.

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"
  

Ersetzen Sie PROJECT_ID durch die ID des Projekts, das die zu analysierenden Geheimnisse enthält.

Secrets, die an einen bestimmten Speicherort repliziert wurden

Alle an einem bestimmten Speicherort (z. B. us-central1) gespeicherten Geheimnisse aufrufen

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;
  

Ersetzen Sie BIGQUERY_TABLE durch den vollständigen Pfad zur BigQuery-Tabelle, in die Sie alle Assets exportiert haben, wie im Abschnitt Assets in BigQuery exportieren dieses Dokuments beschrieben.

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"
  

Ersetzen Sie Folgendes:

  • PROJECT_ID: die ID des Projekts, das die zu analysierenden Geheimnisse enthält
  • LOCATION: den Google Cloud Speicherort des Secrets

Secret-Versionen, die vor mehr als 180 Tagen erstellt wurden

Listen Sie alle Secret-Versionen auf, die vor mehr als 180 Tagen erstellt wurden.

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

Ersetzen Sie BIGQUERY_TABLE durch den vollständigen Pfad zur BigQuery-Tabelle, in die Sie alle Assets exportiert haben, wie im Abschnitt Assets in BigQuery exportieren dieses Dokuments beschrieben.

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"
  

Ersetzen Sie PROJECT_ID durch die ID des Projekts, das die zu analysierenden Geheimnisse enthält.

Secrets ohne konfigurierten CMEK

Listen Sie alle Secrets auf, die nicht mit vom Kunden verwalteten Verschlüsselungsschlüsseln (CMEK) verschlüsselt wurden:

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

Ersetzen Sie BIGQUERY_TABLE durch den vollständigen Pfad zur BigQuery-Tabelle, in die Sie alle Assets exportiert haben, wie im Abschnitt Assets in BigQuery exportieren dieses Dokuments beschrieben.

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"
  

Ersetzen Sie PROJECT_ID durch die ID des Projekts, das die zu analysierenden Geheimnisse enthält.

Secrets mit konfiguriertem CMEK

Listet alle Secrets auf, die mit CMEK verschlüsselt wurden.

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

Ersetzen Sie BIGQUERY_TABLE durch den vollständigen Pfad zur BigQuery-Tabelle, in die Sie alle Assets exportiert haben, wie im Abschnitt Assets in BigQuery exportieren dieses Dokuments beschrieben.

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"
  

Ersetzen Sie PROJECT_ID durch die ID des Projekts, das die zu analysierenden Geheimnisse enthält.

Mit einem bestimmten CMEK verschlüsselte Secrets

Secrets suchen, die mit einem bestimmten CMEK verschlüsselt wurden

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

Ersetzen Sie Folgendes:

  • BIGQUERY_TABLE: Der vollständige Pfad zur BigQuery-Tabelle, in die Sie alle Assets im Abschnitt Assets in BigQuery exportieren dieses Dokuments exportiert haben.

  • KMS_KEY_NAME: die ID des Schlüssels oder die voll qualifizierte Kennzeichnung für den Schlüssel

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"
  

Ersetzen Sie Folgendes:

  • PROJECT_ID: die ID des Projekts, das die zu analysierenden Geheimnisse enthält
  • KMS_KEY_NAME: die ID des Schlüssels oder die voll qualifizierte Kennzeichnung für den Schlüssel

Secret-Versionen ohne konfigurierten CMEK

Alle aktivierten Secret-Versionen finden, die nicht mit einem CMEK verschlüsselt wurden

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

Ersetzen Sie BIGQUERY_TABLE durch den vollständigen Pfad zur BigQuery-Tabelle, in die Sie alle Assets exportiert haben, wie im Abschnitt Assets in BigQuery exportieren dieses Dokuments beschrieben.

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"
  

Ersetzen Sie PROJECT_ID durch die ID des Projekts, das die zu analysierenden Geheimnisse enthält.

Secret-Versionen, die mit einem bestimmten CMEK verschlüsselt wurden

Alle aktivierten Secret-Versionen auflisten, die mit einer bestimmten CMEK-Version verschlüsselt wurden.

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

Ersetzen Sie Folgendes:

  • BIGQUERY_TABLE: Der vollständige Pfad zur BigQuery-Tabelle, in die Sie alle Assets im Abschnitt Assets in BigQuery exportieren dieses Dokuments exportiert haben.

  • KMS_KEY_VERSION_NAME: die Versionsnummer des Cloud Key Management Service-Schlüssels

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"
  

Ersetzen Sie Folgendes:

  • PROJECT_ID: die ID des Projekts, das die zu analysierenden Geheimnisse enthält
  • KMS_KEY_VERSION_NAME: die ID der Schlüsselversion

Secrets ohne konfigurierte Rotation

Nach Secrets suchen, die keinen Rotationsplan haben

BigQuery

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

Ersetzen Sie BIGQUERY_TABLE durch den vollständigen Pfad zur BigQuery-Tabelle, in die Sie alle Assets exportiert haben, wie im Abschnitt Assets in BigQuery exportieren dieses Dokuments beschrieben.

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"
  

Ersetzen Sie PROJECT_ID durch die ID des Projekts, das die zu analysierenden Geheimnisse enthält.

Secrets mit einem bestimmten Rotationszeitraum

Alle Secrets suchen, die planmäßig weniger als einmal alle 90 Tage rotiert werden:

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)
  

Ersetzen Sie BIGQUERY_TABLE durch den vollständigen Pfad zur BigQuery-Tabelle, in die Sie alle Assets exportiert haben, wie im Abschnitt Assets in BigQuery exportieren dieses Dokuments beschrieben.

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"
  

Ersetzen Sie PROJECT_ID durch die ID des Projekts, das die zu analysierenden Geheimnisse enthält.

Secrets, die in den nächsten 30 Tagen ablaufen

Listen Sie Secrets auf, die in den nächsten 30 Tagen ablaufen.

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

Ersetzen Sie BIGQUERY_TABLE durch den vollständigen Pfad zur BigQuery-Tabelle, in die Sie alle Assets exportiert haben, wie im Abschnitt Assets in BigQuery exportieren dieses Dokuments beschrieben.

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"
  

Ersetzen Sie PROJECT_ID durch die ID des Projekts, das die zu analysierenden Geheimnisse enthält.

Secrets mit einem konfigurierten Pub/Sub-Thema

Alle Secrets auflisten, für die mindestens ein Pub/Sub-Thema konfiguriert ist.

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
  

Ersetzen Sie BIGQUERY_TABLE durch den vollständigen Pfad zur BigQuery-Tabelle, in die Sie alle Assets exportiert haben, wie im Abschnitt Assets in BigQuery exportieren dieses Dokuments beschrieben.

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"
  

Ersetzen Sie PROJECT_ID durch die ID des Projekts, das die zu analysierenden Geheimnisse enthält.

Nächste Schritte