๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ 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 ์ค์ ์ ํ์ธํ์ฌ ๋ถํ์ํ ์ถฉ๋์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.