brunch

You can make anything
by writing

C.S.Lewis

by 이권수 Jun 18. 2024

[Istio] Auto Mutual TLS

자동으로 설정되는 istio의 TLS!

이메일로 블로그 포스트 받아보기: https://techchallengearena.substack.com


보통 istio를 사용하면, envoy를 istio proxy로 사용하고, 이를 사이드카(sidecar)로 띄운다. 이때 istio proxy는 실제 애플리케이션에서 발생하는 in/out 트래픽을 모두 제어할 수 있다. 즉, 모든 통신은 istio-proxy를 기본적으로 거쳐간다는 의미이다.


실제로 파드에 요청을 보내면, 다음과 같이 istio proxy 로그가 찍히는 것을 볼 수 있다. 참고로 로컬 환경에 istio에서 제공하는 샘플 애플리케이션을 올려서 테스트한 결과이다.


curl http://productpage.test.svc.cluster.local:9080


실제로 응답이 정상적으로 수행되었는지를 보기 위해서 패킷을 잡아보았다. kubectl sniff 명령어로 패킷을 잡아보면 다음과 같이 응답이 나오는 것을 볼 수 있다. 

위 사진을 보면, 응답은 정상적으로 왔는데, 이상하게도 TLS 연결을 맺고 있는 것을 볼 수 있다. 테스트를 위해서 파드만 생성하고, 아무런 설정을 하지 않았음에도 불구하고 TLS를 사용하고 있다. 


Client Hello에 나온 SNI 값을 확인해 보면, istio proxy 로그에서 보이는 outbound_. 9080_._. productpage.test.svc.cluster.local 도메인을 사용하는 것을 볼 수 있다.


이게 과연 어떻게 된 것일까?


파드를 조사해 보면, 힌트를 약간 얻을 수 있다. 파드 정보를 조회해 보면 다음과 같이 security.istio.io/tlsMode=istio라고 라벨이 붙는다. 


해당 라벨은 istio init 단계에서 istio가 주입해 주는 라벨이다. istio-sidecar-injector 컨피그 맵을 살펴보면, 같은 이름의 라벨과 기본 값(istio)을 확인할 수 있다.


istio는 기본적으로 TLS 통신을 권장한다. 다만, 강제하지는 않기 때문에 TLS가 아닌 통신도 함께 지원한다. 만약 TLS 통신을 해야 한다면 TLS로 요청을 보내고, 그렇지 않으면 그냥 기존 프로토콜로 통신한다. tlsMode값이 istio 이면, istio proxy 간 통신할 때는 TLS로 통신하겠다는 의미이다.


istioctl을 통해서 리스너 정보를 보면 더욱 정확하게 알 수 있다. 리스너 정보를 확인해 보면 istio가 inbound 9080 포트로 들어오는 경우 TLS를 사용하도록 설정해 놓을 것을 확인할 수 있다.



이를 회피하기 위해서는 간단하게 PeerAuthentication 리소스를 생성하면 된다. 아래와 같이, mtls: DISABLE 설정을 한 후, 해당 리소스를 생성한다. 그러면 istiod가 해당 리소스가 생성된 것을 인지하고, istio proxy의 리스너 정보를 그에 맞게 수정해 준다.


적용하고 나서 다시 한번 리스너 정보를 조회해 보면, 다음과 같이 TLS 부분은 빠져있는 것을 볼 수 있다.


앞선 예제와 동일하게 패킷을 잡아보자. 


동일한 요청을 보냈지만, 더 이상 TLS 통신을 하지 않고 일반적인 TCP 통신을 한다.



또 다른 방법으로는 애플리케이션 파드에 security.istio.io/tlsMode=disable 라벨을 추가하는 방법이 있다. 애플리케이션에 해당 라벨이 들어있으면, istio init은 해당 값을 그대로 가져와서 사용한다. 



요컨대, istio는 아무런 설정을 하지 않으면 istio proxy 간 통신에서 TLS 통신을 수행한다. TLS 통신에 대한 설정은 istio init 단계에서 라벨로 주입되고, 해당 라벨을 통해서 istiod는 istio 간 통신에 대해 TLS 통신을 하도록 리스너 규칙을 설정한다. 만약 이를 회피하고 싶거나 다른 설정을 하고 싶다면, PeerAuthentication이나 DestinationRule을 사용할 수 있다.



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari