본문 바로가기
Service Mesh/Linkerd

Linkerd mTLS 통신 검증

by wlsdn3004 2023. 4. 5.
728x90
반응형

 

기본적으로 Linkerd는 "linkerd.io/inject: enabled"에 의해 사이드카 proxy가 주입되면 주입된 pod 간의 모든 TCP 트래픽은 자동으로 mTLS 통신을 하게 된다.

mTLS란?
- TLS는 클라이언트와 서버 간의 통신을 한 방향으로 인증하여 통신을 보호하지만
  mTLS는 클라이언트와 서버 간의 통신을 양 방향으로 상호 인증하여 통신을 보호한다.

TLS, mTLS 비교

 

즉, mTLS는 클라이언트와 서버 간의 통신을 양방향으로 암호화하여 더욱 안전한 통신을 제공한다.

mTLS는 통신하는 각 컴포넌트마다 인증서와 비밀 키가 필요하며, Linkerd는 자동으로 인증서 및 비밀 키를 관리하고 이를 기반으로 서로 간의 인증과 암호화를 수행합니다. 이를 통해, 컨테이너 간의 안전한 통신을 보장하고 보안 상의 문제를 예방할 수 있다.

 

 

그럼 실제로 mTLS 통신이 자동으로 이루어지는지 확인하기 위해 mTLS 검증 테스트를 해보려 한다.

 

mTLS 검증은 두 가지 방법으로 진행해 볼 것이다.

  1. Linkerd 디버그 사이드카를 활성화하여 패킷 캡처
  2. Linkerd-proxy 디버그 로그 레벨을 이용한 로그 확인

 

검증 테스트는 앞서 진행한 [ Linkerd 사이드카 주입 실습 ]에서 생성한 static-client와 static-server pod 통신 간 패킷 캡처를 통해 검증해 볼 것이다.

 

Linkerd 사이드카 주입 실습

Linkerd는 linkerd-proxy 컨테이너가 사이드카 패턴으로 Pod에 추가된다. 해당 동작은 Linkerd Control-Plane의 proxy-injector에 의해 이루어진다. 이번 글에서는 Pod 두 개를 Linkerd 사이드카 주입하여 pod끼리 통

wlsdn3004.tistory.com

 

1. Linkerd 디버그 사이드카를 활성화하여 패킷 캡처


Linkerd 디버그 사이드카를 활성화하면 pod가 생성될 때 linkerd-debug라는 사이드카 컨테이너가 같이 생성된다.

 

linkerd-debug 사이드카 컨테이너에는 패킷을 캡처할 수 있는 tshark라는 도구가 포함되어 있어 이를 활용하면 간편하게 패킷을 확인할 수 있다.

 

디버그 사이드카 활성화하는 방법은 아래와 같다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: static-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: static-server
  template:
    metadata:
      name: static-server
      labels:
        app: static-server
      annotations:
        linkerd.io/inject: enabled
        config.linkerd.io/enable-debug-sidecar: "true"

 

static-server의 Linkerd 디버그 사이드카를 활성화해 보자.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: static-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: static-server
  template:
    metadata:
      name: static-server
      labels:
        app: static-server
      annotations:
        linkerd.io/inject: enabled
        config.linkerd.io/enable-debug-sidecar: "true"

    spec:
      containers:
        - name: static-server
          image: wlsdn3004/http-echo:latest
          args:
            - -text="hello world server"
            - -listen=:8080
          ports:
            - containerPort: 8080
              name: http

 

linkerd-debug라는 사이드카 컨테이너가 생성된 것을 확인할 수 있다.

$ kubectl get po static-server-5dd4f7f54c-rhk5n
NAME                                                      READY    STATUS    RESTARTS   AGE
static-server-5dd4f7f54c-rhk5n   3/3           Running   0                     70m

$ kubectl get po static-server-5dd4f7f54c-rhk5n -o jsonpath='{.spec.containers[*].name}'
linkerd-proxy static-server linkerd-debug

 

linkerd-debug 컨테이너에 진입하여 tshark 도구를 이용하여 패킷을 캡처해 보자.

$ kubectl exec -it static-server-5dd4f7f54c-rhk5n -c linkerd-debug -- /bin/bash
$ tshark -i any -d tcp.port==8080,ssl | grep -v 127.0.0.1

 

tshark로 패킷 캡처를 실행시키고 static-client에서 static-server로 호출해 보자.

$ kubectl exec -it static-client-6644549655-d5pvq -c static-client -- /bin/sh
$ curl static-server:8080
"hello static-server"

 

아래 그림은 static-client에서 static-server로 호출한 뒤 static-server linkerd-debug 컨테이너에서 캡처한 내용이다.

  • static-client ip: 192.168.8.204
  • static-server ip: 192.168.6.219

tshark 캡처

아래 그림은 tcpdump를 이용해 static-server의 linkerd-proxy를 캡처하여 Wireshark로 확인한 그림이다.

Wireshark 캡처

 

위 그림과 같이 TLS handshake 이후 패킷을 주고받는 것을 확인할 수 있다.

 

 

2. Linkerd-proxy 디버그 로그 레벨을 이용한 로그 확인


Linkerd에서 proxy-log-level을 디버로 설정하면 사이드카 컨테이너인 Linkerd-proxy에서 자세한 로그를 확인할 수 있다.

 

proxy-log-level 디버그 설정은 아래와 같다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: static-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: static-server
  template:
    metadata:
      name: static-server
      labels:
        app: static-server
      annotations:
        linkerd.io/inject: enabled
        config.linkerd.io/proxy-log-level: debug

 

static-server를 Linkerd proxy log level을 디버그로 변경하고 확인해 보자.

$ kubectl logs deploy/static-server -c linkerd-proxy -f

static-server linkerd-proxy debug log

위 그림과 같이 TLS Connection을 맺는 로그를 확인할 수 있다.

반응형

'Service Mesh > Linkerd' 카테고리의 다른 글

Linkerd 트래픽 Retry, Timeout  (0) 2023.04.19
Linkerd 권한 부여 정책  (0) 2023.04.05
Linkerd 사이드카 주입  (0) 2023.04.05
Linkerd 대시보드 ID, Password 변경  (0) 2023.04.05
Linkerd 대시보드 구성  (0) 2023.04.04

댓글