Cloud ์• ์…‹ ์ธ๋ฒคํ† ๋ฆฌ๋กœ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ถ„์„

์ด ์ฃผ์ œ์—์„œ๋Š” Cloud ์• ์…‹ ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ Secret Manager ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

์ด ๋‚ด์šฉ์€ Secret Manager์— ๋Œ€ํ•œ ๊ณ ๊ธ‰ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋ฅผ ์ฝ๊ธฐ ์ „์— ๋‹ค์Œ ์‚ฌํ•ญ์„ ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฐœ์š”

Secret Manager๋Š” Google Cloud์˜ ๊ด€๋ฆฌํ˜• ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ธ๋ฒคํ† ๋ฆฌ ์‹œ์Šคํ…œ์ธ Cloud ์• ์…‹ ์ธ๋ฒคํ† ๋ฆฌ์™€ ํ†ตํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํ†ตํ•ฉ์„ ํ†ตํ•ด ์กฐ์ง, ํด๋” ๋˜๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋ณด์•ˆ ๋น„๋ฐ€์„ ์‹๋ณ„ํ•˜๊ณ  ๊ฐ์‚ฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์กฐ์ง์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š๋Š” ๊ตฌ์„ฑ์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” ์• ์…‹ ๋ชจ๋‹ˆํ„ฐ๋ง, BigQuery๋กœ ์• ์…‹ ๋‚ด๋ณด๋‚ด๊ธฐ, Secret Manager ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ Cloud ์• ์…‹ ์ธ๋ฒคํ† ๋ฆฌ ์ฟผ๋ฆฌ ์ƒ˜ํ”Œ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

์ฐธ๊ณ 

  • ๋ชจ๋“  ์ฟผ๋ฆฌ์— Google Cloud CLI ๋ฐ BigQuery๋กœ ์ž‘์„ฑ๋œ ์ƒ˜ํ”Œ์ด ์žˆ์ง€๋งŒ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฐ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ BigQuery๋กœ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์• ์…‹์„ BigQuery๋กœ ๋‚ด๋ณด๋‚ด๋ฉด SQL๊ณผ ์œ ์‚ฌํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์˜๋ฏธ ์žˆ๋Š” ๋ถ„์„์„ ์ƒ์„ฑํ•˜๊ณ  ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Secret Manager๋Š” ์• ์…‹ ๊ฒ€์ƒ‰ ๋˜๋Š” ์ •์ฑ… ๋ถ„์„์ž์™€ ํ†ตํ•ฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฟผ๋ฆฌ๋Š” Google Cloud CLI ๋ช…๋ น์ค„ ๋„๊ตฌ์™€ BigQuery์˜ ๊ธฐ๋ณธ ์†์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ์• ์…‹์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.
  • Cloud ์• ์…‹ ์ธ๋ฒคํ† ๋ฆฌ๋Š” ์ง€๋‚œ 5์ฃผ ๋™์•ˆ๋งŒ์˜ ์Šค๋ƒ…์ƒท ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐ ๋‚˜์—ด์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์• ์…‹ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ชจ๋‹ˆํ„ฐ๋ง

Cloud ์• ์…‹ ์ธ๋ฒคํ† ๋ฆฌ๋Š” ์‹ค์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ถ”์ ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์‚ฌํ•ญ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ˆ˜์ •๋  ๋•Œ๋งˆ๋‹ค ๊ตฌ์„ฑ๋œ Pub/Sub ์ฃผ์ œ ๋ชจ์Œ์— ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Cloud ์• ์…‹ ์ธ๋ฒคํ† ๋ฆฌ๋Š” ํ”ผ๋“œ์˜ ์กฐ๊ฑด ๊ตฌ์„ฑ์„ ์ง€์›ํ•˜๋ฏ€๋กœ ํŠน์ • ์• ์…‹ ์œ ํ˜•์˜ ํŠน์ • ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ์…‹ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์›Œํฌํ”Œ๋กœ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์€ Pub/Sub ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

BigQuery๋กœ ์• ์…‹ ๋‚ด๋ณด๋‚ด๊ธฐ

๋ณด์•ˆ ๋น„๋ฐ€๊ณผ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ BigQuery๋กœ ๋‚ด๋ณด๋‚ด๋ฉด ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด SQL๊ณผ ์œ ์‚ฌํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์• ์…‹์— ๋Œ€ํ•œ ์˜๋ฏธ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ์…‹์„ ๋‚ด๋ณด๋‚ด๊ธฐ ์ „์— ๋ฐ์ดํ„ฐ ์„ธํŠธ ๋ฐ ์„œ๋น„์Šค ๊ณ„์ •์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. ์• ์…‹์„ ๋‚ด๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud

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

๊ฐ ํ•ญ๋ชฉ์˜ ์˜๋ฏธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • CONTENT_TYPE: ์• ์…‹ ์ฝ˜ํ…์ธ  ์œ ํ˜•(RESOURCE)์ž…๋‹ˆ๋‹ค.
  • PROJECT_ID: ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์• ์…‹์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค.
  • SNAPSHOT_TIME: ๋ฆฌ์†Œ์Šค์˜ ์Šค๋ƒ…์ƒท์„ ๋งŒ๋“ค ์‹œ๊ฐ„์ด๋ฉฐ, ํ˜„์žฌ์™€ ์ง€๋‚œ 5์ฃผ ์ด๋‚ด์ž…๋‹ˆ๋‹ค.
  • BIGQUERY_TABLE: projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ผ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค.

์ž์„ธํ•œ ๋‚ด์šฉ์€ BigQuery๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ƒ˜ํ”Œ ์ฟผ๋ฆฌ

์ง€๋‚œ 2์ฃผ ๋™์•ˆ ์ƒ์„ฑ๋œ ๋ณด์•ˆ ๋น„๋ฐ€

์ง€๋‚œ 2์ฃผ ๋™์•ˆ ์กฐ์ง์— ์ถ”๊ฐ€๋œ ๋ณด์•ˆ ๋น„๋ฐ€๊ณผ ๊ทธ ์†์„ฑ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

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"

์ž๋™์œผ๋กœ ๋ณต์ œ๋œ ๋ณด์•ˆ ๋น„๋ฐ€

์ž๋™์œผ๋กœ ๋ณต์ œ๋œ ๋ชจ๋“  ๋ณด์•ˆ ๋น„๋ฐ€์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

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"

์ง€์ •๋œ ๋ฆฌ์ „์— ๋ณต์ œ๋œ ๋ณด์•ˆ ๋น„๋ฐ€

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"

180์ผ ์ด์ƒ ์‚ฌ์šฉ ์„ค์ •๋œ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „

180์ผ ์ด์ „์— ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

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"

CMEK๊ฐ€ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์€ ๋ณด์•ˆ ๋น„๋ฐ€

๊ณ ๊ฐ ๊ด€๋ฆฌ์ž ์•”ํ˜ธํ™” ํ‚ค(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"

CMEK๊ฐ€ ๊ตฌ์„ฑ๋œ ๋ณด์•ˆ ๋น„๋ฐ€

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"

ํŠน์ • CMEK๋กœ ์•”ํ˜ธํ™”๋œ ๋ณด์•ˆ ๋น„๋ฐ€

ํŠน์ • 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") = 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"

CMEK๊ฐ€ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์€ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „

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"

ํŠน์ • CMEK๋กœ ์•”ํ˜ธํ™”๋œ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „

ํŠน์ • 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") = 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"

์ˆœํ™˜์ด ๊ตฌ์„ฑ๋˜์ง€ ์•Š์€ ๋ณด์•ˆ ๋น„๋ฐ€

์ˆœํ™˜ ์ผ์ •์ด ์—†๋Š” ๋ชจ๋“  ๋ณด์•ˆ ๋น„๋ฐ€์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

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"

ํŠน์ • ์ˆœํ™˜ ๊ธฐ๊ฐ„์ด ์žˆ๋Š” ๋ณด์•ˆ ๋น„๋ฐ€

90์ผ ๋ฏธ๋งŒ๋งˆ๋‹ค ํ•œ ๋ฒˆ ์ˆœํ™˜ํ•˜๋„๋ก ์˜ˆ์•ฝ๋œ ๋ชจ๋“  ๋ณด์•ˆ ๋น„๋ฐ€์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

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"

ํ–ฅํ›„ 30์ผ ์ด๋‚ด์— ๋งŒ๋ฃŒ๋˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€

ํ–ฅํ›„ 30์ผ ์ด๋‚ด์— ๋งŒ๋ฃŒ๋˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

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"

Pub/Sub ์ฃผ์ œ๊ฐ€ ๊ตฌ์„ฑ๋œ ๋ณด์•ˆ ๋น„๋ฐ€

Pub/Sub ์ฃผ์ œ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ๊ตฌ์„ฑ๋œ ๋ชจ๋“  ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

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"

๋‹ค์Œ ๋‹จ๊ณ„