Menganalisis secret dengan Inventaris Aset Cloud

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

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

Ringkasan

Secret Manager terintegrasi dengan Cloud Asset Inventory, sistem inventaris metadata dikelola Google Cloud. Dengan integrasi ini, Anda dapat mengidentifikasi dan mengaudit secret di seluruh organisasi, folder, atau project, dan menemukan konfigurasi 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.

Catatan

  • Meskipun semua kueri memiliki contoh yang ditulis dengan Google Cloud CLI dan BigQuery, sebaiknya ekspor secret dan versi 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 memanfaatkan properti native Google Cloud CLI dan BigQuery untuk menelusuri aset.
  • Inventaris Aset Cloud hanya mendukung ekspor dan listingan snapshot dari lima minggu terakhir.

Memantau Perubahan Aset

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

Mengekspor Aset ke BigQuery

Dengan mengekspor secret dan versi secret ke BigQuery, Anda dapat menjalankan kueri mirip SQL pada data dalam jumlah besar dan menghasilkan insight yang bermakna tentang aset Anda. Sebelum mengekspor aset, pastikan set data dan akun layanan Anda dikonfigurasi dengan benar. Untuk mengekspor aset, 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 untuk mengambil snapshot resource. Periode ini adalah antara sekarang dan 5 minggu yang lalu.
  • BIGQUERY_TABLE: Tabel tujuan ekspor data, dalam format: projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME.

Untuk informasi selengkapnya, lihat Mengekspor ke BigQuery.

Contoh Kueri

Secret yang dibuat dalam dua minggu terakhir

Temukan secret (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 asset list --project=PROJECT_ID \
    --asset-types='secretmanager.googleapis.com/Secret' \
    --snapshot-time=$NOW \
    --content-type='resource' \
    --filter="resource.data.createTime>-P2W"

Secret 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 asset list --project=PROJECT_ID \
    --asset-types='secretmanager.googleapis.com/Secret' \
    --snapshot-time=$NOW \
    --content-type='resource' \
    --filter="resource.data.replication.automatic != NULL"

Secret direplikasi ke region yang ditentukan

Temukan semua secret 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 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"

Mengaktifkan versi secret yang sudah 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 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"

Secret tanpa CMEK yang dikonfigurasi

Cantumkan semua secret (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 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"

Secret dengan CMEK yang dikonfigurasi

Cantumkan semua secret (otomatis dan yang 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 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"

Secret yang dienkripsi dengan CMEK tertentu

Temukan secret yang merupakan versi secret terenkripsi 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 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 yang 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 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 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"

Secret tanpa rotasi yang 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 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 secret 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)

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"

Secret yang akan berakhir masa berlakunya dalam 30 hari ke depan

Mencantumkan secret yang akan berakhir 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 asset list --project=PROJECT_ID \
    --asset-types='secretmanager.googleapis.com/Secret' \
    --snapshot-time=$NOW \
    --content-type='resource' \
    --filter="resource.data.expireTime < PD30"

Secret dengan topik Pub/Sub yang dikonfigurasi

Cantumkan 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 asset list --project=PROJECT_ID \
    --asset-types='secretmanager.googleapis.com/Secret' \
    --snapshot-time=$NOW \
    --content-type='resource' \
    --filter="resource.data.topics !=NULL"

Langkah selanjutnya