๊ณ ๊ฐ ๊ด€๋ฆฌ ์•”ํ˜ธํ™” ํ‚ค(CMEK) ์‚ฌ์šฉ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” Firestore์šฉ ๊ณ ๊ฐ ๊ด€๋ฆฌ ์•”ํ˜ธํ™” ํ‚ค (CMEK)์™€ ๊ด€๋ จ๋œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. CMEK๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋Š” ์‹œ๊ธฐ์™€ ์ด์œ ๋ฅผ ํฌํ•จํ•œ ์ผ๋ฐ˜์ ์ธ CMEK์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Cloud KMS ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

CMEK ํ‚ค ์ค€๋น„

CMEK๋กœ ๋ณดํ˜ธ๋˜๋Š” Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋จผ์ € ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. Firestore CMEK ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  2. Firestore ์„œ๋น„์Šค ์—์ด์ „ํŠธ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  3. CMEK ํ‚ค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  4. ํ•ด๋‹น ํ‚ค์˜ IAM ์„ค์ •์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

CMEK๋กœ ๋ณดํ˜ธ๋˜๋Š” Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํฌํ•จํ•  ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์ƒˆ CMEK ํ‚ค๋ฅผ ๋งŒ๋“ค๋ฉด ํ•ด๋‹น ํ‚ค์— ๋Œ€ํ•œ IAM ์„ค์ •์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•ก์„ธ์Šค ์š”์ฒญ

Firestore ์„œ๋น„์Šค ์—์ด์ „ํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ์ด ์–‘์‹์„ ์ž‘์„ฑํ•˜์—ฌ CMEK ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์š”์ฒญํ•˜์„ธ์š”.

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

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

services identity create ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ Firestore์—์„œ ์‚ฌ์šฉ์ž ๋Œ€์‹  CMEK ํ‚ค์— ์•ก์„ธ์Šคํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค ์—์ด์ „ํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์–ด๋Š” ์„œ๋น„์Šค ๊ณ„์ •์ด ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๊ณ„์ •์„ ๋งŒ๋“  ํ›„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

gcloud beta services identity create \
    --service=firestore.googleapis.com \
    --project FIRESTORE_PROJECT

FIRESTORE_PROJECT๋ฅผ Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉํ•  ํ”„๋กœ์ ํŠธ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์–ด๋Š” ์ด๋ฉ”์ผ ์ฃผ์†Œ์™€ ๊ฐ™์€ ํ˜•์‹์˜ ์„œ๋น„์Šค ์—์ด์ „ํŠธ ID๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘ ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ถœ๋ ฅ ์ด๋ฉ”์ผ ๋ฌธ์ž์—ด์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

Service identity created:
service-xxx@gcp-sa-firestore.iam.gserviceaccount.com

ํ‚ค ๋งŒ๋“ค๊ธฐ

Cloud KMS์—์„œ ์ง์ ‘ ์ƒ์„ฑ๋œ ํ‚ค ๋˜๋Š” Cloud ์™ธ๋ถ€ ํ‚ค ๊ด€๋ฆฌ์ž์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์™ธ๋ถ€ ๊ด€๋ฆฌ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Cloud KMS ํ‚ค ์œ„์น˜๋Š” ํ•จ๊ป˜ ์‚ฌ์šฉํ•  Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์œ„์น˜์™€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฆฌ์ „ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์œ„์น˜์˜ ๊ฒฝ์šฐ ์œ„์น˜ ์ด๋ฆ„์— ์ผ๋Œ€์ผ ๋งคํ•‘์ด ์žˆ์œผ๋ฏ€๋กœ ํ‚ค๋ง, ํ‚ค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋™์ผํ•œ ์œ„์น˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด us-west1์— CMEK๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด us-west1์— ํ‚ค๋ง๊ณผ ํ‚ค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

  • ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์œ„์น˜์˜ ๊ฒฝ์šฐ์—๋Š” KMS ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ์œ„์น˜์˜ ์œ„์น˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • Firestore nam5 ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ์œ„์น˜์— Cloud KMS us ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • Firestore eur3 ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ์œ„์น˜์— Cloud KMS europe ๋ฉ€ํ‹ฐ ๋ฆฌ์ „ ์œ„์น˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•  Google Cloud ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค์Œ์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

  1. Cloud KMS API๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‚ค๋ง๊ณผ ํ‚ค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

ํ‚ค์˜ IAM ์„ค์ • ๊ตฌ์„ฑ

์ฝ˜์†”

์„œ๋น„์Šค ์—์ด์ „ํŠธ์— Cloud KMS ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋‚ฎ์€ ์„ธ๋ถ„ํ™”๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ‚ค ๋˜๋Š” ํ‚ค๋ง ์ˆ˜์ค€์—์„œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Google Cloud ์ฝ˜์†”์—์„œ IAM ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    IAM ํŽ˜์ด์ง€๋กœ ์ด๋™

  2. ์ถ”๊ฐ€๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. Firestore ์„œ๋น„์Šค ์—์ด์ „ํŠธ์˜ ์ด๋ฉ”์ผ ํ˜•์‹ ID๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  4. Cloud KMS CryptoKey ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ์—ญํ• ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  5. ์ €์žฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

์„œ๋น„์Šค ์—์ด์ „ํŠธ์— cloudkms.cryptoKeyEncrypterDecrypter ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

gcloud kms keys add-iam-policy-binding KMS_KEY \
--keyring KMS_KEYRING\
--location KMS_LOCATION \
--member serviceAccount:SERVICE_AGENT_EMAIL \
--role roles/cloudkms.cryptoKeyEncrypterDecrypter \
--project KMS_PROJECT

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • KMS_KEY: ํ‚ค์— ํ• ๋‹นํ•œ ์ด๋ฆ„
  • KMS_KEYRING: ํ‚ค๊ฐ€ ํฌํ•จ๋œ KMS ํ‚ค๋ง
  • KMS_LOCATION :ํ‚ค๋ง์ด ํฌํ•จ๋œ ๋ฆฌ์ „
  • SERVICE_AGENT_EMAIL: ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ์„œ๋น„์Šค ์—์ด์ „ํŠธ์˜ ์ด๋ฉ”์ผ ํ˜•์‹ ์‹๋ณ„์ž
  • KMS_PROJECT: ํ‚ค๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ

ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ์‘๋‹ต์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Updated IAM policy for key KMS_KEY.
bindings:
- members:
- serviceAccount:
service-{project-number}@gcp-sa-firestore.iam.gserviceaccount.com
role: roles/cloudkms.cryptoKeyEncrypterDecrypter

CMEK ์ง€์› ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ

CMEK ํ‚ค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ตฌ์„ฑํ•œ ํ›„์—๋Š” CMEK๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Google ๊ธฐ๋ณธ ์•”ํ˜ธํ™”๋กœ ๋ณดํ˜ธ๋˜๋Š” ๊ธฐ์กด Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” CMEK๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€ํ™˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

CMEK ์ง€์› ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ๋งŒ ์•”ํ˜ธํ™” ์œ ํ˜•๊ณผ ํ‚ค๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŽ˜์ด์ง€๋กœ ์ด๋™

  2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๊ณ„์†์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์„ฑ ํŽ˜์ด์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ID๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  5. ์ง€์—ญ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  6. ์•”ํ˜ธํ™” ์˜ต์…˜ ํ‘œ์‹œ๋ฅผ ํด๋ฆญํ•œ ๋‹ค์Œ Cloud KMS ํ‚ค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  7. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉํ•  CMEK ํ‚ค์˜ ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

  8. ํ‚ค ๋ชฉ๋ก์€ ํ˜„์žฌ Google Cloud ํ”„๋กœ์ ํŠธ ๋ฐ ์„ ํƒํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์œ„์น˜๋กœ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ Google Cloud ํ”„๋กœ์ ํŠธ์˜ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ ์ „ํ™˜ ๋˜๋Š” ํ‚ค ์ˆ˜๋™ ์ž…๋ ฅ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  9. Firestore ์„œ๋น„์Šค ๊ณ„์ •์— ํ‚ค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. CMEK ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด Firestore ์„œ๋น„์Šค ๊ณ„์ •์— cloudkms.cryptoKeyEncrypterDecrypter ์—ญํ• ์ด ๋ถ€์—ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  10. ๋ชจ๋ฐ”์ผ ๋ฐ ์›น ํด๋ผ์ด์–ธํŠธ์˜ ๋ณด์•ˆ ๊ทœ์น™์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

  11. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ธ๋ถ€์ •๋ณด๋ฅผ ํ™•์ธํ•˜์—ฌ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ CMEK ์‚ฌ์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ CMEK๋กœ ๋ณดํ˜ธ๋˜๋Š” ๊ฒฝ์šฐ ์•”ํ˜ธํ™” ์œ ํ˜• ํ•„๋“œ๊ฐ€ ๊ณ ๊ฐ ๊ด€๋ฆฌ๋กœ ํ‘œ์‹œ๋˜๊ณ  ์•”ํ˜ธํ™” ํ‚ค ํ•„๋“œ์—๋Š” ํ•ด๋‹น Cloud KMS์™€ ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณดํ˜ธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ‚ค ๋ฒ„์ „์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ CMEK๋กœ ๋ณดํ˜ธ๋˜์ง€ ์•Š์œผ๋ฉด ์•”ํ˜ธํ™” ์œ ํ˜• ํ•„๋“œ๊ฐ€ Google ๊ด€๋ฆฌ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

gcloud

Google Cloud CLI๋กœ CMEK ์ง€์› ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์ „์— ์ตœ์‹  ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๊ณ  gcloud CLI๋ฅผ ์Šน์ธํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ gcloud CLI ์„ค์น˜๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

gcloud firestore databases create --location=FIRESTORE_DATABASE_LOCATION \
      --database=DATABASE_ID \
      --kms-key-name=KMS_KEY_NAME \
      --project=FIRESTORE_PROJECT

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • FIRESTORE_DATABASE_LOCATION: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ Firestore ์œ„์น˜
  • DATABASE_ID: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ID
  • KMS_KEY_NAME: ํ‚ค์— ํ• ๋‹นํ•œ ์ด๋ฆ„ ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ๋œ ํ‚ค์˜ ์ „์ฒด ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

  • FIRESTORE_PROJECT: Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉํ•  ํ”„๋กœ์ ํŠธ

REST API

HTTP ์š”์ฒญ:

POST https://firestore.googleapis.com/v1/projects/{FIRESTORE_PROJECT}/databases

์š”์ฒญ ๋ณธ๋ฌธ์˜ cmek_config.kms_key_name ํ•„๋“œ์—์„œ CMEK๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Cloud KMS ํ‚ค์˜ ์ „์ฒด ๋ฆฌ์†Œ์Šค ID๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋™์ผํ•œ ์œ„์น˜์˜ ํ‚ค๋งŒ ํ—ˆ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ๊ฐ’์€ projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID} ํ˜•์‹์˜ Cloud KMS ํ‚ค ๋ฆฌ์†Œ์Šค ID์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ•„๋“œ์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ database create ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์š”์ฒญ ์˜ˆ์‹œ:

curl -X POST 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases?databaseId={DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json" \
-d '{
  "type":"FIRESTORE_NATIVE",
  "locationId":"{FIRESTORE_DATABASE_LOCATION}",
  "cmekConfig": {
    "kmsKeyName":"projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID"
  }
}'

Firebase CLI

CMEK ์ง€์› ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด KMS ํ‚ค ์ด๋ฆ„ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. --kms-key-name ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด Firestore์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ CMEK๊ฐ€ ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

firebase firestore:databases:create DATABASE_ID
--location LOCATION
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID
--project FIRESTORE_PROJECT

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • DATABASE_ID: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ID
  • LOCATION: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์œ„์น˜
  • KMS_PROJECT: CMEK ํ‚ค๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ
  • KMS_LOCATION: CMEK ํ‚ค ๋ฐ ํ‚ค๋ง์ด ํฌํ•จ๋œ ์œ„์น˜
  • KMS_KEYRING_ID: CMEK ํ‚ค๋ง์˜ ID
  • FIRESTORE_PROJECT: Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉํ•  ํ”„๋กœ์ ํŠธ

Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ Firebase CLI๋กœ ๋ณดํ˜ธ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

์‘๋‹ต ๋ฉ”์‹œ์ง€์— ๋‹ค์Œ CMEK ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

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

Terraform

CMEK ์ง€์› ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด google_firestore_database ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ์ž์„ธํ•œ ๋‚ด์šฉ ๋ฐ ์˜ˆ๋Š” google_firestore_database๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

resource "google_firestore_database" "database" {
  project     = "FIRESTORE_PROJECT"
  name        = "DATABASE_ID"
  location_id = "FIRESTORE_DATABASE_LOCATION"
  type        = "DATABASE_TYPE"

  cmek_config {
    kms_key_name = "KMS_KEY_NAME"
  }

}

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • FIRESTORE_PROJECT: Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉํ•  ํ”„๋กœ์ ํŠธ
  • DATABASE_ID: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ID
  • FIRESTORE_DATABASE_LOCATION: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ Firestore ์œ„์น˜
  • DATABASE_TYPE: ๊ธฐ๋ณธ ๋ชจ๋“œ์˜ ๊ฒฝ์šฐ FIRESTORE_NATIVE, Datastore ๋ชจ๋“œ์˜ ๊ฒฝ์šฐ DATASTORE_MODE
  • KMS_KEY_NAME: ํ‚ค์— ํ• ๋‹นํ•œ ์ด๋ฆ„ ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ๋œ ํ‚ค์˜ ์ „์ฒด ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šค

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ „์†ก๋˜๋Š” ๋ชจ๋“  ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์ฟผ๋ฆฌ ์ž‘์—…์€ Google ๊ธฐ๋ณธ ์•”ํ˜ธํ™” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ์™€ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•œ ํ‚ค๋ฅผ ์ œ๊ณตํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณต์›

๋ฐฑ์—…์—์„œ CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณต์›ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ CMEK ์•”ํ˜ธํ™”๋กœ ๋ณต์›ํ• ์ง€, Google์˜ ๊ธฐ๋ณธ ์•”ํ˜ธํ™”(CMEK๊ฐ€ ์•„๋‹˜)๋กœ ๋ณต์›ํ• ์ง€, ๋ฐฑ์—…๊ณผ ๋™์ผํ•œ ์•”ํ˜ธํ™”๋กœ ๋ณต์›ํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ์—…์„ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ํ‚ค(primary-version)์™€ ํ‚ค ๋ฒ„์ „์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค์™€ ํ‚ค ๋ฒ„์ „์„ ๋ชจ๋‘ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

gcloud

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ CMEK ์•”ํ˜ธํ™”๋กœ ๋ณต์›

CMEK ์•”ํ˜ธํ™”๋กœ ๋ณต์›ํ•˜๋ ค๋ฉด ์„ ํƒ์‚ฌํ•ญ์ธ encryption-type ๋ฐ kms-key-name ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ gcloud firestore databases restore ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ณต์›๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์•”ํ˜ธํ™” ์œ ํ˜•์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ์œ ํ˜•์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ณต์›๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐฑ์—…๊ณผ ๋™์ผํ•œ ์•”ํ˜ธํ™” ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  gcloud firestore databases restore
  --encryption-type=customer-managed-encryption
  --kms-key-name=KMS_KEY_NAME

KMS_KEY_NAME์„ ํ‚ค์— ํ• ๋‹นํ•œ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ๋œ ํ‚ค์˜ ์ „์ฒด ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ธฐ๋ณธ ์•”ํ˜ธํ™”๋กœ ๋ณต์›

Google์˜ ๊ธฐ๋ณธ ์•”ํ˜ธํ™”(CMEK๊ฐ€ ์•„๋‹˜)๋กœ ๋ณต์›ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด encryption-type ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

  gcloud firestore databases restore
  --encryption-type=google-default-encryption

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐฑ์—…๊ณผ ๋™์ผํ•œ ์•”ํ˜ธํ™” ์œ ํ˜•์œผ๋กœ ๋ณต์›

๋ฐฑ์—…๊ณผ ๋™์ผํ•œ ์•”ํ˜ธํ™” ์œ ํ˜•์œผ๋กœ ๋ณต์›ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด encryption-type ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.

  gcloud firestore databases restore --encryption-type=use-source-encryption

Firebase CLI

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ CMEK ์•”ํ˜ธํ™”๋กœ ๋ณต์›

CMEK ์•”ํ˜ธํ™”๋กœ ๋ณต์›ํ•˜๋ ค๋ฉด ์„ ํƒ์  encryption-type ๋ฐ kms-key-name ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ์œ ํ˜•์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ณต์›๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐฑ์—…๊ณผ ๋™์ผํ•œ ์•”ํ˜ธํ™” ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type CUSTOMER_MANAGED_ENCRYPTION \
--kms-key-name projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID \
--project FIRESTORE_PROJECT

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • DATABASE_ID: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ID
  • FIRESTORE_PROJECT: Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉํ•  ํ”„๋กœ์ ํŠธ
  • FIRESTORE_LOCATION: Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์œ„์น˜
  • BACKUP_ID: ๋ฐฑ์—…์˜ ID
  • KMS_PROJECT: CMEK ํ‚ค๊ฐ€ ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ
  • KMS_LOCATION: CMEK ํ‚ค ๋ฐ ํ‚ค๋ง์ด ํฌํ•จ๋œ ์œ„์น˜
  • KMS_KEYRING_ID: CMEK ํ‚ค๋ง์˜ ID

๋ณต์›๋œ Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ CMEK๋กœ ์•”ํ˜ธํ™”๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

firebase firestore:databases:get DATABASE_ID --project FIRESTORE_PROJECT

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ธฐ๋ณธ ์•”ํ˜ธํ™”๋กœ ๋ณต์›

Google์˜ ๊ธฐ๋ณธ ์•”ํ˜ธํ™”(CMEK๊ฐ€ ์•„๋‹˜)๋กœ ๋ณต์›ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด encryption-type ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

firebase firestore:databases:restore \
--database DATABASE_ID \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type GOOGLE_DEFAULT_ENCRYPTION \
--project FIRESTORE_PROJECT

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • DATABASE_ID: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ID
  • FIRESTORE_PROJECT: Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉํ•  ํ”„๋กœ์ ํŠธ
  • FIRESTORE_LOCATION: Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์œ„์น˜
  • BACKUP_ID: ๋ฐฑ์—…์˜ ID

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐฑ์—…๊ณผ ๋™์ผํ•œ ์•”ํ˜ธํ™” ์œ ํ˜•์œผ๋กœ ๋ณต์›

๋ฐฑ์—…๊ณผ ๋™์ผํ•œ ์•”ํ˜ธํ™” ์œ ํ˜•์œผ๋กœ ๋ณต์›ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด encryption-type ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.

firebase firestore:databases:restore \
--database DATABASE_IDD \
--backup 'projects/FIRESTORE_PROJECT/locations/FIRESTORE_LOCATION/backups/BACKUP_ID' \
--encryption-type USE_SOURCE_ENCRYPTION

๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  • DATABASE_ID: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ID
  • FIRESTORE_PROJECT: Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉํ•  ํ”„๋กœ์ ํŠธ
  • FIRESTORE_LOCATION: Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์œ„์น˜
  • BACKUP_ID: ๋ฐฑ์—…์˜ ID

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํด๋ก 

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํด๋ก ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ CMEK ์•”ํ˜ธํ™”๋กœ ํด๋ก ํ• ์ง€, Google์˜ ๊ธฐ๋ณธ ์•”ํ˜ธํ™” (CMEK๊ฐ€ ์•„๋‹˜)๋กœ ํด๋ก ํ• ์ง€, ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋™์ผํ•œ ์•”ํ˜ธํ™”๋กœ ํด๋ก ํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ํ‚ค (primary-version)์™€ ํ‚ค ๋ฒ„์ „์„ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ํ‚ค์™€ ํ‚ค ๋ฒ„์ „์„ ๋ชจ๋‘ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

gcloud

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ CMEK ์•”ํ˜ธํ™”๋กœ ํด๋ก 

CMEK ์•”ํ˜ธํ™”๋กœ ํด๋ก ํ•˜๋ ค๋ฉด ์„ ํƒ์‚ฌํ•ญ์ธ encryption-type ๋ฐ kms-key-name ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ gcloud alpha firestore databases clone ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํด๋ก ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์•”ํ˜ธํ™” ์œ ํ˜•์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™” ์œ ํ˜•์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ํด๋ก ๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋™์ผํ•œ ์•”ํ˜ธํ™” ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud alpha firestore databases clone \
--encryption-type=customer-managed-encryption \
--kms-key-name=KMS_KEY_NAME

KMS_KEY_NAME์„ ํ‚ค์— ํ• ๋‹นํ•œ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ๋œ ํ‚ค์˜ ์ „์ฒด ๋ฆฌ์†Œ์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

projects/KMS_PROJECT/locations/KMS_LOCATION/keyRings/KMS_KEYRING_ID/cryptoKeys/KMS_KEY_ID

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ธฐ๋ณธ ์•”ํ˜ธํ™”๋กœ ํด๋ก 

Google์˜ ๊ธฐ๋ณธ ์•”ํ˜ธํ™” (CMEK๊ฐ€ ์•„๋‹˜)๋กœ ํด๋ก ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด encryption-type ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

gcloud alpha firestore databases clone \
--encryption-type=google-default-encryption

CMEK ๋ณดํ˜ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋™์ผํ•œ ์•”ํ˜ธํ™” ์œ ํ˜•์œผ๋กœ ํด๋ก 

์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋™์ผํ•œ ์•”ํ˜ธํ™” ์œ ํ˜•์œผ๋กœ ํด๋ก ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด encryption-type ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•˜์„ธ์š”.

gcloud alpha firestore databases clone \
--encryption-type=use-source-encryption

์‚ฌ์šฉ ์ค‘์ธ ํ‚ค ๋ณด๊ธฐ

gcloud

databases describe gcloud CLI ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค CMEK ๊ตฌ์„ฑ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud firestore databases describe --database=DATABASE_ID --project=FIRESTORE_PROJECT

์‘๋‹ต์˜ cmekConfig ํ•„๋“œ์— ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ CMEK ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

cmekConfig:
    activeKeyVersion:
    - projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
    kmsKeyName: projects/PROJECT_ID/locations/us/keyRings/KEYRING_NAME/cryptoKeys/KEY_NAME
  locationId: nam5
  name: projects/PROJECT_ID/databases/DATABASE_ID

์‘๋‹ต์—๋Š” ๋‹ค์Œ ์ •๋ณด๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • kmsKeyName: CMEK๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ‚ค์˜ ์ „์ฒด ํ‚ค ๋ฆฌ์†Œ์Šค ์ด๋ฆ„.
  • activeKeyVersion: CMEK๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ˜„์žฌ ์‚ฌ์šฉ ์ค‘์ธ ๋ชจ๋“  ํ‚ค ๋ฒ„์ „์˜ ๋ชฉ๋ก. ํ‚ค ์ˆœํ™˜ ์ค‘์— ์—ฌ๋Ÿฌ ํ™œ์„ฑ ํ‚ค ๋ฒ„์ „์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‚ค ์ˆœํ™˜ ์ค‘์— ์ด์ „ ํ‚ค ๋ฒ„์ „๊ณผ ์ƒˆ ํ‚ค ๋ฒ„์ „์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ํ‚ค ๋ฒ„์ „์ด ๋” ์ด์ƒ activeKeyVersion ํ•„๋“œ์— ํ‘œ์‹œ๋˜์ง€ ์•Š์„ ๋•Œ๊นŒ์ง€๋Š” ์‚ฌ์šฉ ์ค‘์ง€ํ•˜์ง€ ๋งˆ์„ธ์š”.

REST API

HTTP ์š”์ฒญ:

GET https://firestore.googleapis.com/v1/{name=projects/FIRESTORE_PROJECT/databases/DATABASE_ID}

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

์ด ๊ฐ’์€ projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID} ํ˜•์‹์˜ Cloud KMS ํ‚ค ๋ฆฌ์†Œ์Šค ID์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ•„๋“œ์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ database create ํŽ˜์ด์ง€๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์š”์ฒญ ๋ฐ ์‘๋‹ต ์˜ˆ์‹œ:

curl 'https://firestore.googleapis.com/v1/projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}' \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-type: application/json"

โ€”----------------------------------------- Response โ€”--------------------------------------------
{
  "name": "projects/FIRESTORE_PROJECT/databases/{DATABASE_ID}",
  "locationId": "{FIRESTORE_DATABASE_LOCATION}",
  "type": "FIRESTORE_NATIVE",
  "cmekConfig": {
    "kmsKeyName": "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}",
    "activeKeyVersion": [
      "projects/{KMS_PROJECT}/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}/cryptoKeyVersions/1"
    ]
  },
  โ€ฆโ€ฆ
}

ํ‚ค ์ค‘์ง€

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ๋œ ํ‚ค๋ฅผ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•˜์„ธ์š”.

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉ ์ค‘์ธ ํ‚ค ๋ฒ„์ „ ๋ณด๊ธฐ
  2. ์‚ฌ์šฉ ์ค‘์ธ ํ‚ค ๋ฒ„์ „ ์‚ฌ์šฉ ์ค‘์ง€
  3. ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ๋ฐ์ดํ„ฐ์— ๋” ์ด์ƒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ช‡ ๋ถ„ ๋‚ด์— ์ ์šฉ๋˜์ง€๋งŒ ์ตœ๋Œ€ 3์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค๊ฐ€ ์‚ฌ์šฉ ์ค‘์ง€๋˜๋ฉด ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋กœ ์ถ”๊ฐ€ ์„ธ๋ถ€์ •๋ณด์™€ ํ•จ๊ป˜ FAILED_PRECONDITION ์˜ˆ์™ธ๊ฐ€ ์ˆ˜์‹ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
  "error": {
    "code": 400,
    "message": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist).",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "The customer-managed encryption key required by the requested resource is not accessible. Error reason:  generic::permission_denied: Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on resource 'projects/FIRESTORE_PROJECT/locations/{KMS_LOCATION}/keyRings/{KMS_KEYRING_ID}/cryptoKeys/{KMS_KEY_ID}' (or it may not exist)"
      }
    ]
  }
}

ํ‚ค ์‚ฌ์šฉ ์„ค์ •

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์—ฐ๊ฒฐ๋œ ํ‚ค๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์™„๋ฃŒํ•˜์„ธ์š”.

  1. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉ ์ค‘์ธ ํ‚ค ๋ฒ„์ „ ๋ณด๊ธฐ
  2. ์‚ฌ์šฉ ์ค‘์ธ ํ‚ค ๋ฒ„์ „ ์‚ฌ์šฉ ์„ค์ •
  3. ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ ์šฉ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ํ›„ ๋ฐ์ดํ„ฐ์— ๋” ์ด์ƒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ช‡ ๋ถ„ ๋‚ด์— ์ ์šฉ๋˜์ง€๋งŒ ์ตœ๋Œ€ 3์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Cloud KMS ํ‚ค์˜ ๊ฐ์‚ฌ ๋กœ๊ทธ ๋ณด๊ธฐ

Cloud KMS ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๊ธฐ ์ „์— Cloud ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์ˆ™์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Cloud KMS ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๊ฐ์‚ฌ ๋กœ๊ทธ๋Š” Firestore ๋˜๋Š” CMEK ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ๋‹ค๋ฅธ ์ œํ’ˆ์ด Cloud KMS์— ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ํ˜ธ์ถœ์„ ํ•˜๋Š” ์‹œ์ ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. Firestore๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์š”์ฒญ์— ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™” ํ˜ธ์ถœ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋Œ€์‹ ์— ์ •๊ธฐ์ ์œผ๋กœ ํ‚ค๋ฅผ ํ™•์ธํ•˜๋Š” ํด๋Ÿฌ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํด๋ง ๊ฒฐ๊ณผ๋Š” ๊ฐ์‚ฌ ๋กœ๊ทธ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

Google Cloud ์ฝ˜์†”์—์„œ ๊ฐ์‚ฌ ๋กœ๊ทธ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ํ”„๋กœ์ ํŠธ์—์„œ Cloud KMS API์— ๋Œ€ํ•ด ๋กœ๊น…์ด ์‚ฌ์šฉ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  2. Google Cloud ์ฝ˜์†”์—์„œ Cloud Logging์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Cloud Logging์œผ๋กœ ์ด๋™

  3. ์ฟผ๋ฆฌ ๋นŒ๋”์— ๋‹ค์Œ ์ค„์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋กœ๊ทธ ํ•ญ๋ชฉ์„ Cloud KMS๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

    resource.type="cloudkms_cryptokey"
    resource.labels.key_ring_id = KMS_KEYRING
    resource.labels.crypto_key_id = KMS_KEY
    resource.labels.location=KMS_LOCATION
    

    ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • KMS_KEY: CMEK ํ‚ค ์ด๋ฆ„
    • KMS_KEYRING: ํ‚ค๊ฐ€ ํฌํ•จ๋œ KMS ํ‚ค๋ง
    • KMS_LOCATION: ํ‚ค ๋ฐ ํ‚ค๋ง์˜ ์œ„์น˜

    ๋กœ๊ทธ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‹น ์•ฝ 5๋ถ„๋งˆ๋‹ค ์ผ๋ถ€ ๋กœ๊ทธ ํ•ญ๋ชฉ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ ํ•ญ๋ชฉ์€ ๋‹ค์Œ ์˜ˆ์‹œ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    Info 2021-03-20 08:02:24.869 EDT Cloudkms.googleapis.com Decrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Decrypt", principal_email: "service-1234567891011@gcp-sa-firestore.iam.gserviceaccount.com"
    
    Info 2021-03-20 08:02:24.913 EDT Cloudkms.googleapis.com Encrypt projects/cloud-kms-project/locations/us-central1/keyRings/firestore-keys/cryptoKeys/my-cmek-key service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com
    audit_log, method: "Encrypt", principal_email: "service-123456789123@gcp-sa-firestore.iam.gserviceaccount.com"
    

๊ฐ์‚ฌ ๋กœ๊ทธ ํ•ด์„์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ฐ์‚ฌ ๋กœ๊ทธ ์ดํ•ด๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

CMEK ์กฐ์ง ์ •์ฑ… ๊ตฌ์„ฑ

์กฐ์ง์˜ Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์•”ํ˜ธํ™” ๊ทœ์ • ์ค€์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ง€์ •ํ•˜๋ ค๋ฉด CMEK ์กฐ์ง ์ •์ฑ… ์ œ์•ฝ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

CMEK ๋ณดํ˜ธ ์š”๊ตฌ

Firestore ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ์— CMEK๋ฅผ ์š”๊ตฌํ•˜๋„๋ก constraints/gcp.restrictNonCmekServices๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ œ์•ฝ์กฐ๊ฑด์„ deny๋กœ ์„ค์ •ํ•˜๊ณ  ๊ฑฐ๋ถ€ ๋ชฉ๋ก์— firestore.googleapis.com์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 gcloud resource-manager org-policies deny gcp.restrictNonCmekServices  is:firestore.googleapis.com --project=FIRESTORE_PROJECT

FIRESTORE_PROJECT๋ฅผ ์ œํ•œํ•  ํ”„๋กœ์ ํŠธ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์กฐ์ง ์ •์ฑ… ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ •์ฑ… ๋งŒ๋“ค๊ธฐ ๋ฐ ์ˆ˜์ •์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ •์ฑ…์ด ์ ์šฉ๋œ ํ›„ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ํ”„๋กœ์ ํŠธ์— CMEK๊ฐ€ ์•„๋‹Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋ฉด FAILED_PRECONDITION ์˜ˆ์™ธ ๋ฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์™ธ๊ฐ€ ์ˆ˜์‹ ๋ฉ๋‹ˆ๋‹ค.

{
  "error": {
    "code": 400,
    "message": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/gcp.restrictNonCmekServices",
            "subject": "orgpolicy:projects/FIRESTORE_PROJECT",
            "description": "Constraint 'constraints/gcp.restrictNonCmekServices' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'firestore.googleapis.com'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
          }
        ]

CMEK์— ๋Œ€ํ•œ ํ‚ค ์‚ฌ์šฉ ์ œํ•œ

CMEK ๋ณดํ˜ธ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” Cloud KMS ํ‚ค๋ฅผ ์ œํ•œํ•˜๋ ค๋ฉด constraints/gcp.restrictCmekCryptoKeyProjects ์ œ์•ฝ์กฐ๊ฑด์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋ชฉ๋ก ์ œ์•ฝ์กฐ๊ฑด์œผ๋กœ์„œ ํ—ˆ์šฉ๋˜๋Š” ๊ฐ’์€ ๋ฆฌ์†Œ์Šค ๊ณ„์ธต ๊ตฌ์กฐ ํ‘œ์‹œ๊ธฐ์ž…๋‹ˆ๋‹ค(์˜ˆ:projects/PROJECT_ID ,under:folders/FOLDER_ID, under:organizations/ORGANIZATION_ID). ๋ฆฌ์†Œ์Šค ๊ณ„์ธต ๊ตฌ์กฐ ํ‘œ์‹œ๊ธฐ ๋ชฉ๋ก์„ ๊ตฌ์„ฑํ•˜๊ณ  ์ œ์•ฝ์กฐ๊ฑด์„ ํ—ˆ์šฉ์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ์ด ์ œ์•ฝ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์€ ๋‚˜์—ด๋œ ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์—์„œ๋งŒ CMEK ํ‚ค๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›๋˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ํ—ˆ์šฉ๋˜๋Š” ๋ฆฌ์†Œ์Šค ์ค‘ ํ•˜๋‚˜์—์„œ Firestore ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ตฌ์„ฑ๋œ ์„œ๋น„์Šค์—์„œ CMEK๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์š”์ฒญ์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์‹œ์—์„œ๋Š” ์ง€์ •๋œ ํ”„๋กœ์ ํŠธ์˜ CMEK๋กœ ๋ณดํ˜ธ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ALLOWED_KEY_PROJECT_ID์˜ ํ‚ค๋งŒ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

gcloud resource-manager org-policies allow gcp.restrictCmekCryptoKeyProjects \
under:projects/ALLOWED_KEY_PROJECT_ID \
--project=FIRESTORE_PROJECT

์ •์ฑ…์ด ์ ์šฉ๋œ ํ›„ ์ œ์•ฝ์กฐ๊ฑด์„ ์œ„๋ฐ˜ํ•˜๋ฉด FAILED_PRECONDITION ์˜ˆ์™ธ ๋ฐ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ˆ์™ธ๊ฐ€ ์ˆ˜์‹ ๋ฉ๋‹ˆ๋‹ค.

{
  "error": {
    "code": 400,
    "message": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/gcp.restrictCmekCryptoKeyProjects",
            "subject": "orgpolicy:projects/FIRESTORE_PROJECT",
            "description": "Constraint 'constraints/gcp.restrictCmekCryptoKeyProjects' violated for 'projects/FIRESTORE_PROJECT' attempting to perform the operation 'google.firestore.admin.v1.FirestoreAdmin.CreateDatabase' with violated value 'projects/{NOT_ALLOWED_KEY_PROJECT}'. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
          }
        ]
      }
    ]
  }
}

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