Menganalisis rahasia dengan Inventaris Aset Cloud

Dalam topik ini, pelajari cara memanfaatkan Inventaris Aset Cloud untuk menganalisis resource Secret Manager.

Ini adalah topik lanjutan untuk Secret Manager. Sebelum membaca panduan ini, sebaiknya tinjau hal-hal berikut:

Ringkasan

Secret Manager terintegrasi dengan Inventaris Aset Cloud, yaitu sistem inventaris metadata terkelola milik Google Cloud. Dengan integrasi ini, Anda dapat mengidentifikasi dan mengaudit secret di seluruh organisasi, folder, atau project, serta menemukan konfigurasi apa pun yang tidak sesuai dengan persyaratan organisasi Anda. Panduan ini membahas pemantauan aset, mengekspor aset ke BigQuery, dan contoh kueri Inventaris Aset Cloud melalui resource Secret Manager.

Notes

  • Meskipun semua kueri memiliki sampel yang ditulis dengan Google Cloud CLI dan BigQuery, sebaiknya ekspor versi secret dan secret Anda ke BigQuery. Dengan mengekspor aset ke BigQuery, Anda dapat menulis kueri mirip SQL untuk menghasilkan dan menyimpan analisis yang bermakna.
  • Secret Manager tidak terintegrasi dengan Asset Search atau Policy Analyzer. Kueri di bawah ini memanfaatkan properti native Google Cloud CLI dan BigQuery untuk menelusuri aset.
  • Inventaris Aset Cloud hanya mendukung ekspor dan listingan snapshot dalam 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 sekumpulan topik Pub/Sub yang dikonfigurasi setiap kali resource Anda diubah. Selain itu, Inventaris Aset Cloud mendukung konfigurasi kondisi pada feed, sehingga Anda dapat memantau perubahan tertentu untuk jenis aset tertentu. Lihat dokumentasi Pub/Sub untuk mempelajari cara memicu alur kerja saat perubahan aset.

Mengekspor Aset ke BigQuery

Dengan mengekspor secret dan versi secret ke BigQuery, Anda dapat menjalankan kueri yang mirip SQL pada data dalam jumlah besar dan menghasilkan insight yang berarti tentang aset. Sebelum mengekspor aset, pastikan set data dan akun layanan Anda dikonfigurasi dengan benar. Untuk mengekspor aset Anda, jalankan perintah berikut:

gcloud

$ gcloud asset export \
   --content-type CONTENT_TYPE \
   --project PROJECT_ID \
   --snapshot-time SNAPSHOT_TIME \
   --bigquery-table BIGQUERY_TABLE \
   --output-bigquery-force

dengan:

  • CONTENT_TYPE: Jenis konten aset (RESOURCE).
  • PROJECT_ID: Project ID yang berisi aset yang akan dipantau.
  • SNAPSHOT_TIME: Waktu saat mengambil resource snapshot. Ini terjadi antara sekarang dan 5 minggu yang lalu.
  • BIGQUERY_TABLE: Tabel untuk mengekspor data, dalam format: projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME.

Untuk mengetahui informasi selengkapnya, lihat Mengekspor ke BigQuery.

Contoh Kueri

Rahasia dibuat dalam dua minggu terakhir

Temukan rahasia (dan propertinya) yang ditambahkan ke organisasi Anda dalam dua minggu terakhir:

BigQuery

SELECT name, FROM PROJECT_ID.DATASET_ID.TABLE_NAME
WHERE asset_type='secretmanager.googleapis.com/Secret' AND
DATE(JSON_VALUE(resource.data, '$.createTime')) > DATE_SUB(CURRENT_DATE(), INTERVAL 2 WEEK);

gcloud

$ NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
$ gcloud beta asset list --project=PROJECT_ID \
    --asset-types='secretmanager.googleapis.com/Secret' \
    --snapshot-time=$NOW \
    --content-type='resource' \
    --filter="resource.data.createTime>-P2W"

Rahasia yang direplikasi secara otomatis

Temukan semua secret yang direplikasi secara otomatis:

BigQuery

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

gcloud

$ NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
$ gcloud beta asset list --project=PROJECT_ID \
    --asset-types='secretmanager.googleapis.com/Secret' \
    --snapshot-time=$NOW \
    --content-type='resource' \
    --filter="resource.data.replication.automatic != NULL"

Rahasia direplikasi ke region yang ditentukan

Temukan semua rahasia yang direplikasi ke us-central1:

BigQuery

SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME
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;

gcloud

$ NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
$ gcloud beta asset list --project=PROJECT_ID \
    --asset-types='secretmanager.googleapis.com/Secret' \
    --snapshot-time=$NOW \
    --content-type='resource' \
    --filter="resource.data.replication.userManaged.replicas.location=us-central1"

Versi secret diaktifkan lebih dari 180 hari

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

BigQuery

SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME
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";

gcloud

$ NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
$ gcloud beta 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"

Rahasia tanpa CMEK dikonfigurasi

Cantumkan semua rahasia (otomatis dan dikelola pengguna) yang tidak dienkripsi dengan kunci enkripsi pengelola pelanggan (CMEK):

BigQuery

SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME
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
  );

gcloud

$ NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
$ gcloud beta 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"

Rahasia dengan CMEK dikonfigurasi

Cantumkan semua secret (otomatis dan dikelola pengguna) yang dienkripsi dengan CMEK:

BigQuery

SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME
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
);

gcloud

$ NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
$ gcloud beta 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"

Rahasia yang dienkripsi dengan CMEK tertentu

Menemukan secret yang merupakan versi secret yang dienkripsi dengan CMEK tertentu:

BigQuery

SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME
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
  );

gcloud

$ NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
$ gcloud beta 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"

Versi secret tanpa CMEK dikonfigurasi

Temukan semua versi secret yang diaktifkan dan tidak dienkripsi dengan CMEK:

BigQuery

SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME
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";

gcloud

$ NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
$ gcloud beta 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"

Versi secret yang dienkripsi dengan CMEK tertentu

Mencantumkan semua versi secret yang diaktifkan dan dienkripsi dengan versi CMEK tertentu:

BigQuery

SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME
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";

gcloud

$ NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
$ gcloud beta 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"

Rahasia tanpa rotasi dikonfigurasi

Temukan semua secret yang tidak memiliki jadwal rotasi:

BigQuery

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

gcloud

$ NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
$ gcloud beta asset list --project=PROJECT_ID \
    --asset-types='secretmanager.googleapis.com/Secret' \
    --snapshot-time=$NOW \
    --content-type='resource' \
    --filter="resource.data.rotation=NULL"

Secret dengan periode rotasi tertentu

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

BigQuery

SELECT *
FROM PROJECT_ID.DATASET_ID.TABLE_NAME
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)

Rahasia yang akan habis masa berlakunya dalam 30 hari ke depan

Buat daftar secret yang akan habis masa berlakunya dalam 30 hari ke depan:

BigQuery

SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME
WHERE asset_type='secretmanager.googleapis.com/Secret' AND
DATE(JSON_VALUE(resource.data, '$.expireTime')) < DATE_ADD(CURRENT_DATE(), INTERVAL 30 DAY);

gcloud

$ NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
$ gcloud beta asset list --project=PROJECT_ID \
    --asset-types='secretmanager.googleapis.com/Secret' \
    --snapshot-time=$NOW \
    --content-type='resource' \
    --filter="resource.data.expireTime < PD30"

Rahasia dengan topik Pub/Sub dikonfigurasi

Buat daftar semua secret yang memiliki setidaknya satu topik Pub/Sub yang dikonfigurasi:

BigQuery

SELECT name, ARRAY_LENGTH(JSON_EXTRACT_ARRAY(resource.data, '$.topics')) AS topics_count,
FROM PROJECT_ID.DATASET_ID.TABLE_NAME
WHERE asset_type='secretmanager.googleapis.com/Secret' AND
ARRAY_LENGTH(JSON_EXTRACT_ARRAY(resource.data, '$.topics')) > 0

gcloud

$ NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
$ gcloud beta asset list --project=PROJECT_ID \
    --asset-types='secretmanager.googleapis.com/Secret' \
    --snapshot-time=$NOW \
    --content-type='resource' \
    --filter="resource.data.topics !=NULL"

Langkah selanjutnya