기본적으로 Linkerd는 "linkerd.io/inject: enabled"에 의해 사이드카 proxy가 주입되면 주입된 pod 간의 모든 TCP 트래픽은 자동으로 mTLS 통신을 하게 된다.
mTLS란?
- TLS는 클라이언트와 서버 간의 통신을 한 방향으로 인증하여 통신을 보호하지만
mTLS는 클라이언트와 서버 간의 통신을 양 방향으로 상호 인증하여 통신을 보호한다.
즉, mTLS는 클라이언트와 서버 간의 통신을 양방향으로 암호화하여 더욱 안전한 통신을 제공한다.
mTLS는 통신하는 각 컴포넌트마다 인증서와 비밀 키가 필요하며, Linkerd는 자동으로 인증서 및 비밀 키를 관리하고 이를 기반으로 서로 간의 인증과 암호화를 수행합니다. 이를 통해, 컨테이너 간의 안전한 통신을 보장하고 보안 상의 문제를 예방할 수 있다.
그럼 실제로 mTLS 통신이 자동으로 이루어지는지 확인하기 위해 mTLS 검증 테스트를 해보려 한다.
mTLS 검증은 두 가지 방법으로 진행해 볼 것이다.
- Linkerd 디버그 사이드카를 활성화하여 패킷 캡처
- Linkerd-proxy 디버그 로그 레벨을 이용한 로그 확인
검증 테스트는 앞서 진행한 [ Linkerd 사이드카 주입 실습 ]에서 생성한 static-client와 static-server pod 통신 간 패킷 캡처를 통해 검증해 볼 것이다.
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
아래 그림은 tcpdump를 이용해 static-server의 linkerd-proxy를 캡처하여 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
위 그림과 같이 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 |
댓글