GKE์šฉ ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ID ์ธ์ฆ ๊ตฌ์„ฑ

์ด ๋ฌธ์„œ์—์„œ๋Š” GKE Fleet ๊ด€๋ฆฌํ˜• ํด๋Ÿฌ์Šคํ„ฐ์—์„œ Google Kubernetes Engine(GKE)์šฉ ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์›Œํฌ๋กœ๋“œ๋ฅผ ๋ฐฐํฌํ•˜๊ณ  ์›Œํฌ๋กœ๋“œ์˜ ID์™€ ์ธ์ฆ์„œ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

GKE์šฉ ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ์˜ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋„๋ก Certificate Authority Service๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  2. CA๋ฅผ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

  3. CA ํ’€์—์„œ ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•˜๋„๋ก ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๋ฅผ ์Šน์ธํ•ฉ๋‹ˆ๋‹ค.

  4. ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๋กœ ์›Œํฌ๋กœ๋“œ๋ฅผ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

Google ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€

ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ GKE Fleet์— ์ถ”๊ฐ€ํ•˜๋ฉด Fleet์—์„œ ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ์˜ ๋ฃจํŠธ ์—ญํ• ์„ ํ•˜๋Š” Google ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์„ ์ž๋™์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. Google ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ œ์•ฝ ์กฐ๊ฑด์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Google์—์„œ ํ’€์„ ์™„์ „ํžˆ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ID, ID ๊ณต๊ธ‰์—…์ฒด ๋“ฑ์˜ ํ•˜์œ„ ๋ฆฌ์†Œ์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • ํ’€์€ GKE ์›Œํฌ๋กœ๋“œ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Compute Engine VM๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ์›Œํฌ๋กœ๋“œ๋ฅผ ํ’€์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • ํ’€์˜ ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ํ‘œ์ค€ Kubernetes ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋™์ผ์„ฑ ๋ชจ๋ธ์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํ’€์˜ ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ์— ๋™์ผํ•œ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ํ’€์˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์‹คํ–‰๋˜๋Š” ์›Œํฌ๋กœ๋“œ๋Š” ํ’€์— ์žˆ๋Š” ๋ชจ๋“  ID๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ๊ตฌ์„ฑ

์ด ๋ฌธ์„œ์—์„œ ์‚ฌ์šฉํ•˜๋Š”Google Cloud ๋ฆฌ์†Œ์Šค(์˜ˆ: GKE ํด๋Ÿฌ์Šคํ„ฐ, ๋ฃจํŠธ CA, ํ•˜์œ„ CA)๋Š” ๋ณ„๋„์˜ ํ”„๋กœ์ ํŠธ์— ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•  ๋•Œ๋Š” --project ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ๋ฆฌ์†Œ์Šค์— ์˜ฌ๋ฐ”๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

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

  1. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  2. ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

  3. GKE ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ฒ„์ „ 1.33.0-gke.2248000 ์ด์ƒ์„ ์‹คํ–‰ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  4. ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ GKE Fleet์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ Autopilot ํด๋Ÿฌ์Šคํ„ฐ์ธ ๊ฒฝ์šฐ --enable-workload-identity๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. Fleet์€ ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ ์—ญํ• ์„ ํ•˜๋Š” Google ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์„ ์ž๋™์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ GKE Fleet๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

    gcloud container clusters update CLUSTER_NAME \
        --workload-pool=PROJECT_ID.svc.id.goog \
        --enable-fleet \
        --fleet-project=PROJECT_ID
    

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

    • CLUSTER_NAME: GKE Fleet์— ๋“ฑ๋กํ•˜๋ ค๋Š” GKE ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ด๋ฆ„
    • PROJECT_ID: GKE Fleet ํ˜ธ์ŠคํŠธ ํ”„๋กœ์ ํŠธ ID
  5. Enable the IAM and Certificate Authority Service APIs:

    gcloud services enable cloudresourcemanager.googleapis.com iam.googleapis.com privateca.googleapis.com

  6. ๊ฒฐ์ œ ๋ฐ ํ• ๋‹น๋Ÿ‰ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก Google Cloud CLI๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

    gcloud config set billing/quota_project PROJECT_ID
    

    PROJECT_ID๋ฅผ Fleet ํ”„๋กœ์ ํŠธ์˜ ID๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์—ญํ• 

๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ธ์ฆ์„œ๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์œผ๋ ค๋ฉด ๊ด€๋ฆฌ์ž์—๊ฒŒ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋‹ค์Œ IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•ด ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜์„ธ์š”.

์—ญํ•  ๋ถ€์—ฌ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ”„๋กœ์ ํŠธ, ํด๋”, ์กฐ์ง์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ปค์Šคํ…€ ์—ญํ• ์ด๋‚˜ ๋‹ค๋ฅธ ์‚ฌ์ „ ์ •์˜๋œ ์—ญํ• ์„ ํ†ตํ•ด ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์–ป์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ์— ๋Œ€ํ•ด ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋„๋ก CA ์„œ๋น„์Šค ๊ตฌ์„ฑ

GKE์šฉ ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ๋จผ์ € ์ธ์ฆ ๊ธฐ๊ด€(CA)๊ณผ ํ•˜๋‚˜ ์ด์ƒ์˜ ํ•˜์œ„ CA๋ฅผ ๊ตฌ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์„ CA ๊ณ„์ธต ๊ตฌ์กฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

CA ์„œ๋น„์Šค ํ’€์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜์œ„ CA ํ’€์—์„œ ์›Œํฌ๋กœ๋“œ์— X.509 ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.

๋ฃจํŠธ CA ํ’€ ๊ตฌ์„ฑ

๋ฃจํŠธ CA ํ’€์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud privateca pools create๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๋“ฑ๊ธ‰์—์„œ ๋ฃจํŠธ CA ํ’€์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๋“ฑ๊ธ‰์€ ์†Œ๊ทœ๋ชจ์˜ ์žฅ๊ธฐ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

gcloud privateca pools create ROOT_CA_POOL_ID \
    --location=REGION \
    --project=CA_PROJECT_ID \
    --tier=enterprise

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

  • ROOT_CA_POOL_ID: ๋ฃจํŠธ CA ํ’€์˜ ๊ณ ์œ  ID์ž…๋‹ˆ๋‹ค. ID๋Š” ์ตœ๋Œ€ 64์ž์ด๋ฉฐ ์†Œ๋ฌธ์ž ๋ฐ ๋Œ€๋ฌธ์ž ์˜์ˆซ์ž ๋ฌธ์ž, ๋ฐ‘์ค„, ํ•˜์ดํ”ˆ๋งŒ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ’€ ID๋Š” ๋ฆฌ์ „ ๋‚ด์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • REGION: ๋ฃจํŠธ CA ํ’€์ด ์žˆ๋Š” ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.

  • CA_PROJECT_ID: ๋ฃจํŠธ CA๋ฅผ ๋งŒ๋“ค ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค.

CA ํ’€, ๋“ฑ๊ธ‰, ๋ฆฌ์ „์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด CA ํ’€ ๋งŒ๋“ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋ฃจํŠธ CA ๊ตฌ์„ฑ

gcloud privateca roots create๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฃจํŠธ CA ํ’€์— ๋ฃจํŠธ CA๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฃจํŠธ CA ํ’€์—์„œ ์œ ์ผํ•œ CA์ธ ๊ฒฝ์šฐ ๋ฃจํŠธ CA๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฃจํŠธ CA๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud privateca roots create ROOT_CA_ID \
    --pool=ROOT_CA_POOL_ID \
    --subject="CN=ROOT_CA_CN, O=ROOT_CA_ORGANIZATION" \
    --key-algorithm="KEY_ALGORITHM" \
    --max-chain-length=1 \
    --location=REGION \
    --project=CA_PROJECT_ID \
    --auto-enable

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

  • ROOT_CA_ID: ๋ฃจํŠธ CA์˜ ๊ณ ์œ ํ•œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. CA ์ด๋ฆ„์€ ์ตœ๋Œ€ 64์ž์ด๋ฉฐ ์†Œ๋ฌธ์ž ๋ฐ ๋Œ€๋ฌธ์ž ์˜์ˆซ์ž ๋ฌธ์ž, ๋ฐ‘์ค„, ํ•˜์ดํ”ˆ๋งŒ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. CA ์ด๋ฆ„์€ ๋ฆฌ์ „ ๋‚ด์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ROOT_CA_POOL_ID: ๋ฃจํŠธ CA ํ’€์˜ ID์ž…๋‹ˆ๋‹ค.
  • ROOT_CA_CN: ๋ฃจํŠธ CA์˜ ์ผ๋ฐ˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • ROOT_CA_ORGANIZATION: ๋ฃจํŠธ CA์˜ ์กฐ์ง์ž…๋‹ˆ๋‹ค.
  • KEY_ALGORITHM: ํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค(์˜ˆ: ec-p256-sha256).
  • REGION: ๋ฃจํŠธ CA ํ’€์ด ์žˆ๋Š” ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.
  • CA_PROJECT_ID: ๋ฃจํŠธ CA๋ฅผ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค.

CA์˜ subject ํ•„๋“œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ œ๋ชฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฃจํŠธ CA ํ’€์— ๋ฃจํŠธ CA๋ฅผ ์ถ”๊ฐ€๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฃจํŠธ CA ์ˆœํ™˜์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์œ„ CA ๊ตฌ์„ฑ

์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ•˜์œ„ CA๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์œ„ CA๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋‹ค์ค‘ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์‹œ๋‚˜๋ฆฌ์˜ค: ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋Š” ๊ฒฝ์šฐ ์‹œ๋‚˜๋ฆฌ์˜ค๋งˆ๋‹ค ํ•˜์œ„ CA๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณด๋‹ค ํšจ๊ณผ์ ์ธ ๋ถ€ํ•˜ ๋ถ„์‚ฐ: CA ํ’€์— ์—ฌ๋Ÿฌ ํ•˜์œ„ CA๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ธ์ฆ์„œ ์š”์ฒญ์˜ ๋ถ€ํ•˜๋ฅผ ๋” ํšจ๊ณผ์ ์œผ๋กœ ๋ถ„์‚ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์œ„ CA ํ’€๊ณผ ํ•˜์œ„ CA๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋Œ€๊ทœ๋ชจ์˜ ๋‹จ๊ธฐ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰์„ ์œ„ํ•œ DevOps ๋“ฑ๊ธ‰์—์„œ ํ•˜์œ„ CA ํ’€์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    gcloud privateca pools create SUBORDINATE_CA_POOL_ID \
        --location=REGION \
        --project=CA_PROJECT_ID \
        --tier=devops
    

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

    • SUBORDINATE_CA_POOL_ID: ํ•˜์œ„ CA ํ’€์˜ ๊ณ ์œ  ID์ž…๋‹ˆ๋‹ค. ID๋Š” ์ตœ๋Œ€ 64์ž์ด๋ฉฐ ์†Œ๋ฌธ์ž ๋ฐ ๋Œ€๋ฌธ์ž ์˜์ˆซ์ž ๋ฌธ์ž, ๋ฐ‘์ค„, ํ•˜์ดํ”ˆ๋งŒ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ’€ ID๋Š” ๋ฆฌ์ „ ๋‚ด์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • REGION: ํ•˜์œ„ CA ํ’€์„ ๋งŒ๋“ค ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.
    • CA_PROJECT_ID: ํ•˜์œ„ CA๋ฅผ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค.

    ์ž์„ธํ•œ ๋‚ด์šฉ์€ CA ํ’€ ๋งŒ๋“ค๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  2. ํ•˜์œ„ CA ํ’€์— ํ•˜์œ„ CA๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๊ตฌ์„ฑ ๊ธฐ๋ฐ˜ ๋ฐœ๊ธ‰ ๋ชจ๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

    gcloud privateca subordinates create SUBORDINATE_CA_ID \
        --pool=SUBORDINATE_CA_POOL_ID \
        --location=REGION \
        --issuer-pool=ROOT_CA_POOL_ID \
        --issuer-location=REGION \
        --subject="CN=SUBORDINATE_CA_CN, O=SUBORDINATE_CA_ORGANIZATION" \
        --key-algorithm="KEY_ALGORITHM" \
        --use-preset-profile=subordinate_mtls_pathlen_0 \
        --project=CA_PROJECT_ID \
        --auto-enable
    

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

    • SUBORDINATE_CA_ID: ํ•˜์œ„ CA์˜ ๊ณ ์œ ํ•œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ์ตœ๋Œ€ 64์ž์ด๋ฉฐ ์†Œ๋ฌธ์ž ๋ฐ ๋Œ€๋ฌธ์ž ์˜์ˆซ์ž ๋ฌธ์ž, ๋ฐ‘์ค„, ํ•˜์ดํ”ˆ๋งŒ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ’€ ์ด๋ฆ„์€ ๋ฆฌ์ „ ๋‚ด์—์„œ ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • SUBORDINATE_CA_POOL_ID: ํ•˜์œ„ CA ํ’€์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • REGION: ํ•˜์œ„ CA ํ’€์ด ์žˆ๋Š” ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.
    • ROOT_CA_POOL_ID: ๋ฃจํŠธ CA ํ’€์˜ ID์ž…๋‹ˆ๋‹ค.
    • REGION: ๋ฃจํŠธ CA ํ’€์˜ ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.
    • SUBORDINATE_CA_CN: ํ•˜์œ„ CA์˜ ์ผ๋ฐ˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • SUBORDINATE_CA_ORGANIZATION: ํ•˜์œ„ CA ๋ฐœ๊ธ‰ ์กฐ์ง์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • KEY_ALGORITHM: ํ‚ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค(์˜ˆ: ec-p256-sha256).
    • CA_PROJECT_ID: ํ•˜์œ„ CA๋ฅผ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค.

    CA์˜ subject ํ•„๋“œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ œ๋ชฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ตฌ์„ฑ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

CA๋ฅผ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์— ๋ฐ”์ธ๋”ฉํ•˜๋ ค๋ฉด ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ตฌ์„ฑ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ์—์„œ ์›Œํฌ๋กœ๋“œ๋ฅผ ์ธ์ฆํ•˜๋ ค๋ฉด ํŠธ๋Ÿฌ์ŠคํŠธ ๊ตฌ์„ฑ ์„ค์ •์œผ๋กœ ํ’€์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ตฌ์„ฑ์„ ๊ตฌ์„ฑํ•˜๋ ค๋ฉด ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํŒŒ์ผ์˜ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

{
  "inlineCertificateIssuanceConfig": {
      "caPools": {
        "REGION1": "projects/CA_PROJECT_NUMBER1/locations/REGION1/caPools/SUBORDINATE_CA_POOL_ID1",
        "REGION2": "projects/CA_PROJECT_NUMBER2/locations/REGION2/caPools/SUBORDINATE_CA_POOL_ID2"
      },
      "lifetime": "DURATION",
      "rotationWindowPercentage": ROTATION_WINDOW_PERCENTAGE,
      "keyAlgorithm": "ALGORITHM"
  }
}

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

  • REGION: CA๊ฐ€ ์žˆ๋Š” ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.

  • CA_PROJECT_NUMBER: ํ•˜์œ„ CA ํ’€์„ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค. CA_PROJECT_ID ํ”„๋กœ์ ํŠธ์—์„œ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    gcloud projects describe CA_PROJECT_ID --format="value(projectNumber)"
    
  • SUBORDINATE_CA_POOL_ID: ํ•˜์œ„ CA ํ’€์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

  • ALGORITHM: ์„ ํƒ์‚ฌํ•ญ. ๋น„๊ณต๊ฐœ ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ์œ ํšจํ•œ ๊ฐ’์€ ECDSA_P256(๊ธฐ๋ณธ๊ฐ’), ECDSA_P384, RSA_2048, RSA_3072, RSA_4096์ž…๋‹ˆ๋‹ค.

  • DURATION: ์„ ํƒ์‚ฌํ•ญ. ๋ฆฌํ”„ ์ธ์ฆ์„œ ์œ ํšจ ๊ธฐ๊ฐ„(์ดˆ). ๊ฐ’์€ 86400(1์ผ)์—์„œ 2592000(30์ผ) ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’ 86400(1์ผ)์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฐœ๊ธ‰๋œ ์ธ์ฆ์„œ์˜ ์‹ค์ œ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ๋Š” ๋ฐœ๊ธ‰๋œ ์ธ์ฆ์„œ์˜ ์ˆ˜๋ช…์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐœ๊ธ‰ํ•˜๋Š” CA์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

  • ROTATION_WINDOW_PERCENTAGE: ์„ ํƒ์‚ฌํ•ญ: ๊ฐฑ์‹ ์ด ํŠธ๋ฆฌ๊ฑฐ๋˜๋Š” ์ธ์ฆ์„œ ์ˆ˜๋ช…์˜ ๋ฐฑ๋ถ„์œจ. ๊ฐ’์€ 50์—์„œ 80 ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 50์ž…๋‹ˆ๋‹ค.

ํŠธ๋Ÿฌ์ŠคํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ ๋™์ผํ•œ ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ ๋‚ด์˜ ์›Œํฌ๋กœ๋“œ๋Š” ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒํ˜ธ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ์— ์žˆ๋Š” ์›Œํฌ๋กœ๋“œ๊ฐ€ ์ƒํ˜ธ ์ธ์ฆํ•˜๋„๋ก ํ•˜๋ ค๋ฉด ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์—์„œ ํŠธ๋Ÿฌ์ŠคํŠธ ๊ด€๊ณ„๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋„๋ฉ”์ธ์˜ ์ธ์ฆ์„œ๋ฅผ ์ œ๊ณตํ•˜๋Š” inlineTrustConfig๊ฐ€ ํฌํ•จ๋œ ํŠธ๋Ÿฌ์ŠคํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ด๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋Ÿฌ์ŠคํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์—๋Š” ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๊ฐ€ ํ”ผ์–ด ์ธ์ฆ์„œ๋ฅผ ๊ฒ€์ฆํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์‹ ๋ขฐ ์•ต์ปค ์ง‘ํ•ฉ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋Ÿฌ์ŠคํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์€ SPIFFE ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ์„ CA ์ธ์ฆ์„œ์— ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋Ÿฌ์ŠคํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋งŒ๋“ค๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

  1. ์ธ์ฆ์„œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    gcloud privateca pools get-ca-certs ROOT_CA_POOL_ID \
        --output-file=CERTIFICATE_PATH \
        --location=REGION
    

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

    • ROOT_CA_POOL_ID: ๋ฃจํŠธ CA ํ’€์˜ ID
    • CERTIFICATE_PATH: PEM ์ธ์ฝ”๋”ฉ ์ธ์ฆ์„œ๋ฅผ ์ถœ๋ ฅํ•  ๊ฒฝ๋กœ
    • REGION: ๋ฃจํŠธ CA ํ’€์˜ ๋ฆฌ์ „

  2. PEM ํ˜•์‹ ์ธ์ฆ์„œ๊ฐ€ ํฌํ•จ๋œ ์ธ๋ผ์ธ ํŠธ๋Ÿฌ์ŠคํŠธ ๊ตฌ์„ฑ์ด ํฌํ•จ๋œ ํŒŒ์ผ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
    {
      "inlineTrustConfig": {
        "additionalTrustBundles": {
          "TRUST_DOMAIN_NAME1": {
            "trustAnchors": [
              {
                  "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL1\n-----END CERTIFICATE-----"
              },
              {
                  "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL2\n-----END CERTIFICATE-----"
              }
            ]
          },
          "TRUSTED_DOMAIN_NAME2": {
            "trustAnchors": [
              {
                  "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL3\n-----END CERTIFICATE-----"
              },
              {
                  "pemCertificate": "-----BEGIN CERTIFICATE-----\nCERTIFICATE_MATERIAL4\n-----END CERTIFICATE-----"
              }
            ]
          }
        }
      }
    }
    

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

    • TRUST_DOMAIN_NAME: ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์˜ ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
      PROJECT_ID.svc.id.goog
      
    • CERTIFICATE_MATERIAL: ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ์—์„œ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” PEM ํ˜•์‹์˜ CA ์ธ์ฆ์„œ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.

CA๋ฅผ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์— ๋ฐ”์ธ๋”ฉ

CA ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฐ CA์˜ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ตฌ์„ฑ์„ ๋งŒ๋“  ํ›„ CA๋ฅผ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. CA๋ฅผ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์— ๋ฐ”์ธ๋”ฉํ•˜๋ ค๋ฉด CA์˜ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ตฌ์„ฑ์œผ๋กœ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ’€์ด ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€ ์—…๋ฐ์ดํŠธ

ํ’€์„ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud iam workload-identity-pools update TRUST_DOMAIN_NAME \
    --location="global" \
    --inline-certificate-issuance-config-file=CIC_JSON_FILE_PATH \
    --inline-trust-config-file=TC_JSON_FILE_PATH \
    --project=PROJECT_ID

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

  • TRUST_DOMAIN_NAME: ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ, ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    PROJECT_ID.svc.id.goog
    
  • CIC_JSON_FILE_PATH: ์ด์ „์— ๋งŒ๋“  JSON ํ˜•์‹์˜ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ตฌ์„ฑ ํŒŒ์ผ(cic.json)์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

  • TC_JSON_FILE_PATH: ์„ ํƒ์‚ฌํ•ญ. ์ด์ „์— ๋งŒ๋“  JSON ํ˜•์‹ ํŠธ๋Ÿฌ์ŠคํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ(tc.json)์˜ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ์›Œํฌ๋กœ๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ์—์„œ ์ธ์ฆํ•˜๋Š” ๊ฒฝ์šฐ ์ด ํŒŒ์ผ์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด --inline-trust-config๋ฅผ ์ƒ๋žตํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์ด ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์ด ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ตฌ์„ฑ ๋ฐ ํŠธ๋Ÿฌ์ŠคํŠธ ๊ตฌ์„ฑ๊ณผ ํ•จ๊ป˜ ์—…๋ฐ์ดํŠธ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

gcloud iam workload-identity-pools describe TRUST_DOMAIN_NAME \
    --location="global" \
    --project=PROJECT_ID

TRUST_DOMAIN_NAME์„ ์ด ๋ฌธ์„œ ์•ž๋ถ€๋ถ„์—์„œ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

๋ช…๋ น์–ด ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

inlineCertificateIssuanceConfig:
    caPools:
      REGION1: projects/PROJECT_NUMBER1/locations/REGION1/caPools/SUBORDINATE_CA_POOL_ID1,
      REGION2: projects/PROJECT_NUMBER2/locations/REGION2/caPools/SUBORDINATE_CA_POOL_ID2
    keyAlgorithm: ALGORITHM
    lifetime: DURATION
    rotationWindowPercentage: ROTATION_WINDOW_PERCENTAGE
inlineTrustConfig:
    additionalTrustBundles:
      example.com:
          trustAnchors:
          - pemCertificate: |-
            -----BEGIN CERTIFICATE-----
            CERTIFICATE_MATERIAL1
            -----END CERTIFICATE-----
          - pemCertificate: |-
            -----BEGIN CERTIFICATE-----
            CERTIFICATE_MATERIAL2
            -----END CERTIFICATE-----
      myorg.com:
          trustAnchors:
          - pemCertificate: |-
            -----BEGIN CERTIFICATE-----
            CERTIFICATE_MATERIAL3
            -----END CERTIFICATE-----
          - pemCertificate: |-
            -----BEGIN CERTIFICATE-----
            CERTIFICATE_MATERIAL4
            -----END CERTIFICATE-----
name: PROJECT_ID.svc.id.goog
state: ACTIVE

๋ช…๋ น์–ด ์ถœ๋ ฅ์— inlineCertificateIssuanceConfig ๋˜๋Š” inlineTrustConfig๊ฐ€ ์—†์œผ๋ฉด gcloud CLI๊ฐ€ ๊ฒฐ์ œ ๋ฐ ํ• ๋‹น๋Ÿ‰์— ์˜ฌ๋ฐ”๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  ๋ฒ„์ „์˜ gcloud CLI๋กœ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

CA ํ’€์—์„œ ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•˜๋„๋ก ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๋ฅผ ์Šน์ธ

CA๋ฅผ ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์— ๋ฐ”์ธ๋”ฉํ•œ ํ›„ ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๊ฐ€ CA ํ’€์—์„œ ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•˜๋„๋ก ์Šน์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ID๋ฅผ ์Šน์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

  1. ๊ฐ ํ•˜์œ„ CA ํ’€์—์„œ CA Service ์›Œํฌ๋กœ๋“œ ์ธ์ฆ์„œ ์š”์ฒญ์ž(roles/privateca.workloadCertificateRequester) IAM ์—ญํ• ์„ ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ์— ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ gcloud privateca pools add-iam-policy-binding ๋ช…๋ น์–ด๋Š” ํŠธ๋Ÿฌ์ŠคํŠธ ๋„๋ฉ”์ธ์ด CA ์„œ๋น„์Šค ์ธ์ฆ์„œ ์ฒด์ธ์—์„œ ์ธ์ฆ์„œ๋ฅผ ์š”์ฒญํ•˜๋„๋ก ์Šน์ธํ•ฉ๋‹ˆ๋‹ค.

    gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
        --location=REGION \
        --role=roles/privateca.workloadCertificateRequester \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog" \
        --project=CA_PROJECT_ID
    

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

    • SUBORDINATE_CA_POOL_ID: ํ•˜์œ„ CA ํ’€์˜ ID์ž…๋‹ˆ๋‹ค.
    • REGION: ํ•˜์œ„ CA ํ’€์˜ ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.
    • PROJECT_NUMBER: GKE ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

      PROJECT_ID์—์„œ PROJECT_NUMBER๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
      
    • PROJECT_ID: GKE Fleet ํ˜ธ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค.

    • CA_PROJECT_ID: ํ•˜์œ„ CA๋ฅผ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค.

  2. ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ์— ์ข…์† CA ํ’€์— ๋Œ€ํ•œ CA ์„œ๋น„์Šค ํ’€ ๋ฆฌ๋”(roles/privateca.poolReader) ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๊ฐ€ CA ์ธ์ฆ์„œ ์ฒด์ธ์—์„œ ์„œ๋ช…๋œ X.509 ์ธ์ฆ์„œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    gcloud privateca pools add-iam-policy-binding SUBORDINATE_CA_POOL_ID \
        --location=REGION \
        --role=roles/privateca.poolReader \
        --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/name/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog" \
        --project=CA_PROJECT_ID
    

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

    • SUBORDINATE_CA_POOL_ID: ํ•˜์œ„ CA ํ’€์˜ ID์ž…๋‹ˆ๋‹ค.
    • REGION: ํ•˜์œ„ CA ํ’€์˜ ๋ฆฌ์ „์ž…๋‹ˆ๋‹ค.
    • PROJECT_NUMBER: GKE ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ ํ’€์ด ํฌํ•จ๋œ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.
    • PROJECT_ID: GKE Fleet ํ˜ธ์ŠคํŠธ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ID์ž…๋‹ˆ๋‹ค.
    • CA_PROJECT_ID: ํ•˜์œ„ CA๋ฅผ ๋งŒ๋“  ํ”„๋กœ์ ํŠธ์˜ ID์ž…๋‹ˆ๋‹ค.

๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๋กœ ์›Œํฌ๋กœ๋“œ ๋ฐฐํฌ

๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ์˜ ์ธ์ฆ์„œ๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋„๋ก CA ํ’€์„ ๊ตฌ์„ฑํ•œ ํ›„ ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๊ฐ€ ์žˆ๋Š” ์›Œํฌ๋กœ๋“œ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์„น์…˜์—์„œ๋Š” ๊ด€๋ฆฌํ˜• ์›Œํฌ๋กœ๋“œ ์•„์ด๋ดํ‹ฐํ‹ฐ๊ฐ€ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ์›Œํฌ๋กœ๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ํฌ๋“œ๋ฅผ ๋ฐฐํฌํ•˜๊ณ , ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ์ธ์ฆ์„œ์™€ SPIFFE ID๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ํฌ๋“œ ๋ฐฐํฌ

ํด๋Ÿฌ์Šคํ„ฐ์— ํ…Œ์ŠคํŠธ ํฌ๋“œ๋ฅผ ๋ฐฐํฌํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ํด๋Ÿฌ์Šคํ„ฐ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    gcloud container clusters get-credentials CLUSTER_NAME \
        --location=CLUSTER_ZONE \
        --project=CLUSTER_PROJECT_ID
    
  2. Kubernetes ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    kubectl create namespace KUBERNETES_NAMESPACE
    
  3. ํ…Œ์ŠคํŠธ PodSpec์„ ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

    cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      namespace: KUBERNETES_NAMESPACE
      name: example-pod
    spec:
      containers:
      - name: main
        image: debian
        command: ['sleep', 'infinity']
        volumeMounts:
        - name: fleet-spiffe-credentials
          mountPath: /var/run/secrets/workload-spiffe-credentials
          readOnly: true
      nodeSelector:
        iam.gke.io/gke-metadata-server-enabled: "true"
      volumes:
      - name: fleet-spiffe-credentials
        csi:
          driver: podcertificate.gke.io
          volumeAttributes:
            signerName: spiffe.gke.io/fleet-svid
            trustDomain: fleet-project/svc.id.goog
    EOF
    

์›Œํฌ๋กœ๋“œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ๋‚˜์—ด

์›Œํฌ๋กœ๋“œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๋‚˜์—ดํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ๋ช‡ ๋ถ„ ์ •๋„ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

kubectl exec -it example-pod -n KUBERNETES_NAMESPACE -- ls  /var/run/secrets/workload-spiffe-credentials

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ca_certificates.pem
certificates.pem
private_key.pem
trust_bundles.json

์ธ์ฆ์„œ ๋ณด๊ธฐ

์ธ์ฆ์„œ๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ์ธ์ฆ์„œ๋ฅผ ์ธ์ฆ์„œ ํŒŒ์ผ๋กœ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

    kubectl exec -it example-pod --namespace=KUBERNETES_NAMESPACE -- cat /var/run/secrets/workload-spiffe-credentials/certificates.pem | openssl x509 -noout -text > certfile
    
  2. ์ธ์ฆ์„œ ํŒŒ์ผ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    cat certfile
    

    ์ธ์ฆ์„œ์˜ X509v3 Subject Alternative Name ์†์„ฑ์—๋Š” spiffe://PROJECT_ID.svc.id.goog/ns/KUBERNETES_NAMESPACE/sa/default ํ˜•์‹์˜ SPIFFE ID๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    default๋Š” ๊ธฐ๋ณธ Kubernetes ServiceAccount๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์›Œํฌ๋กœ๋“œ ๊ฐ„ ์ธ์ฆ ํ…Œ์ŠคํŠธ

์›Œํฌ๋กœ๋“œ ๊ฐ„ ์ธ์ฆ์„ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด Go๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ mTLS ์ธ์ฆ ํ…Œ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ €์žฅ์†Œ์˜ ์ƒ˜ํ”Œ ์ฝ”๋“œ๋Š” client ๋ฐ server ์›Œํฌ๋กœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๋ฌธ์„œ์˜ ์•ž๋ถ€๋ถ„์—์„œ ์ƒ์„ฑํ•œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›Œํฌ๋กœ๋“œ ๊ฐ„์˜ ์ƒํ˜ธ ์ธ์ฆ์„ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ง์ ‘ ์‚ฌ์šฉํ•ด ๋ณด๊ธฐ

Google Cloud๋ฅผ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ณ„์ •์„ ๋งŒ๋“ค๊ณ  Google ์ œํ’ˆ์˜ ์‹ค์ œ ์„ฑ๋Šฅ์„ ํ‰๊ฐ€ํ•ด ๋ณด์„ธ์š”. ์‹ ๊ทœ ๊ณ ๊ฐ์—๊ฒŒ๋Š” ์›Œํฌ๋กœ๋“œ๋ฅผ ์‹คํ–‰, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” $300์˜ ๋ฌด๋ฃŒ ํฌ๋ ˆ๋”ง์ด ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๋ฌด๋ฃŒ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ