Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.38] 6๋ถ€ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… #3 | mTLS ์ธ์ฆ ์‹คํŒจ ๋ฌธ์ œ ํ•ด๊ฒฐ

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

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio์—์„œ ๋ฐœ์ƒํ•˜๋Š” mTLS(Mutual TLS) ์ธ์ฆ ์‹คํŒจ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
Istio๋Š” ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด mTLS๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ณด์•ˆ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ,
์ž˜๋ชป๋œ ์„ค์ •์œผ๋กœ ์ธํ•ด ์„œ๋น„์Šค ๊ฐ„ ์ธ์ฆ ์‹คํŒจ, ์—ฐ๊ฒฐ ๊ฑฐ๋ถ€, 503 ์˜ค๋ฅ˜ ๋“ฑ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” mTLS ์ธ์ฆ ์‹คํŒจ์˜ ์ฃผ์š” ์›์ธ, ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ• ๋ฐ ํ•ด๊ฒฐ์ฑ…์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. mTLS ์ธ์ฆ ์‹คํŒจ์˜ ์ฃผ์š” ์›์ธ

 

์˜ค๋ฅ˜ ์œ ํ˜• ์„ค๋ช…
503 ์˜ค๋ฅ˜ (Service Unavailable) ์ธ์ฆ ์‹คํŒจ๋กœ ์ธํ•ด Envoy Proxy๊ฐ€ ์š”์ฒญ์„ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฒฝ์šฐ
TLS handshake ์‹คํŒจ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ TLS ํ•ธ๋“œ์…ฐ์ดํฌ๊ฐ€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
Peer ์ธ์ฆ ์‹คํŒจ ์ธ์ฆ์„œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
์ž๋™ mTLS ์„ค์ • ๋ถˆ์ผ์น˜ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„ ๋ณด์•ˆ ์ •์ฑ…์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ ๋ฐœ์ƒ

๐Ÿ’ก Istio์˜ ์ธ์ฆ ์ •์ฑ…์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 2. mTLS ์ธ์ฆ ์‹คํŒจ ๋””๋ฒ„๊น… ๋ฐฉ๋ฒ•

โœ… 2.1 ํ˜„์žฌ mTLS ์„ค์ • ํ™•์ธ (PeerAuthentication ์กฐํšŒ)

Istio์—์„œ ์ ์šฉ๋œ mTLS ์ •์ฑ…์„ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get peerauthentication -n istio-system

 

์ถœ๋ ฅ ์˜ˆ์ œ:

NAME          MODE      AGE
default       STRICT    20m

๐Ÿ’ก STRICT ๋ชจ๋“œ์ผ ๊ฒฝ์šฐ, ๋ชจ๋“  ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์ด mTLS๋ฅผ ํ†ตํ•ด ๋ณดํ˜ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


โœ… 2.2 Envoy Proxy ๋กœ๊ทธ ํ™•์ธ (mTLS ์ธ์ฆ ๋ฌธ์ œ ๋ถ„์„)

mTLS ์ธ์ฆ ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด Envoy Proxy ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜์—ฌ ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

kubectl logs <pod-name> -c istio-proxy -n default | grep "TLS"

 

์ถœ๋ ฅ ์˜ˆ์ œ:

[2024-03-18T12:30:00.123Z] TLS error: 336134278: SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca

๐Ÿ’ก "unknown ca" ์˜ค๋ฅ˜๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ CA ์ธ์ฆ์„œ๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


โœ… 2.3 ๋Œ€์ƒ ์„œ๋น„์Šค์˜ ์ธ์ฆ ์ •์ฑ… ํ™•์ธ (DestinationRule ์กฐํšŒ)

DestinationRule์—์„œ mTLS๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

kubectl get destinationrule my-service -n default -o yaml

 

์ถœ๋ ฅ ์˜ˆ์ œ:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-service
  namespace: default
spec:
  host: my-service.default.svc.cluster.local
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL  # mTLS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ†ต์‹ 

๐Ÿ’ก mode: ISTIO_MUTUAL ์„ค์ •์ด ๋น ์ ธ ์žˆ์œผ๋ฉด mTLS๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… 2.4 ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹  ์ƒํƒœ ํ™•์ธ

mTLS ์ธ์ฆ ์‹คํŒจ ์‹œ ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์ด ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

kubectl exec -it  -n default -- curl -v https://my-service.default.svc.cluster.local:443

์ถœ๋ ฅ ์˜ˆ์ œ:

* SSL certificate problem: unable to get local issuer certificate

๐Ÿ’ก "SSL certificate problem" ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ธ์ฆ์„œ ์„ค์ •์„ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น 3. mTLS ์ธ์ฆ ์‹คํŒจ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์‹ค์ „ ์˜ˆ์ œ

โœ… 3.1 503 ์˜ค๋ฅ˜ (Service Unavailable) ํ•ด๊ฒฐ

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  • DestinationRule ๋ฐ PeerAuthentication ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ํ™•์ธ

์˜ฌ๋ฐ”๋ฅธ DestinationRule ์„ค์ •

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: my-service-dr
  namespace: default
spec:
  host: my-service.default.svc.cluster.local
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL  # mTLS ํ™œ์„ฑํ™”

์˜ฌ๋ฐ”๋ฅธ PeerAuthentication ์„ค์ •

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: STRICT  # mTLS๋ฅผ ๊ฐ•์ œ ์ ์šฉ

๐Ÿ’ก PeerAuthentication์ด STRICT ๋ชจ๋“œ์ผ ๊ฒฝ์šฐ, ๋ชจ๋“  ์„œ๋น„์Šค๊ฐ€ mTLS๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


โœ… 3.2 TLS Handshake ์‹คํŒจ ํ•ด๊ฒฐ

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ๊ฐ€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธ

ํด๋ผ์ด์–ธํŠธ ์ธก DestinationRule ์„ค์ •

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: client-dr
  namespace: default
spec:
  host: my-service.default.svc.cluster.local
  trafficPolicy:
    tls:
      mode: ISTIO_MUTUAL  # ํด๋ผ์ด์–ธํŠธ๋„ mTLS ์‚ฌ์šฉ

๐Ÿ’ก ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ๋ชจ๋‘ ISTIO_MUTUAL์„ ์„ค์ •ํ•ด์•ผ ์ •์ƒ์ ์ธ mTLS ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.


โœ… 3.3 ์ž๋™ mTLS ์„ค์ • ์ถฉ๋Œ ํ•ด๊ฒฐ

๐Ÿ› ๏ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•:

  • Istio์˜ autoMTLS ์„ค์ •์„ ํ™•์ธํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ์ˆ˜๋™ ์„ค์ •์„ ์ œ๊ฑฐ
kubectl get meshconfig -n istio-system -o yaml | grep autoMTLS

 

์ถœ๋ ฅ ์˜ˆ์ œ:

autoMTLS: enabled

์ˆ˜๋™ ์„ค์ •์„ ์ œ๊ฑฐํ•˜๊ณ  ์ž๋™ mTLS ์ ์šฉ

apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: PERMISSIVE  # ์ž๋™ mTLS ํ™œ์„ฑํ™”

๐Ÿ’ก PERMISSIVE ๋ชจ๋“œ๋Š” mTLS์™€ ์ผ๋ฐ˜ HTTP ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‘ ํ—ˆ์šฉํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค.


๐Ÿ“Œ ๊ฒฐ๋ก 

  • Istio์˜ mTLS ์ธ์ฆ ์‹คํŒจ๋Š” PeerAuthentication, DestinationRule ๋ฐ ์ธ์ฆ์„œ ์„ค์ •์„ ์ ๊ฒ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 503 ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด DestinationRule ๋ฐ PeerAuthentication ์„ค์ •์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • TLS Handshake ์‹คํŒจ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์ธ์ฆ์„œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Istio์˜ autoMTLS ์„ค์ •์„ ํ™•์ธํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
728x90