Secret Manager์— ๊ณ ๊ฐ ๊ด€๋ฆฌ ์•”ํ˜ธํ™” ํ‚ค ์‚ฌ์šฉ ์„ค์ •

๊ธฐ๋ณธ์ ์œผ๋กœ Secret Manager๋Š” ์ €์žฅ ์ค‘ ๊ณ ๊ฐ ์ฝ˜ํ…์ธ ๋ฅผ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค. Secret Manager๋Š” ์‚ฌ์šฉ์ž ์ธก์˜ ์ถ”๊ฐ€ ์ž‘์—… ์—†์ด ์ž๋™์œผ๋กœ ์•”ํ˜ธํ™”๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์„ Google ๊ธฐ๋ณธ ์•”ํ˜ธํ™”๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

์•”ํ˜ธํ™” ํ‚ค๋ฅผ ์ œ์–ดํ•˜๋ ค๋ฉด Secret Manager๋ฅผ ํฌํ•จํ•œ CMEK ํ†ตํ•ฉ ์„œ๋น„์Šค์™€ ํ•จ๊ป˜ Cloud KMS์—์„œ ๊ณ ๊ฐ ๊ด€๋ฆฌ ์•”ํ˜ธํ™” ํ‚ค(CMEK)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. Cloud KMS ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณดํ˜ธ ์ˆ˜์ค€, ์œ„์น˜, ์ˆœํ™˜ ์ผ์ •, ์‚ฌ์šฉ ๋ฐ ์•ก์„ธ์Šค ๊ถŒํ•œ, ์•”ํ˜ธํ™” ๊ฒฝ๊ณ„๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Cloud KMS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ‚ค ์‚ฌ์šฉ์„ ์ถ”์ ํ•˜๊ณ , ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ๋ณด๊ณ , ํ‚ค ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. Google์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋Œ€์นญ ํ‚ค ์•”ํ˜ธํ™” ํ‚ค(KEK)๋ฅผ ์†Œ์œ ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์‹  ์‚ฌ์šฉ์ž๊ฐ€ Cloud KMS์—์„œ ์ด๋Ÿฌํ•œ ํ‚ค๋ฅผ ์ œ์–ดํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CMEK๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์„ค์ •ํ•œ ํ›„ Secret Manager ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•˜๋Š” ํ™˜๊ฒฝ์€ Google ๊ธฐ๋ณธ ์•”ํ˜ธํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ์˜ต์…˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณ ๊ฐ ๊ด€๋ฆฌ ์•”ํ˜ธํ™” ํ‚ค(CMEK)๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Secret Manager๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ €์žฅ, ๊ด€๋ฆฌ, ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Cloud KMS Autokey๋ฅผ ์‚ฌ์šฉํ•˜๋Š” CMEK

CMEK๋ฅผ ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ค์–ด Secret Manager ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณดํ˜ธํ•˜๊ฑฐ๋‚˜ Cloud KMS Autokey๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Autokey๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Secret Manager์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ํ•„์š”์— ๋”ฐ๋ผ ํ‚ค๋ง๊ณผ ํ‚ค๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™” ์ž‘์—…์— ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค ์—์ด์ „ํŠธ๊ฐ€ ์—†์œผ๋ฉด ์ƒ์„ฑ๋˜๋ฉฐ, ํ•„์š”ํ•œ Identity and Access Management(IAM) ์—ญํ• ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Autokey ๊ฐœ์š”๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

Secret Manager๋Š” Terraform ๋˜๋Š” REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋งŒ Cloud KMS Autokey์™€ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑ๋œ CMEK๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Secret Manager ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ด ํŽ˜์ด์ง€์˜ ์ž๋™ ๋ณต์ œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” CMEK ๋ฐ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ณต์ œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” CMEK๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Cloud KMS Autokey์—์„œ ๋งŒ๋“  CMEK๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Secret Manager ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด Secret Manager ๋ฆฌ์†Œ์Šค์— Autokey ์‚ฌ์šฉ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

Secret Manager์—์„œ CMEK ์ž‘๋™ ๋ฐฉ์‹

Secret Manager๋Š” ํŠน์ • ์œ„์น˜์— ์žˆ๋Š” ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€์— ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ๊ณ ์œ ํ•œ ๋ฐ์ดํ„ฐ ์•”ํ˜ธํ™” ํ‚ค(DEK)๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด DEK๋Š” Secret Manager ์„œ๋น„์Šค์—์„œ ์†Œ์œ ํ•œ ํ‚ค ์•”ํ˜ธํ™” ํ‚ค(KEK)๋ผ๋Š” ๋ณต์ œ๋ณธ๋ณ„ ํ‚ค๋กœ ์•”ํ˜ธํ™”๋ฉ๋‹ˆ๋‹ค.

Secret Manager์— CMEK๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ KEK๋Š” CMEK ํ‚ค๋ผ๊ณ  ํ•˜๋ฉฐ Cloud KMS ๋‚ด์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๋Œ€์นญ ํ‚ค์ž…๋‹ˆ๋‹ค. CMEK ํ‚ค๋Š” ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „ ๋ณต์ œ๋ณธ๊ณผ ๋™์ผํ•œ Google Cloud ์œ„์น˜์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™”์— ๋Œ€ํ•œ CMEK ์ •์ฑ…์— Cloud EKM ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” CMEK๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก Secret Manager๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. CMEK๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋Š” ์‹œ๊ธฐ์™€ ์ด์œ ๋ฅผ ํฌํ•จํ•œ ์ผ๋ฐ˜์ ์ธ CMEK์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud Key Management Service ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

CMEK๋Š” Secret Manager v1 API ๋ฐ Google Cloud CLI์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ๋™์ผํ•œ ํ”„๋กœ์ ํŠธ์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ณด์•ˆ ๋น„๋ฐ€๊ณผ ํ‚ค๋ฅผ ๋ณ„๋„์˜ ํ”„๋กœ์ ํŠธ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฐ์ •์„ ๋”์šฑ ์ž˜ ์ดํ•ดํ•˜๋ ค๋ฉด Cloud KMS ์—…๋ฌด ๋ถ„์žฅ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ๊ธฐ๋ณธ ์š”๊ฑด์„ ์™„๋ฃŒํ•˜์—ฌ Secret Manager์™€ Cloud KMS๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  • Secret Manager:

    • ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Secret Manager ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.
    • ํ•„์š”ํ•œ ๊ฒฝ์šฐ Secret Manager ๋น ๋ฅธ ์‹œ์ž‘์˜ Secret Manager ๊ตฌ์„ฑ ์„น์…˜์˜ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
  • Cloud KMS:

    • ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cloud KMS ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.
    • ํ•„์š”ํ•œ ๊ฒฝ์šฐ Cloud KMS API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ณ€์ˆ˜๋ฅผ Secret Manager ๋ฐ Cloud KMS ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ID๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

This is an editable variable. Set it to your Secret Manager project ID and the
value will be used in all commands on this page.
SM_PROJECT_ID

This is an editable variable. Set it to your Cloud KMS project ID and the value
will be used in all commands on this page.
KMS_PROJECT_ID

Google Cloud์— ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud auth login

์„œ๋น„์Šค ์—์ด์ „ํŠธ ID ๋งŒ๋“ค๊ธฐ

๊ณ ๊ฐ ๊ด€๋ฆฌ ์•”ํ˜ธํ™” ํ‚ค๊ฐ€ ํ•„์š”ํ•œ ๊ฐ ํ”„๋กœ์ ํŠธ์— ์„œ๋น„์Šค ์—์ด์ „ํŠธ ID๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Google Cloud CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ID๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์„ธ์š”.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud beta services identity create \
    --service "secretmanager.googleapis.com" \
    --project "SM_PROJECT_ID"

๊ทธ๋Ÿฌ๋ฉด ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ์„œ๋น„์Šค ID ์ด๋ฆ„์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

service-PROJECT_NUMBER@gcp-sa-secretmanager.iam.gserviceaccount.com

์„œ๋น„์Šค ID ์ด๋ฆ„์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

The following variable is editable. Click on it to update the value, and it will
be reflected throughout this documentation page.

SM_SERVICE_IDENTITY

์ด ์„œ๋น„์Šค ID์— ๋ณด์•ˆ ๋น„๋ฐ€์„ ์•”ํ˜ธํ™”ํ•˜๊ณ  ๋ณตํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” CMEK Cloud KMS ํ‚ค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ๋ณต์ œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” CMEK

์ด ์„น์…˜์—์„œ๋Š” ์ž๋™ ๋ณต์ œ ์ •์ฑ…์„ ํ†ตํ•ด ๊ตฌ์„ฑ๋œ ๋ณด์•ˆ ๋น„๋ฐ€์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ž๋™ ๋ณต์ œ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์˜ ๊ฒฝ์šฐ CMEK ํ‚ค๋Š” global Cloud KMS ๋ฉ€ํ‹ฐ ๋ฆฌ์ „์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Cloud EKM ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ global ๋ฆฌ์ „์—์„œ Cloud EKM ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ž๋™ ๋ณต์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณด์•ˆ ๋น„๋ฐ€์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Cloud EKM ํ‚ค ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ CMEK ์ •์ฑ…์— Cloud EKM ํ‚ค ์ถ”๊ฐ€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

global Cloud KMS ๋ฆฌ์ „์—์„œ ๋Œ€์นญ Cloud KMS ํ‚ค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” secret-manager-cmek๋ผ๋Š” ์ƒˆ ํ‚ค๋ง์„ ๋งŒ๋“  ํ›„ my-cmek-key๋ผ๋Š” ์ƒˆ ํ‚ค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud kms keyrings create "secret-manager-cmek" \
    --project "KMS_PROJECT_ID" \
    --location "global"
gcloud kms keys create "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

CMEK ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ID์— ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๋Š” Secret Manager ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” my-cmek-key Cloud KMS ํ‚ค์— ๋Œ€ํ•œ Cloud KMS ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ์—ญํ• (roles/cloudkms.cryptoKeyEncrypterDecrypter)์„ ์„œ๋น„์Šค ID์— ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud kms keys add-iam-policy-binding "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

์ž๋™ ๋ณต์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. CMEK ํ‚ค์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์€ ๋ณด์•ˆ ๋น„๋ฐ€์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets create "SECRET_ID" \
    --replication-policy "automatic" \
    --kms-key-name "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key" \
    --project "SM_PROJECT_ID"

API

์ด ์˜ˆ์‹œ์—์„œ๋Š” curl์„ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. gcloud auth print-access-token์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

replication.automatic.customerManagedEncryption.kmsKeyName ๊ฐ’์„ CMEK ํ‚ค์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets?secretId=SECRET_ID" \
    --request "POST" \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --data-binary @- <<EOF
{
  "replication":{
    "automatic":{
      "customerManagedEncryption":{
        "kmsKeyName": "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
      }
    }
  }
}
EOF

์ด์ œ ๋ณด์•ˆ ๋น„๋ฐ€์— ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์„œ๋น„์Šค ID์— CMEK ํ‚ค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ํ•œ ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€์— ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์˜ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ํ‚ค๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ID์— ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†๊ฑฐ๋‚˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด ๋ณด์•ˆ ๋น„๋ฐ€์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ƒˆ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Cloud KMS ํ‚ค์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋น„๋ฐ€์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

echo -n "SECRET_DATA" | gcloud secrets versions add "SECRET_ID" \
    --project "SM_PROJECT_ID" \
    --data-file -

ํ˜ธ์ถœ์ž์—๊ฒŒ CMEK ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง์ ‘ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†๋”๋ผ๋„ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๊ฐ€ ์•„๋‹Œ Secret Manager์˜ ์„œ๋น„์Šค ID๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ์•”ํ˜ธํ™”ํ•˜๊ณ  ๋ณตํ˜ธํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณด์•ˆ ๋น„๋ฐ€์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด CMEK ํ‚ค์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ID๋Š” ํ‚ค์— ์•ก์„ธ์Šคํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ๋ณด์•ˆ ๋น„๋ฐ€์„ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ๋งŒ๋“  ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets versions access "latest" \
    --project "SM_PROJECT_ID" \
    --secret "SECRET_ID"

CMEK ๊ตฌ์„ฑ ์—…๋ฐ์ดํŠธ

global Cloud KMS ๋ฉ€ํ‹ฐ ๋ฆฌ์ „์—์„œ ์ƒˆ ๋Œ€์นญ KMS ํ‚ค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud kms keys create "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

์ƒˆ CMEK ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ID์— ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๋Š” Secret Manager ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” my-other-key Cloud KMS ํ‚ค์— ๋Œ€ํ•œ Cloud KMS ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ์—ญํ• (roles/cloudkms.cryptoKeyEncrypterDecrypter)์„ ์„œ๋น„์Šค ID์— ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud kms keys add-iam-policy-binding "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

์ƒˆ Cloud KMS ํ‚ค ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์œผ๋กœ ๋ณด์•ˆ ๋น„๋ฐ€์˜ ๋ณต์ œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ณด์•ˆ ๋น„๋ฐ€์˜ CMEK ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets replication update "SECRET_ID" \
    --set-kms-key "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-other-key" \
    --project "SM_PROJECT_ID"

API

์ด ์˜ˆ์‹œ์—์„œ๋Š” curl์„ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. gcloud auth print-access-token์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/SECRET_ID?updateMask=replication" \
    --request "PATCH" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json" \
    --data-binary @- <<EOF
{
  "replication": {
    "automatic":{
      "customerManagedEncryption":{
        "kmsKeyName": "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-other-key"
      }
    }
  }
}
EOF

์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ณต์ œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” CMEK

์ด ์„น์…˜์—์„œ๋Š” ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ณต์ œ ์ •์ฑ…์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ณด์•ˆ ๋น„๋ฐ€์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ณต์ œ ์ •์ฑ…์œผ๋กœ ๋ณด์•ˆ ๋น„๋ฐ€์ด ์ €์žฅ๋˜๋Š” Google Cloud ์œ„์น˜๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  Google Cloud ์œ„์น˜์—์„œ๋Š” ํ•ญ์ƒ ๋ณด์•ˆ ๋น„๋ฐ€์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ณต์ œ ์ •์ฑ…์ด ์ ์šฉ๋œ ๋ณด์•ˆ ๋น„๋ฐ€์—์„œ๋Š” ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์ด ์ €์žฅ๋˜๋Š” ์œ„์น˜์— ์ •ํ™•ํžˆ ๋งคํ•‘๋˜๋Š” Cloud KMS ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์˜ ์˜ˆ์‹œ์—์„œ๋Š” us-east1, us-central1 ๋“ฑ ๋‘ ์œ„์น˜์— ๋ณด์•ˆ ๋น„๋ฐ€์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋น„๋ฐ€ ์•ก์„ธ์Šค ์š”์ฒญ์€ ๋‹ค์Œ ์œ„์น˜ ์ค‘ ํ•˜๋‚˜๋กœ ๋ผ์šฐํŒ…๋ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฆฌ์ „ ๊ฐ๊ฐ์—์„œ ์•”ํ˜ธํ™”๋ฅผ ์œ„ํ•ด ํ‚ค๋ง๊ณผ Cloud KMS ํ‚ค๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” "secret-manager-cmek"๋ผ๋Š” ์ƒˆ ํ‚ค๋ง์„ ๋งŒ๋“  ํ›„ ๊ฐ ๋ฆฌ์ „์— "my-cmek-key"๋ผ๋Š” ํ‚ค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud kms keyrings create "secret-manager-cmek" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1"
gcloud kms keys create "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"
gcloud kms keyrings create "secret-manager-cmek" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1"
gcloud kms keys create "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

๊ฐœ๋ณ„์ ์œผ๋กœ CMEK ํ‚ค ๊ฐ๊ฐ์— ๋˜๋Š” ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ํ‚ค์— Cloud KMS ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ์—ญํ• (roles/cloudkms.cryptoKeyEncrypterDecrypter)์„ ๋ถ€์—ฌํ•˜์—ฌ ์„œ๋น„์Šค ID์— CMEK ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ด ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๋Š” Secret Manager ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud kms keys add-iam-policy-binding "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"
gcloud kms keys add-iam-policy-binding "my-cmek-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ณต์ œ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” CMEK๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋œ ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. CMEK ํ‚ค์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์€ ๋ณด์•ˆ ๋น„๋ฐ€์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

cat <<EOF > ./replication-policy.json
{
  "userManaged":{
    "replicas":[
      {
        "location":"us-east1",
        "customerManagedEncryption":{
          "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
        }
      },
      {
        "location":"us-central1",
        "customerManagedEncryption":{
          "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
        }
      }
    ]
  }
}
EOF
gcloud secrets create "my-ummr-secret" \
    --replication-policy-file ./replication-policy.json \
    --project "SM_PROJECT_ID"

API

์ด ์˜ˆ์‹œ์—์„œ๋Š” curl์„ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. gcloud auth print-access-token์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

replication.userManaged.replicas.customerManagedEncryption.kmsKeyName ๊ฐ’์„ CMEK ํ‚ค์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

curl "https://secretmanager.googleapis.com/v1/projects/SM_PROJECT_ID/secrets?secretId=my-ummr-secret" \
--request "POST" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer ACCESS_TOKEN" \
--data-binary @- <<EOF
{
  "replication":{
    "userManaged":{
      "replicas":[
        {
          "location":"us-east1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
          }
        },
        {
          "location":"us-central1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
          }
        }
      ]
    }
  }
}
EOF

์ด์ œ ๋ณด์•ˆ ๋น„๋ฐ€์— ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์„œ๋น„์Šค ID์— CMEK ํ‚ค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ํ•œ ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€์— ์ž‘์„ฑํ•˜๊ธฐ ์ „์— ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์˜ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ํ‚ค๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ID์— ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†๊ฑฐ๋‚˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด ๋ณด์•ˆ ๋น„๋ฐ€์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ƒˆ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. Cloud KMS ํ‚ค์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋น„๋ฐ€์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

echo -n "SECRET_DATA" | gcloud secrets versions add "my-ummr-secret" \
    --project "SM_PROJECT_ID" \
    --data-file -

ํ˜ธ์ถœ์ž์—๊ฒŒ CMEK ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง์ ‘ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†๋”๋ผ๋„ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๊ฐ€ ์•„๋‹Œ Secret Manager์˜ ์„œ๋น„์Šค ID๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ์•”ํ˜ธํ™”ํ•˜๊ณ  ๋ณตํ˜ธํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณด์•ˆ ๋น„๋ฐ€์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด CMEK ํ‚ค์— ์ง์ ‘ ์•ก์„ธ์Šคํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ID๋Š” ํ‚ค์— ์•ก์„ธ์Šคํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ๋ณด์•ˆ ๋น„๋ฐ€์„ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ๋งŒ๋“  ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets versions access "latest" \
    --project "SM_PROJECT_ID" \
    --secret "my-ummr-secret"

CMEK ๊ตฌ์„ฑ ์—…๋ฐ์ดํŠธ

๋ณด์•ˆ ๋น„๋ฐ€๊ณผ ๋™์ผํ•œ ๋ฆฌ์ „์— ์ƒˆ ๋Œ€์นญ KMS ํ‚ค ๋‘ ๊ฐœ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud kms keys create "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"
gcloud kms keys create "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

์ƒˆ CMEK ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ID์— ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๋Š” Secret Manager ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” my-other-key Cloud KMS ํ‚ค์— ๋Œ€ํ•œ Cloud KMS ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ์—ญํ• (roles/cloudkms.cryptoKeyEncrypterDecrypter)์„ ์„œ๋น„์Šค ID์— ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud kms keys add-iam-policy-binding "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"
gcloud kms keys add-iam-policy-binding "my-other-key" \
    --project "KMS_PROJECT_ID" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:SM_SERVICE_IDENTITY" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

์ƒˆ Cloud KMS ํ‚ค ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์œผ๋กœ ๋ณด์•ˆ ๋น„๋ฐ€์˜ ๋ณต์ œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ณด์•ˆ ๋น„๋ฐ€์˜ CMEK ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets replication update "my-ummr-secret" \
    --set-kms-key "projects/KMS_PROJECT_ID/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key" \
    --location us-east1 \
    --project "SM_PROJECT_ID"
gcloud secrets replication update "my-ummr-secret" \
    --set-kms-key "projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key" \
    --location us-central1 \
    --project "SM_PROJECT_ID"

๋ณด์•ˆ ๋น„๋ฐ€์˜ ํ‚ค ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ๋™์‹œ์— ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ํŒŒ์ผ์„ ํ†ตํ•ด ๋ณต์ œ ์ •์ฑ…์„ ๊ฐ€์ ธ์˜ค๊ณ  ์„ค์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets replication get "my-ummr-secret" \
    --project "SM_PROJECT_ID" \
    --format=json > ./replication-policy.json

์›ํ•˜๋Š” ํŽธ์ง‘๊ธฐ์—์„œ ์›ํ•˜๋Š” CMEK ๊ตฌ์„ฑ์„ ๋ฐ˜์˜ํ•˜๋„๋ก ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒˆ ์ •์ฑ…์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets replication set "my-ummr-secret" \
    --replication-policy-file ./replication-policy.json \
    --project "SM_PROJECT_ID"

API

์ด ์˜ˆ์‹œ์—์„œ๋Š” curl์„ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. gcloud auth print-access-token์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/my-ummr-secret?updateMask=replication" \
    --request "PATCH" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json" \
    --data-binary @- <<EOF
{
  "replication":{
    "userManaged":{
      "replicas":[
        {
          "location":"us-east1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key"
          }
        },
        {
          "location":"us-central1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key"
          }
        }]
      }
    }
  }
EOF

๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „ CMEK ๊ตฌ์„ฑ ๋ณด๊ธฐ

๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์ด ์‚ฌ์šฉ ์„ค์ •๋œ CMEK์ด๊ณ  CMEK ํ‚ค ๋ฒ„์ „์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ๋น„๋กฏํ•œ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์‚ฌํ•˜๋ ค๋ฉด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๋ด…๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets versions describe "latest" \
    --secret "SECRET_ID" \
    --project "SM_PROJECT_ID"

API

์ด ์˜ˆ์‹œ์—์„œ๋Š” curl์„ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. gcloud auth print-access-token์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

curl "https://secretmanager.googleapis.com/v1/projects/SM_PROJECT_ID/secrets/SECRET_ID/versions/latest" \
    --request "GET" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json"

๊ทธ๋Ÿฌ๋ฉด ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ‚ค ๋ฒ„์ „์˜ ์ „์ฒด Cloud KMS ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

{
  "name": "projects/PROJECT_NUMBER/secrets/SECRET_ID/versions/1",
  "createTime": "2021-07-...",
  "state": "ENABLED",
  "replicationStatus": {
    "automatic": {
      "customerManagedEncryption": {
        "kmsKeyVersionName": "projects/KMS_PROJECT_ID/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key/cryptoKeyVersions/1"
      }
    }
  }
}

CMEK ์ •์ฑ…์— Cloud EKM ํ‚ค ์ถ”๊ฐ€

์ด ์„น์…˜์—์„œ๋Š” Cloud EKM ํ‚ค๋ฅผ CMEK ์ •์ฑ…์— ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋‹จ๊ณ„๋ฅผ ํ†ตํ•ด Cloud EKM ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ ๋น„๋ฐ€์„ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Cloud EKM์€ ํ˜„์žฌ global ๋ฉ€ํ‹ฐ ๋ฆฌ์ „์„ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ Cloud EKM ํ‚ค๋Š” ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ณต์ œ์šฉ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ณด์•ˆ ๋น„๋ฐ€์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

us-central1 Cloud KMS ๋ฆฌ์ „(๋˜๋Š” global์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฆฌ์ „)์—์„œ ๋Œ€์นญ ํ‚ค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ์—์„œ๋Š” secret-manager-cmek-ekm์ด๋ผ๋Š” ์ƒˆ ํ‚ค๋ง์„ ๋งŒ๋“  ํ›„ ํ‚ค๋ง์— my-ekm-key๋ผ๋Š” ์ƒˆ ํ‚ค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ ํ‚ค๋ง์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud kms keyrings create "secret-manager-cmek-ekm" \
  --project "KMS_PROJECT_ID" \
  --location "us-central1"

์ด ํ‚ค๋ง์— ํ‚ค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud kms keys create "my-ekm-key" \
  --keyring "secret-manager-cmek-ekm" \
  --location "us-central1" \
  --purpose "encryption" \
  --protection-level "external" \
  --skip-initial-version-creation \
  --default-algorithm "external-symmetric-encryption"

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ‚ค์˜ ์™ธ๋ถ€ URI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ ๋ฒ„์ „์˜ my-ekm-key๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Cloud EKM ํ‚ค์˜ ์™ธ๋ถ€ URI์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์™ธ๋ถ€ ํ‚ค ๋งŒ๋“ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud kms keys versions create \
  --key "my-ekm-key" \
  --keyring "secret-manager-cmek-ekm" \
  --location "us-central1" \
  --external-key-uri EXTERNAL_KEY_URI \
  --primary

์™ธ๋ถ€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ID์— ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™”ํ•  ์ˆ˜ ์žˆ๋Š” Secret Manager ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” my-ekm-key์— ๋Œ€ํ•œ Cloud KMS ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ์—ญํ• (roles/cloudkms.cryptoKeyEncrypterDecrypter)์„ ์„œ๋น„์Šค ID์— ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud kms keys add-iam-policy-binding "my-ekm-key" \
  --project "KMS_PROJECT_ID" \
  --location "us-central1" \
  --keyring "secret-manager-cmek-ekm" \
  --member "serviceAccount:SM_SERVICE_IDENTITY" \
  --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

Cloud EKM ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” CMEK๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋œ ๋ณด์•ˆ ๋น„๋ฐ€์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

cat <<EOF > ./replication-policy.json
{
  "userManaged":{
    "replicas":[
      {
        "location":"us-central1",
        "customerManagedEncryption":{
          "kmsKeyName":"projects/KMS_PROJECT_ID/locations/us-central1/keyRings/secret-manager-cmek-ekm/cryptoKeys/my-ekm-key"
        }
      }
    ]
  }
}
EOF
gcloud secrets create "my-ekm-secret" \
    --replication-policy-file ./replication-policy.json \
    --project "SM_PROJECT_ID"

์ด์ œ my-ekm-secret์— ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ์„œ๋น„์Šค ID์— ํ‚ค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ํ•œ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์˜ ํŽ˜์ด๋กœ๋“œ๋Š” ์˜๊ตฌ ์Šคํ† ๋ฆฌ์ง€์— ์ž‘์„ฑ๋˜๊ธฐ ์ „์— Cloud EKM ํ‚ค๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์•”ํ˜ธํ™”๋ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค ID์— ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†๊ฑฐ๋‚˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด ๋ณด์•ˆ ๋น„๋ฐ€์— ์•ก์„ธ์Šคํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ƒˆ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์€ ๋ณด์•ˆ ๋น„๋ฐ€์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์—์„œ ์ฝ์Šต๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

echo -n "SECRET_DATA" | gcloud secrets versions add "my-ekm-secret" \
    --project "SM_PROJECT_ID" \
    --data-file -

ํ˜ธ์ถœ์ž์—๊ฒŒ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง์ ‘ ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์—†๋”๋ผ๋„ ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๊ฐ€ ์•„๋‹Œ Secret Manager์˜ ์„œ๋น„์Šค ID๋Š” ๋ณด์•ˆ ๋น„๋ฐ€์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ ์•”ํ˜ธํ™”ํ•˜๊ณ  ๋ณตํ˜ธํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฉ๊ธˆ ๋งŒ๋“  ๋ณด์•ˆ ๋น„๋ฐ€ ๋ฒ„์ „์— ์•ก์„ธ์Šคํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์„œ๋น„์Šค ID๋Š” ํ‚ค์— ์•ก์„ธ์Šคํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ ๋ณด์•ˆ ๋น„๋ฐ€์„ ์•”ํ˜ธํ™”ํ•˜๊ฑฐ๋‚˜ ๋ณตํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets versions access "latest" \
  --project "SM_PROJECT_ID" \
  --secret "my-ekm-secret"

CMEK ์‚ฌ์šฉ ์ค‘์ง€

๋ณต์ œ ์ •์ฑ…์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ๋ณด์•ˆ ๋น„๋ฐ€์—์„œ CMEK ๊ตฌ์„ฑ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

gcloud

๋ช…๋ น์ค„์—์„œ Secret Manager๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € Google Cloud CLI ๋ฒ„์ „ 378.0.0 ์ด์ƒ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œํ•ฉ๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

gcloud secrets replication update "SECRET_ID" --remove-cmek \
    --project "SM_PROJECT_ID"

API

์ด ์˜ˆ์‹œ์—์„œ๋Š” curl์„ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. gcloud auth print-access-token์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Compute Engine ๋˜๋Š” GKE์—์„œ๋Š” cloud-platform ๋ฒ”์œ„๋กœ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/SECRET_ID?updateMask=replication" \
    --request "PATCH" \
    --header "Authorization: Bearer ACCESS_TOKEN" \
    --header "Content-Type: application/json" \
    --data-binary @- <<EOF
{
  "replication":{
    "automatic":{}
  }
}
EOF

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

  • CMEK ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ