Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.21] 3๋ถ€ ๋ณด์•ˆ ๋ฐ ์ธ์ฆ #5 | Istio์˜ Identity ๋ฐ ์ธ์ฆ ์ฒด๊ณ„ ์ดํ•ด

ygtoken 2025. 3. 18. 12:07
728x90

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio์˜ Identity(์‹ ์›) ๋ฐ ์ธ์ฆ(Authentication) ์ฒด๊ณ„๋ฅผ ์ดํ•ดํ•˜๊ณ , ์„œ๋น„์Šค ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
Istio๋Š” ์„œ๋น„์Šค ๊ฐ„์˜ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ณ ์œ ํ•œ ์„œ๋น„์Šค ID๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด Zero Trust ๋ณด์•ˆ ๋ชจ๋ธ์„ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,
mTLS(Mutual TLS), JWT(JSON Web Token), OAuth 2.0 ๋“ฑ์˜ ์ธ์ฆ ๋ฐฉ์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” Istio์˜ ์ธ์ฆ ์ฒด๊ณ„, ์„œ๋น„์Šค ID ๋ฐœ๊ธ‰ ๋ฐฉ์‹, ๊ทธ๋ฆฌ๊ณ  mTLS ๋ฐ JWT๋ฅผ ํ™œ์šฉํ•œ ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. Istio์˜ Identity(์‹ ์›) ์‹œ์Šคํ…œ

โœ… 1.1 Istio์—์„œ Identity๋ž€?

Istio์˜ Identity(์‹ ์›)๋Š” ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์—์„œ ์‹ ๋ขฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ณด์•ˆ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.
๊ฐ ์„œ๋น„์Šค๋Š” Istio๋ฅผ ํ†ตํ•ด ๊ณ ์œ ํ•œ ID๋ฅผ ๋ถ€์—ฌ๋ฐ›์œผ๋ฉฐ, ์ด ID๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธ์ฆ์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

Istio์˜ Identity ์ฃผ์š” ํŠน์ง•

  • ์„œ๋น„์Šค ๊ฐ„ mTLS๋ฅผ ํ†ตํ•ด ์ธ์ฆ์„œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅ
  • ๊ฐ ์„œ๋น„์Šค๊ฐ€ ๊ณ ์œ ํ•œ ์„œ๋น„์Šค ๊ณ„์ •(Service Account)๊ณผ ์ธ์ฆ์„œ๋ฅผ ๊ฐ€์ง
  • Zero Trust ๋ณด์•ˆ ๋ชจ๋ธ์„ ์ง€์›ํ•˜์—ฌ, ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์—์„œ๋„ ์ธ์ฆ์„ ์š”๊ตฌ

โœ… 1.2 Istio์˜ ์„œ๋น„์Šค Identity ๋ฐœ๊ธ‰ ๋ฐฉ์‹

Istio๋Š” ๊ฐ ์„œ๋น„์Šค์— ๋Œ€ํ•ด SPIFFE(Secure Production Identity Framework for Everyone) ID๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
SPIFFE ID๋Š” ์„œ๋น„์Šค์˜ ๊ณ ์œ ํ•œ ์‹ ์›์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์„œ๋น„์Šค ๊ฐ„ ์ธ์ฆ ๋ฐ ์ ‘๊ทผ ์ œ์–ด์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Istio์˜ SPIFFE ID ํ˜•์‹

spiffe://cluster.local/ns/<namespace>/sa/<service-account>

์˜ˆ์ œ:

spiffe://cluster.local/ns/default/sa/my-service

๐Ÿ’ก Istio๋Š” SPIFFE ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์„œ๋น„์Šค ๊ฐ„ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 2. Istio์—์„œ ์ธ์ฆ(Authentication) ๋ฐฉ์‹

โœ… 2.1 mTLS(Mutual TLS) ์ธ์ฆ

**mTLS(Mutual TLS)**๋Š” ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์„ ์•”ํ˜ธํ™”ํ•˜๊ณ , ๊ฐ ์„œ๋น„์Šค๊ฐ€ ์„œ๋กœ์˜ ์‹ ์›์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
Istio์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ mTLS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

mTLS ์ธ์ฆ์„ ์œ„ํ•œ PeerAuthentication ์„ค์ •

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: enable-mtls
  namespace: default
spec:
  mtls:
    mode: STRICT  # ๋ชจ๋“  ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ mTLS๋กœ ์•”ํ˜ธํ™”

์„ค๋ช…:

  • mtls.mode: STRICT → ๋ชจ๋“  ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์„ ์•”ํ˜ธํ™”(mTLS ์ ์šฉ)

๐Ÿ’ก mTLS๋ฅผ ์ ์šฉํ•˜๋ฉด, Istio๋Š” ์„œ๋น„์Šค ๊ฐ„์˜ ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์„ ์ž๋™์œผ๋กœ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.


โœ… 2.2 JWT(JSON Web Token) ์ธ์ฆ

Istio๋Š” JWT๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋˜๋Š” ์„œ๋น„์Šค ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JWT ์ธ์ฆ์„ ์œ„ํ•œ RequestAuthentication ์„ค์ •

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: jwt-auth
  namespace: default
spec:
  selector:
    matchLabels:
      app: my-service  # ํŠน์ • ์„œ๋น„์Šค์— JWT ์ธ์ฆ ์ ์šฉ
  jwtRules:
    - issuer: "https://auth.example.com"  # JWT ๋ฐœ๊ธ‰์ž
      jwksUri: "https://auth.example.com/.well-known/jwks.json"  # ๊ณต๊ฐœ ํ‚ค URI

์„ค๋ช…:

  • issuer → JWT ๋ฐœ๊ธ‰์ž(OAuth 2.0 ์ธ์ฆ ์„œ๋ฒ„)
  • jwksUri → JWT ์„œ๋ช…์„ ๊ฒ€์ฆํ•  ๊ณต๊ฐœ ํ‚ค URL

๐Ÿ’ก JWT๋ฅผ ์ ์šฉํ•˜๋ฉด API ์š”์ฒญ ์‹œ ์œ ํšจํ•œ JWT ํ† ํฐ์ด ํฌํ•จ๋˜์–ด์•ผ๋งŒ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 2.3 Istio์˜ AuthorizationPolicy๋ฅผ ํ™œ์šฉํ•œ ์ธ์ฆ ๊ฐ•ํ™”

Istio์—์„œ๋Š” AuthorizationPolicy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์‹ ์›(Identity)์— ๋”ฐ๋ผ ์„œ๋น„์Šค ์ ‘๊ทผ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JWT ์ธ์ฆ์„ ์š”๊ตฌํ•˜๋Š” AuthorizationPolicy ์„ค์ •

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: require-jwt
  namespace: default
spec:
  action: ALLOW
  rules:
    - from:
        - source:
            requestPrincipals: ["https://auth.example.com/*"]  # JWT ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋งŒ ํ—ˆ์šฉ
      to:
        - operation:
            paths: ["/secure-api"]  # ๋ณดํ˜ธํ•  API ๊ฒฝ๋กœ

์„ค๋ช…:

  • requestPrincipals: ["https://auth.example.com/*"] → JWT ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋งŒ ํ—ˆ์šฉ
  • operation.paths: ["/secure-api"] → ํŠน์ • API ๊ฒฝ๋กœ ๋ณดํ˜ธ

๐Ÿ’ก ์ด ์„ค์ •์„ ์ ์šฉํ•˜๋ฉด, JWT ์ธ์ฆ์„ ๊ฑฐ์น˜์ง€ ์•Š์€ ์š”์ฒญ์€ /secure-api์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 3. ์ธ์ฆ ์ ์šฉ ํ›„ ํ™•์ธ ๋ฐฉ๋ฒ•

โœ… 3.1 ์„œ๋น„์Šค์˜ Identity ํ™•์ธ

ํ˜„์žฌ ์„œ๋น„์Šค๊ฐ€ ์–ด๋–ค Identity(SPIFFE ID)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl exec -it <pod-name> -n <namespace> -- cat /etc/istio/proxy/certs/root-cert.pem

โœ… 3.2 JWT ์ธ์ฆ ํ…Œ์ŠคํŠธ

JWT๋ฅผ ํฌํ•จํ•˜์—ฌ API ์š”์ฒญ์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

curl -H "Authorization: Bearer " https://api.example.com/secure-api

๐Ÿ’ก ์œ ํšจํ•œ JWT๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฉด 401 Unauthorized ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ ๊ฒฐ๋ก 

  • Istio๋Š” ์„œ๋น„์Šค ๊ฐ„ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด Identity(SPIFFE ID)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • mTLS(Mutual TLS)๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์„ ์•”ํ˜ธํ™”ํ•˜๊ณ , ์ƒํ˜ธ ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • JWT ์ธ์ฆ์„ ํ™œ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ API ์š”์ฒญ์„ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, OAuth 2.0 ๋ฐ OIDC์™€ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • AuthorizationPolicy๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํŠน์ • ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž ๋˜๋Š” ์„œ๋น„์Šค๋งŒ ํŠน์ • API์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
728x90