Cloud/k8s-CKA

[CKA] 36. Security - TLS 통신과정

jinkwon.kim 2023. 9. 21. 23:46
728x90
반응형

개요

Transport Layer Security로써 L4 Layer위에 올라가는 보안을 위한 통신 Protocol입니다. 

원리

Client와 Server간에 "비대칭키를 사용하여 대칭키 암호화 키를 교환한" 후 이후 통신부터는"대칭키를 사용하여 암호화 통신"을 하는 방식으로 Client와 Server 간의 데이터 통신을 보호합니다.

여기서 암호화 통신을 위해서 비대칭키과 대칭키를 사용하는 이유는 아래와 같습니다

 

비대칭키만 사용하게 되면 "대칭키 암호화 방식에 비해 비대칭 키 암호화는 계산이 복잡하고 느리기 때문에 대량의 데이터를 암호화하거나 복호화하는 데 사용하기에는 부적합합니다." 그래서 대칭키교환을 위해서만 비대칭키를 사용합니다.

검증 환경 구성

목차

TLS 통신을 위한 인증서 생성

인증서를 ngnix에 적용 

TLS 통신을 위한 인증서 생성

개인키 생성

openssl genpkey -algorithm RSA -out privatekey.pem

CSR 생성

openssl req -new -key privatekey.pem -out request.csr

인증서 생성

CA가 없으므로 self-sign을 진행합니다. 

openssl x509 -req -days 365 -in request.csr -signkey privatekey.pem -out selfsigned.crt

 

만약 CA에서 발급 받은 인증서 및 키가 있다면 CA 정보를 사용해서 인증서에 sign하면됩니다. 

openssl x509 -req -days 365 -in request.csr -CA ca.crt -CAeky ca.key -out ca-signed.crt

인증서를 ngnix에 적용 

nginx에서 인증서 적용 

테스트를 위해서 위과정에서 생성한 

인증서 파일 : selfsigned.crt

개인 키 : privatekey.pem 

/etc/nginx/ 에 tls 디렉터리를 하나 만들고

그리고 아래 정보를 /etc/nginx/sites-available/default에 추가하였습니다. 

        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;
        ssl_certificate /etc/nginx/tls/selfsigned.crt;
        ssl_certificate_key /etc/nginx/tls/privatekey.pem;

설정 적용 결과 

nginx 재 시작

systemctl restart nginx 

nginx 접속

https://192.168.0.9 로 접속 해보겠습니다.

참고. 192.168.0.9은 nginx를 뛰운 vm의 IP입니다.

 

아래와 같이 Not secure라고 뜨면 인증서가 잘 적용이 된 겁니다. 실제 CA에서 검증한 게 아님으로 Not secure가 맞습니다

여기서 왼쪽 하단에 "Advanced"를 클릭 후 "Proceed to 127.0.0.1(unsafe)를 눌러서 들어가면 됩니다.

최초 접속

 

Advanced를 통한 완전한 접속

TLS 통신 큰 그림

TLS 패킷을 통한 통신 분석

TLS sample packet

아래 패킷은 세션키를 사용하여 TLSv1.3의 통신 내용을 복호 한 것입니다. 복호화 방법

https://wiki.wireshark.org/TLS#using-the-pre-master-secret

위 packet의 TLS(Transport Layer Security) 통신 과정은 대략적으로 다음과 같이 요약할 수 있습니다. 

1구간 (인증)

44번까지의 과정이 비 대칭키(인증서)를 가지고 대칭키(session key)를 생성합니다. 

1. ClientHello 메시지

ClientHello 메시지

클라이언트 → 서버

클라이언트는 서버에 ClientHello 메시지를 전송합니다.

이 메시지에는 클라이언트가 지원하는 암호 스위트, 지원하는 TLS 버전, 그리고 랜덤 데이터가 포함되어 있습니다.

2. ServerHello 메시지

ServerHello

서버 → 클라이언트

서버는 클라이언트에게 ServerHello 메시지를 응답합니다.

이 메시지에는 서버가 선택한 암호 suit, 선택한 TLS 버전, 그리고 랜덤 데이터가 포함되어 있습니다.

서버의 인증서 전송

서버 → 클라이언트

서버는 자신의 공개키를 포함한 인증서를 클라이언트에게 전송합니다.

클라이언트는 이 인증서를 사용하여 서버의 신원을 검증합니다.

키 교환

클라이언트/서버

클라이언트와 서버는 Pre-Master Secret을 교환합니다.

이 정보는 서버의 공개키를 사용하여 암호화됩니다 (포워드 시크릿성을 위해 일부 경우에는 추가적인 키 교환 메커니즘을 사용합니다).

3. 세션 키 생성

클라이언트/서버

클라이언트와 서버는 교환된 Pre-Master Secret과 랜덤 데이터를 사용하여 세션 키를 도출합니다.

2구간 (통신)

45번부터 대칭키(session key)를 가지고 통신합니다..

1. 암호화된 통신 시작

클라이언트/서버

클라이언트와 서버는 세션 키를 사용하여 모든 추가적인 통신을 암호화합니다.

2. 암호화된 데이터 전송

클라이언트 ↔ 서버

클라이언트와 서버는 이제 상호 간에 암호화된 데이터를 안전하게 전송할 수 있습니다.

 

이러한 스텝은 대략적인 TLS 통신 과정을 나타냅니다. 실제 과정은 선택된 TLS 버전과 암호 스위트에 따라 약간 다를 수 있습니다.

정리

TLS통신에서는 암호화 통신할 때 필요한 session key를 서버의 인증서를 사용하여 client/server 간에 교환한 후에 session key만을 이용하여 암호화 통신을 진행합니다.

Next Post

[CKA] 37. k8s에서의 상호 인증 원리

728x90
반응형