Search

[CKA] 49. Service Account

Date
2025/01/16
Category
Devops
Tag
Kubernetes
CKA
Security
๋ชฉ์ฐจ

ย Serviceย Account

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๊ณ„์ • ์œ ํ˜•์ด ์žˆ๋‹ค: ์‚ฌ์šฉ์ž ๊ณ„์ •๊ณผ ์„œ๋น„์Šค ๊ณ„์ •์ด๋‹ค.
โ€ข
User Account: ์‚ฌ๋žŒ(๊ด€๋ฆฌ์ž, ๊ฐœ๋ฐœ์ž ๋“ฑ)์ด ํด๋Ÿฌ์Šคํ„ฐ์— ์ ‘๊ทผํ•˜์—ฌ ๊ด€๋ฆฌ ์ž‘์—…์ด๋‚˜ ์•ฑ ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ์‚ฌ์šฉ
โ€ข
Service Account: Machine(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์ด ํด๋Ÿฌ์Šคํ„ฐ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ์‚ฌ์šฉ
โ—ฆ
Prometheus, Jenkins ๊ฐ™์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด Service Account๋ฅผ ํ†ตํ•ด Kubernetes API์— ์ ‘๊ทผ
My Kubernetes Dashboard ๋ผ๋Š” ๋Œ€์‹œ๋ณด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜์˜€์„ ๋•Œ, ํด๋Ÿฌ์Šคํ„ฐ์˜ ํŒŒ๋“œ ๋ชฉ๋ก์„ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„  Kubernetes API์— ์š”์ฒญ์„ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค.

ย Service Account Token

Kubernetes API๋ฅผ ์ฟผ๋ฆฌ์— Service Account์ด ํ•„์š”ํ•˜๋ฉฐ, ๊ทธ์— ๋Œ€ํ•œ ์ธ์ฆ์œผ๋กœ Token์ด ํ•„์š”ํ•˜๋‹ค. ์ฐธ๊ณ ๋กœ ์ด ํ† ํฐ์€ JWT ํ† ํฐ์ด๋‹ค.
v1.24 ๋ฒ„์ „ ์ด์ „์—๋Š” ์„œ๋น„์Šค ๊ณ„์ •์ด ์ƒ์„ฑ๋˜๋ฉด, ๊ทธ์— ๋Œ€ํ•œ ํ† ํฐ์ด Sercret์œผ๋กœ ์ž๋™์ƒ์„ฑ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ดํ›„ ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค.
# Service Account ์ƒ์„ฑ kubectl create serviceaccount <Service Account> # Service Account Token ์ƒ์„ฑ kubectl create token <Service Account>
Bash
๋ณต์‚ฌ
๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์„ค์ •ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ 1์‹œ๊ฐ„์˜ ๋งŒ๋ฃŒ์‹œ๊ฐ„์„ ๊ฐ€์ง„๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ์ฝ”๋“œ๋Š” ํ•œ ์‹œ๊ฐ„์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๊ฐ–๋Š” ์ฝ”๋“œ๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
์œ„ ์ฝ”๋“œ๋Š” ์ผํšŒ์„ฑ์œผ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๊ณ  ๋งŒ๋ฃŒ์‹œ๊ฐ„์ด ์žˆ๋Š” ํ† ํฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์ž๋™ ๊ฐฑ์‹ ๋˜๋Š” ํ† ํฐ์„ ์–ป์–ด์•ผ ํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์ง€์›ํ•˜๋Š” ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ ๋ฐœ๊ธ‰ ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:
โ€ข
TokenRequest API (recommended)
โ—ฆ
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ๋‚ด์—์„œ API๋ฅผ ํ†ตํ•ด ํ† ํฐ์„ ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹
โ—ฆ
ํ† ํฐ์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ฉฐ, ์ž๋™์œผ๋กœ ๊ฐฑ์‹  ๊ฐ€๋Šฅ
โ€ข
Token Volume Projection (recommended)
โ—ฆ
kubelet์—๊ฒŒ projected volume์œผ๋กœ ํ† ํฐ์„ Pod์— ์ถ”๊ฐ€ํ•˜๋ผ๊ณ  ์ง€์‹œ
โ—ฆ
ํ† ํฐ์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๊ฐ€์ง€๋ฉฐ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐฑ์‹ 
โ€ข
Service Account Token Secrets (not recommended)
โ—ฆ
ํ† ํฐ์„ secret์— ๋งˆ์šดํŠธํ•˜์—ฌ ์‚ฌ์šฉ
โ—ฆ
ํ† ํฐ์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์ด ์—†์œผ๋ฉฐ, ์˜๊ตฌ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
โ—ฆ
TokenRequest API๋กœ ํ† ํฐ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š์„ ๋•Œ๋งŒ ์‚ฌ์šฉ ๊ถŒ์žฅ

ย Service Account Token Secrets

v1.24 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ์„œ๋น„์Šค ๊ณ„์ •์ด ์‹œํฌ๋ฆฟ์œผ๋กœ ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค. ์ด์ „๊ณผ ๊ฐ™์€ ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“œ๋ ค๋ฉด ์ˆ˜๋™์œผ๋กœ ์‹œํฌ๋ฆฟ์„ ์ƒ์„ฑํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด ๋ฐฉ์‹์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๊ถŒ์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ, ํ•ด๋‹น ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋œ ํ† ํฐ์€ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์ด ์—†๋‹ค.
apiVersion: v1 kind: Secret type: kubernetes.io/service-account-token metadata: name: dashboard-sa-token annotations: kubernetes.io/service-account.name: dashboard-sa # Service Account ์ง€์ •
YAML
๋ณต์‚ฌ
kubernetes.io/service-account.name ์ด๋ž€ annotations๋ฅผ ์‚ฌ์šฉ๋Š”๋ฐ, ์ด annotations์€ imperative ๋ฐฉ์‹์œผ๋กœ๋Š” ์ƒ์„ฑ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๋“ฏํ•˜๋‹ค.
์ดํ›„ ์ƒ์„ฑ๋œ Secret์—์„œ ํ† ํฐ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
kubectl describe secret dashboard-sa-token
Bash
๋ณต์‚ฌ

ย TokenRequest API

TokenRequest API๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ํŠน์ • Service Account์— ๋Œ€ํ•œ ํ† ํฐ์„ ์š”์ฒญํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
JWT๋Š” Audience, Time์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š์œผ๋ฉฐ, ๊ฐ JWT๋Š” Service Account๋งˆ๋‹ค ๋ณ„๋„์˜ Secret ๊ฐ์ฒด๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด JWT์˜ ์˜๊ตฌ์„ฑ์œผ๋กœ ์ธํ•œ ๋ณด์•ˆ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค. Kubernetes v1.22 ๋ถ€ํ„ฐ TokenRequest API๊ฐ€ ๋„์ž…๋˜์–ด ์งง์€ ์ˆ˜๋ช…์˜ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋„๋ก ํ–ˆ๋‹ค. TokenRequest API๊ฐ€ ๊ฐ–๋Š” ํŠน์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:
โ€ข
Audience Bound: ํŠน์ • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ ์ œํ•œ
โ€ข
Time Bound: ์งง์€ ์ˆ˜๋ช…์œผ๋กœ ์„ค์ •๋˜์–ด ์ž๋™์œผ๋กœ ๋งŒ๋ฃŒ
โ€ข
Object Bound: ํŠน์ • ๊ฐ์ฒด์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์‚ฌ์šฉ
์ด๋กœ์จ Token์˜ ๋ณด์•ˆ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์•„์กŒ๋‹ค.

ย Token Volume Projection

์„œ๋น„์Šค ํ† ํฐ ์‹œํฌ๋ฆฟ์„ Pod ๋‚ด์˜ ๋ณผ๋ฅจ์œผ๋กœ ๋งˆ์šดํŠธ์‹œํ‚ค๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ† ํฐ์„ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ API ํ˜ธ์ถœ์„ ํ•  ํ•„์š” ์—†์ด, Pod ๋‚ด์—์„œ ์‰ฝ๊ฒŒ ์ฝ์–ด ๋“ค์ผ ์ˆ˜ ์žˆ๋‹ค.
๊ธฐ์กด์—๋Š” ์„œ๋น„์Šค ๊ณ„์ •๊ณผ ์—ฐ๊ฒฐ๋œ ์ •์ ์ธ Secret Token์ด Pod์— ๋งˆ์šดํŠธ๋˜์—ˆ์ง€๋งŒ, Kubernetes v1.22 ๋ถ€ํ„ฐ TokenRequest API๊ฐ€ ๋„์ž…๋จ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ํ† ํฐ์„ ์ƒ์„ฑํ•œ๋‹ค. ์ด ํ† ํฐ์€ Projected Volume์œผ๋กœ ๋งˆ์šดํŠธ๋˜์–ด ์ž๋™ ๋งŒ๋ฃŒ ๋ฐ ๊ฐฑ์‹ ์„ ํ•œ๋‹ค.

ย VolumeMount

apiVersion: v1 kind: Pod metadata: name: my-kubernetes-dashboard spec: containers: - name: my-kubernetes-dashboard image: my-kubernetes-dashboard serviceAccountName: dashboard-sa # ์‚ฌ์šฉํ•  Service Account ์ง€์ •
YAML
๋ณต์‚ฌ
Pod์˜ Service Account๋Š” ์ƒ์„ฑํ•  ๋•Œ๋งŒ ์ง€์ •์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ˆ˜์ •์ด ํ•„์š”ํ•˜๋‹ค๋ฉด Pod๋ฅผ ์žฌ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

ย View Token

ํ† ํฐ์˜ ์œ„์น˜๋Š” /var/run/secrets/kubernetes.io/serviceaccount์— ๋งˆ์šดํŠธ๋˜๋ฉฐ, ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ์—๋Š” ca.crt, namespace, token ์ด 3๊ฐœ์˜ ๋ณ„๊ฐœ ํŒŒ์ผ๋กœ Secret์ด ๋งˆ์šดํŠธ๋œ๋‹ค. ์‹ค์ œ ํ† ํฐ์„ ๊ฐ€์ง„ ๊ฒƒ์€ token ํŒŒ์ผ์ด๋‹ค.
kubectl exec -it my-kubernetes-dashboard cat /var/run/secrets/kubernetes.io/serviceaccount/token
Bash
๋ณต์‚ฌ

ย Auto Mount

spec.serviceAccountName์„ ๋ช…์‹œํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” default ์„œ๋น„์Šค ๊ณ„์ •์ด ๋งˆ์šดํŠธ๋œ๋‹ค. ์ž๋™์œผ๋กœ ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งˆ์šดํŠธํ•˜๋Š” ๊ฒƒ์„ ์›์น˜ ์•Š์„ ๊ฒฝ์šฐ์—๋Š” spec.automountServiceAccountToken: false ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
apiVersion: v1 kind: Pod metadata: name: my-kubernetes-dashboard spec: containers: - name: my-kubernetes-dashboard image: my-kubernetes-dashboard automountServiceAccountToken: false # ์ž๋™ ๋งˆ์šดํŠธ ๋น„ํ™œ์„ฑํ™”
YAML
๋ณต์‚ฌ