Menganalisis secret dengan Inventaris Aset Cloud

Halaman ini menjelaskan cara menggunakan Inventaris Aset Cloud untuk memantau secret, mengekspor data untuk dianalisis, dan menjalankan kueri yang efektif untuk mendapatkan insight yang Anda perlukan.

Ringkasan

Cloud Asset Inventory menganalisis lingkungan Anda dan mencatat setiap perubahan pada resource cloud Anda, seperti virtual machine, database, bucket penyimpanan, dan dalam konteks ini, secret Secret Manager Anda. Google Cloud Integrasi antara Secret Manager dan Cloud Asset Inventory membantu Anda melakukan hal berikut:

  • Menjalankan kueri: Cari rahasia tertentu atau identifikasi pola di seluruh rahasia Anda.

  • Siapkan pemberitahuan: Konfigurasi Inventaris Aset Cloud untuk mengirim notifikasi ke Pub/Sub saat peristiwa tertentu terjadi, seperti saat secret dibuat, diubah, atau dihapus.

  • Mengekspor data: Ekspor inventaris rahasia Anda ke BigQuery untuk analisis mendalam dan pelaporan.

  • Mengelola dan menganalisis rahasia Anda: Lihat semua rahasia Anda di satu tempat (di seluruh project dan seluruh organisasi Anda) dan identifikasi rahasia yang mungkin salah dikonfigurasi atau melanggar kebijakan keamanan organisasi Anda. Misalnya, Anda dapat menemukan secret yang tidak diubah secara berkala atau tidak memiliki kontrol akses yang tepat.

Ini adalah tugas lanjutan untuk pengguna Secret Manager. Sebelum membaca halaman ini, sebaiknya Anda membaca halaman berikut:

Mengirim kueri ke Secret Manager

Untuk menganalisis secret Anda dengan kueri mirip SQL, sebaiknya ekspor secret dan versi secret Anda ke BigQuery. Secret Manager tidak terintegrasi dengan Penelusuran Aset atau Penganalisis Kebijakan. Kueri ini menggunakan Google Cloud CLI dan BigQuery untuk menelusuri aset Anda.

Batasan

Penggunaan Inventaris Aset Cloud untuk menganalisis resource Secret Manager memiliki batasan berikut:

  • Inventaris Aset Cloud mendukung pengeksporan dan pencantuman snapshot hanya untuk lima minggu terakhir.

Memantau perubahan aset

Inventaris Aset Cloud melacak pembaruan real-time dan mendukung pemantauan perubahan ini. Anda dapat mengonfigurasi feed untuk mengirim notifikasi ke serangkaian topik Pub/Sub yang dikonfigurasi setiap kali ada modifikasi pada resource Anda. Selain itu, Inventaris Aset Cloud mendukung konfigurasi kondisi pada feed Anda, sehingga Anda dapat memantau perubahan tertentu untuk jenis aset tertentu. Untuk mempelajari cara memicu alur kerja pada perubahan aset, lihat dokumentasi Pub/Sub.

Mengekspor aset ke BigQuery

Mengekspor rahasia dan versi rahasia ke BigQuery memungkinkan Anda menjalankan kueri mirip SQL atas sejumlah besar data dan menghasilkan insight yang bermakna tentang aset Anda. Sebelum Anda mengekspor aset, pastikan kumpulan data dan akun layanan Anda dikonfigurasi dengan benar.

Untuk mengekspor aset, jalankan perintah berikut:

gcloud

Sebelum menggunakan salah satu data perintah di bawah, lakukan penggantian berikut:

  • CONTENT_TYPE: jenis konten aset (RESOURCE).
  • PROJECT_ID: ID project yang berisi rahasia yang akan dianalisis.
  • SNAPSHOT_TIME: time saat membuat snapshot resource. Rentang waktu ini bisa antara waktu saat ini dan 5 minggu sebelumnya.
  • BIGQUERY_PROJECT_ID: ID project tempat tabel BigQuery berada.
  • DATASET_ID: ID set data BigQuery.
  • TABLE_NAME: tabel tempat Anda mengekspor metadata. Jika tidak ada, maka akan dibuat.

Jalankan perintah berikut:

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

Untuk mengetahui informasi selengkapnya, lihat Mengekspor ke BigQuery.

Sampel kueri

Gunakan contoh kueri ini untuk menemukan secret dan versi secret dengan properti tertentu.

Secret yang dibuat dalam dua minggu terakhir

Temukan secret (dan propertinya) yang ditambahkan ke organisasi Anda dalam dua minggu terakhir.

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

Ganti BIGQUERY_TABLE dengan jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

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"
  

Ganti PROJECT_ID dengan ID project yang berisi secret yang akan dianalisis.

Rahasia direplikasi secara otomatis

Menemukan semua secret yang direplikasi secara otomatis.

BigQuery

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

Ganti BIGQUERY_TABLE dengan jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

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"
  

Ganti PROJECT_ID dengan ID project yang berisi secret yang akan dianalisis.

Secret direplikasi ke lokasi tertentu

Temukan semua secret yang disimpan di lokasi tertentu, seperti 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;
  

Ganti BIGQUERY_TABLE dengan jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

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"
  

Ganti kode berikut:

  • PROJECT_ID: ID project yang berisi rahasia yang akan dianalisis
  • LOCATION: Google Cloud lokasi secret

Versi secret yang dibuat lebih dari 180 hari yang lalu

Mencantumkan semua versi secret yang dibuat lebih dari 180 hari yang lalu.

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

Ganti BIGQUERY_TABLE dengan jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

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"
  

Ganti PROJECT_ID dengan ID project yang berisi secret yang akan dianalisis.

Secret tanpa CMEK yang dikonfigurasi

Mencantumkan semua secret yang tidak dienkripsi dengan kunci enkripsi yang dikelola pelanggan (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
      );
  

Ganti BIGQUERY_TABLE dengan jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

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"
  

Ganti PROJECT_ID dengan ID project yang berisi secret yang akan dianalisis.

Secret dengan CMEK yang dikonfigurasi

Mencantumkan semua secret yang dienkripsi dengan 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
    );
  

Ganti BIGQUERY_TABLE dengan jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

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"
  

Ganti PROJECT_ID dengan ID project yang berisi secret yang akan dianalisis.

Secret yang dienkripsi dengan CMEK tertentu

Menemukan secret yang dienkripsi dengan CMEK tertentu.

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

Ganti kode berikut:

  • BIGQUERY_TABLE: jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

  • KMS_KEY_NAME: ID kunci atau ID yang memenuhi syarat sepenuhnya untuk kunci

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"
  

Ganti kode berikut:

  • PROJECT_ID: ID project yang berisi rahasia yang akan dianalisis
  • KMS_KEY_NAME: ID kunci atau ID yang memenuhi syarat sepenuhnya untuk kunci

Versi rahasia tanpa CMEK yang dikonfigurasi

Temukan semua versi rahasia yang diaktifkan yang tidak dienkripsi dengan 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";
  

Ganti BIGQUERY_TABLE dengan jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

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"
  

Ganti PROJECT_ID dengan ID project yang berisi secret yang akan dianalisis.

Versi rahasia yang dienkripsi dengan CMEK tertentu

Mencantumkan semua versi rahasia yang diaktifkan dan dienkripsi dengan versi CMEK tertentu.

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

Ganti kode berikut:

  • BIGQUERY_TABLE: jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

  • KMS_KEY_VERSION_NAME: nomor versi kunci 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"
  

Ganti kode berikut:

  • PROJECT_ID: ID project yang berisi rahasia yang akan dianalisis
  • KMS_KEY_VERSION_NAME: ID versi kunci

Secret tanpa rotasi yang dikonfigurasi

Temukan semua secret yang tidak memiliki jadwal rotasi.

BigQuery

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

Ganti BIGQUERY_TABLE dengan jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

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"
  

Ganti PROJECT_ID dengan ID project yang berisi secret yang akan dianalisis.

Secret dengan periode rotasi tertentu

Temukan semua rahasia yang dijadwalkan untuk dirotasi kurang dari sekali setiap 90 hari:

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)
  

Ganti BIGQUERY_TABLE dengan jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

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"
  

Ganti PROJECT_ID dengan ID project yang berisi secret yang akan dianalisis.

Secret yang akan berakhir dalam 30 hari ke depan

Mencantumkan secret yang akan berakhir dalam 30 hari ke depan.

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

Ganti BIGQUERY_TABLE dengan jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

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"
  

Ganti PROJECT_ID dengan ID project yang berisi secret yang akan dianalisis.

Secret dengan topik Pub/Sub yang dikonfigurasi

Mencantumkan semua secret yang telah mengonfigurasi setidaknya satu topik 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
  

Ganti BIGQUERY_TABLE dengan jalur lengkap ke tabel BigQuery tempat Anda mengekspor semua aset di bagian Mengekspor aset ke BigQuery dalam dokumen ini.

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"
  

Ganti PROJECT_ID dengan ID project yang berisi secret yang akan dianalisis.

Langkah berikutnya