전공영역 공부 기록

SSH프로토콜 원리

악분 2024. 8. 3. 18:15
반응형

1. SSH 프로토콜이란?

SSH(Secure Shell)은 네트워크를 통해 데이터를 안전하게 받기 위한 프로토콜입니다. SSH는 데이터를 암호화하여 전송함으로써 네트워크 상에서의 도청이나 데이터 조작을 방지하고, 원격 서버에 안전하게 접속할 수 있는 방법을 제공합니다. 이를 통해 사용자와 서버 간의 통신을 보호하며, 주로 원격 로그인이나 원격 명령어 실행, 파일 전송 등에 사용됩니다.

 

2. 네트워크가 안전하지 않다는 말은 무슨 뜻일까?

네트워크를 통해 데이터를 주고받을 때 안전하지 않다는 것은 무슨 의미일까요? 누구나 중간에 데이터를 훔쳐봤을 때 비밀번호, 주민등록번호 같은 것을 볼 수 있다는 의미입니다.

 

telnet이 안전하지 않는 연결의 대표적인 예입니다. telnet은 데이터를 암호화하지 않고 전송하기 때문에. 누군가 중간에 데이터를 가로챈다면 중요한 정보가 노출됩니다.

 

아래 예제에서는 telnet을 사용하여 원격 서버에 접속할 때 root 계정의 비밀번호가 노출된 상황을 보여줍니다.

pcap파일: https://github.com/choisungwook/portfolio/blob/master/pcap_files/telnet.pcap

 

테스트 방법은 저의 github을 참고해주세요

 

3. SSH프로토콜로 네트워크를 안전하게

SSH는 telnet과 달리 데이터를 암호화하여 전송합니다. 그래서 누군가가 데이터를 중간에 가로채더라도 암호화된 데이터만 보일 뿐 그 내용은 알 수 없습니다.

 

 

4. SSH 프로토콜 동작 원리와 과정

SSH 프로토콜은 송신자와 수신자가 동일한 키를 사용하여 데이터를 암호화하고 복호화합니다. 동일한 키를 세션키라고 부릅니다.

 

SSH프로토콜로 데이터를 암호화하기 위해 통신과정은 5단계로 진행됩니다.

 

SSH 프로토콜 과정의 핵심은 4번단계인 암호화와 복호화에 사용되는 세션 키를 어떻게 생성하느냐입니다. 세션 키가 유출되면 누구나 암호화된 데이터를 해독할 수 있기 때문에, 이를 안전하게 주고받는 것이 중요합니다. SSH 프로토콜은 세션 키를 생성하기 위해 디피-헬만(Diffie-Hellman) 알고리즘을 사용합니다.

 

클라이언트와 서버는 디피-헬만 알고리즘을 통해 세션 키를 생성하기 위해 특정한 파라미터를 주고받아야 합니다. 이 파라미터는 암호화되지 않은 상태로 전송되지만, 유출되더라도 세션 키를 만들기에는 매우 많은 시간이 필요합니다. 따라서, 파라미터가 유출되어도 안전하다고 간주됩니다.

 

클라이언트와 서버는 세션 키를 생성한 후, 이 키를 사용해 모든 데이터를 암호화하여 전송합니다. 데이터가 가로채여도 세션 키 없이는 내용을 해석할 수 없기 때문에, 이 과정을 터널처럼 안전하게 보호한다고 표현합니다. 이를 SSH 터널링이라고 합니다.

 

 

SSH 터널링을 수학적으로 표현하면 아래 그림과 같습니다.

참고자료: https://asecuritysite.com/encryption/ssh

 

5번째 인증단계는 클라이언트와 서버가 서로 인증하는 방법입니다. 클라이언트는 known_hosts파일로 서버를 인증합니다. 서버는 클라이언트를 인증할 때 비밀번호 방식 또는 공개키 인증방식 등을 사용합니다.

 

5. SSH 프로토콜 패킷 분석

패킷 파일은 저의 github에서 다운로드 받을 수 있습니다.

 

TCP핸드쉐이킹 이후에 SSH버전을 협상합니다. 패킷에서는 “Protocol”로 표시되고 각 호스트가 사용가능한 SSH버전이 보입니다.

 

다음 암호화 알고리즘을 협상합니다. 패킷에서는 Key Exchange Init”으로 표시됩니다.

 

알고리즘 협상후 세션키를 생성합니다. 디피-헬만 알고리즘으로 세션키가 생성되고 클라이언트가 먼저 파라미터 e 서버에게 전송합니다. 파라미터 e 누구나 있습니다. 패킷에서는 Client Key Exchange Init”라고 표시됩니다.

디피헬만 알고리즘에 따라 파라미터 값이 다르고 세션키 생성 과정도 다릅니다. 이 예제에서는  e, f를 교환합니다.

 

서버는 파라미터 e 생성하고 클라이언트에게 전달받은 파라미터 e 사용해서 세션키를 생성합니다. 파라미터 e 클라이언트에게 전송합니다. 파라미터 e 누구나 있습니다. 패킷에서는 Server Key Exchange Reply, New Keys”라고 표시됩니다.

 

클라이언트도 서버에게 전달받은 파라미터 f 사용하여 세션키를 생성합니다. 이제 클라이언트와 세션키 모드 암호화와 복호화를 있는 세션키를 생성했습니다. 따라서 주고받는 데이터는 모두 암호화되어 전송됩니다. 패킷에서는 Client: New Keys”라고 표시됩니다.

 

6. 클라이언트와 서버 인증

인증 단계는 저의 이전 글을 참고해주시면 감사드립니다.

 

참고자료

이하여백

 

반응형