Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.22] 3๋ถ€ ๋ณด์•ˆ ๋ฐ ์ธ์ฆ #6 | Ingress Gateway์—์„œ TLS ์ ์šฉ ๋ฐ ์™ธ๋ถ€ ์ธ์ฆ ์—ฐ๋™

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

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio์˜ Ingress Gateway์—์„œ TLS(SSL) ์ธ์ฆ์„œ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ์™ธ๋ถ€ ์ธ์ฆ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
TLS๋Š” ์›น ํŠธ๋ž˜ํ”ฝ์„ ์•”ํ˜ธํ™”ํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋ฐ€์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ์ด๋ฉฐ,
Istio์˜ Ingress Gateway๋ฅผ ํ†ตํ•ด TLS๋ฅผ ์ ์šฉํ•˜๋ฉด ๋ณด์•ˆ์ด ๊ฐ•ํ™”๋œ HTTPS ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, OAuth 2.0, OIDC, LDAP ๋“ฑ ์™ธ๋ถ€ ์ธ์ฆ ์‹œ์Šคํ…œ๊ณผ Istio๋ฅผ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. Ingress Gateway์—์„œ TLS ์ ์šฉ

โœ… 1.1 Istio Ingress Gateway์—์„œ TLS๋ฅผ ์ ์šฉํ•˜๋Š” ์ด์œ 

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋น„์Šค ๊ฐ„์˜ ํŠธ๋ž˜ํ”ฝ์„ ์•”ํ˜ธํ™”ํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™”
  • Istio ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ๋„ ๋ณดํ˜ธ ๊ฐ€๋Šฅ(mTLS ์—ฐ๋™ ๊ฐ€๋Šฅ)
  • ๊ณต์ธ ์ธ์ฆ์„œ๋ฅผ ์ ์šฉํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” HTTPS ์„œ๋น„์Šค ์ œ๊ณต

โœ… 1.2 TLS ์ธ์ฆ์„œ ์ƒ์„ฑ ๋ฐ Kubernetes Secret ๋“ฑ๋ก

Istio์˜ Ingress Gateway์—์„œ TLS๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋จผ์ € TLS ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  Kubernetes Secret์œผ๋กœ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ‘  OpenSSL์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ์„œ ์ƒ์„ฑ

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=example.com"

โ‘ก TLS ์ธ์ฆ์„œ๋ฅผ Kubernetes Secret์œผ๋กœ ๋“ฑ๋ก

kubectl create -n istio-system secret tls my-tls-secret --key=tls.key --cert=tls.crt

๐Ÿ’ก my-tls-secret์ด๋ผ๋Š” Secret์„ ์ƒ์„ฑํ•˜๋ฉฐ, Ingress Gateway์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 1.3 Istio Ingress Gateway์—์„œ TLS ์ ์šฉ

์•„๋ž˜ ์˜ˆ์ œ๋Š” Ingress Gateway์—์„œ TLS๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: my-secure-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 443
        name: https
        protocol: HTTPS
      tls:
        mode: SIMPLE
        credentialName: my-tls-secret  # Kubernetes Secret์—์„œ TLS ์ธ์ฆ์„œ ๋กœ๋“œ
      hosts:
        - "example.com"

์„ค๋ช…:

  • tls.mode: SIMPLE → HTTPS ํ™œ์„ฑํ™”
  • credentialName: my-tls-secret → Kubernetes Secret์—์„œ TLS ์ธ์ฆ์„œ ๋กœ๋“œ
  • hosts: "example.com" → ํ•ด๋‹น ๋„๋ฉ”์ธ์—์„œ๋งŒ HTTPS ์ ์šฉ

๐Ÿ’ก Ingress Gateway์—์„œ ์ด ์„ค์ •์„ ์ ์šฉํ•˜๋ฉด, example.com ๋„๋ฉ”์ธ์— HTTPS๊ฐ€ ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 2. Ingress Gateway์™€ ์™ธ๋ถ€ ์ธ์ฆ ์‹œ์Šคํ…œ ์—ฐ๋™

โœ… 2.1 ์™ธ๋ถ€ OAuth 2.0 / OIDC ์ธ์ฆ ์„œ๋ฒ„ ์—ฐ๋™

Istio์˜ Ingress Gateway๋Š” OAuth 2.0 ๋ฐ OIDC ์ธ์ฆ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด JWT ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โ‘  JWT ๊ธฐ๋ฐ˜ RequestAuthentication ์„ค์ •

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
  name: jwt-auth
  namespace: istio-system
spec:
  selector:
    matchLabels:
      istio: ingressgateway
  jwtRules:
    - issuer: "https://auth.example.com"
      jwksUri: "https://auth.example.com/.well-known/jwks.json"

์„ค๋ช…:

๐Ÿ’ก ์ด ์„ค์ •์„ ์ ์šฉํ•˜๋ฉด, Istio Ingress Gateway์—์„œ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์ด JWT ์ธ์ฆ์„ ๊ฑฐ์น˜๋„๋ก ์„ค์ •๋ฉ๋‹ˆ๋‹ค.


โœ… 2.2 ์™ธ๋ถ€ ์ธ์ฆ ์‹œ์Šคํ…œ๊ณผ AuthorizationPolicy ์ ์šฉ

OAuth 2.0 ๋˜๋Š” OIDC ์ธ์ฆ์ด ์™„๋ฃŒ๋œ ์‚ฌ์šฉ์ž๋งŒ ํŠน์ • API์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก AuthorizationPolicy๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์„ค๋ช…:

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

๐Ÿ’ก ์ด ์„ค์ •์„ ์ ์šฉํ•˜๋ฉด, ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋งŒ /secure-api ์—”๋“œํฌ์ธํŠธ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 3. Ingress Gateway์—์„œ TLS ๋ฐ ์ธ์ฆ ์ ์šฉ ํ›„ ํ™•์ธ ๋ฐฉ๋ฒ•

โœ… 3.1 HTTPS ํ™œ์„ฑํ™” ํ™•์ธ

Ingress Gateway์—์„œ HTTPS๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get gateway -n istio-system

์ถœ๋ ฅ ์˜ˆ์ œ:

NAME                AGE
my-secure-gateway   5m

โœ… 3.2 ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋งŒ API ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€ ํ…Œ์ŠคํŠธ

OAuth 2.0 ์ธ์ฆ ํ›„, Access Token์„ ํฌํ•จํ•˜์—ฌ API ์š”์ฒญ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

๐Ÿ’ก ์œ ํšจํ•œ Access Token์ด ์—†์œผ๋ฉด 401 Unauthorized ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ ๊ฒฐ๋ก 

  • Istio Ingress Gateway์—์„œ TLS๋ฅผ ์ ์šฉํ•˜๋ฉด, ์™ธ๋ถ€ ํŠธ๋ž˜ํ”ฝ์„ HTTPS๋กœ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Ingress Gateway๋Š” Kubernetes Secret์„ ํ™œ์šฉํ•˜์—ฌ TLS ์ธ์ฆ์„œ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • OAuth 2.0 ๋ฐ OIDC ์—ฐ๋™์„ ํ†ตํ•ด ์™ธ๋ถ€ ์ธ์ฆ ์‹œ์Šคํ…œ๊ณผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • AuthorizationPolicy๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋งŒ ํŠน์ • API์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
728x90