SSH 프로토콜의 보안 개요

SSH(Secure Shell) 프로토콜은 클라이언트와 서버 간의 안전한 통신을 제공하기 위해 여러 보안 레이어를 사용한다. 이 보안 레이어는 주로 세 가지 중요한 기능을 제공한다:

  1. 기밀성(Confidentiality): 네트워크를 통해 전송되는 데이터가 도청되지 않도록 암호화한다.
  2. 무결성(Integrity): 전송된 데이터가 중간에서 변조되지 않도록 보장한다.
  3. 인증(Authentication): 클라이언트와 서버가 상호 신뢰할 수 있는 방법으로 서로를 확인한다.

이러한 보안 목표를 달성하기 위해 SSH 프로토콜은 여러 암호화 알고리즘과 해시 함수, 그리고 키 교환 알고리즘을 사용한다. SSH 프로토콜의 보안 구조는 크게 세 가지 단계로 나눌 수 있다:

키 교환

키 교환은 클라이언트와 서버 간에 안전하게 비밀 키를 공유하기 위한 방법이다. 키 교환 과정은 SSH 보안의 핵심 요소 중 하나로, 세션 암호화에 사용되는 비밀 키를 협상하는 과정에서 암호화 알고리즘을 사용한다.

SSH는 Diffie-Hellman 키 교환 알고리즘을 주로 사용하며, 이를 통해 안전하게 공유 비밀을 계산한다. 이때 클라이언트와 서버는 서로에게 임의의 공개 값을 주고받으며, 이 공개 값으로부터 동일한 비밀 키를 생성한다.

Diffie-Hellman 키 교환 과정

키 교환 알고리즘의 흐름은 다음과 같다:

  1. 클라이언트와 서버는 서로 사전에 합의된 소수 p와 원시근 g을 공유한다.
  2. 클라이언트는 비밀 값 a를 임의로 선택하고, g^a \mod p를 서버에 보낸다.
  3. 서버는 비밀 값 b를 임의로 선택하고, g^b \mod p를 클라이언트에 보낸다.
  4. 클라이언트는 (g^b \mod p)^a \mod p를 계산하여 공유 비밀 K를 생성한다.
  5. 서버는 (g^a \mod p)^b \mod p를 계산하여 동일한 공유 비밀 K를 생성한다.

이 때, 공유된 비밀 K는 다음과 같이 표현된다:

K = (g^b \mod p)^a \mod p = (g^a \mod p)^b \mod p

이를 통해 클라이언트와 서버는 안전하게 동일한 비밀 키를 공유하게 된다.

암호화

키 교환이 완료된 후, SSH 프로토콜은 세션 암호화를 위해 다양한 대칭 키 암호화 알고리즘을 사용한다. 주로 사용되는 암호화 알고리즘은 다음과 같다:

이러한 알고리즘은 클라이언트와 서버 간에 주고받는 모든 데이터를 암호화하여 도청을 방지한다. 대칭 키 암호화에서는 클라이언트와 서버가 같은 비밀 키를 사용하여 데이터를 암호화하고 복호화한다.

AES 알고리즘

AES는 SSH에서 가장 많이 사용되는 암호화 알고리즘이다. AES는 128비트, 192비트, 256비트 길이의 키를 사용하여 데이터를 블록 단위로 암호화한다. AES 알고리즘은 라운드 함수로 구성되며, 각 라운드는 다음 네 가지 주요 단계를 포함한다:

  1. SubBytes: 각 바이트를 고정된 S-box를 사용하여 치환한다.
  2. ShiftRows: 행 단위로 바이트를 좌측으로 이동시킨다.
  3. MixColumns: 열 단위로 데이터를 선형 변환한다.
  4. AddRoundKey: 라운드 키와 현재 상태를 XOR 연산한다.

AES의 암호화 과정은 다음과 같이 표현할 수 있다:

\mathbf{C} = E(\mathbf{K}, \mathbf{P})

여기서, - \mathbf{C}는 암호문, - E는 암호화 함수, - \mathbf{K}는 대칭 키, - \mathbf{P}는 평문이다.

AES는 블록 단위로 데이터를 처리하므로, 평문의 길이가 블록 크기(128비트)의 배수가 아니면 패딩(padding) 기법을 사용하여 평문의 길이를 맞춘다.

메시지 인증 코드 (MAC)

SSH 프로토콜에서 메시지 인증 코드(MAC)는 데이터의 무결성을 확인하는 데 사용된다. MAC은 전송된 데이터가 도중에 변조되지 않았음을 보장한다. 클라이언트와 서버는 데이터를 송수신할 때 각각 데이터를 암호화한 후, MAC을 계산하여 이 데이터를 함께 전송한다. 수신 측에서는 같은 방식으로 MAC을 계산하여 두 값이 일치하는지 확인함으로써 데이터의 무결성을 확인한다.

MAC 계산을 위한 일반적인 과정은 다음과 같다:

\mathbf{MAC} = H(\mathbf{K}_{mac}, \mathbf{M})

여기서, - \mathbf{MAC}은 계산된 메시지 인증 코드, - H는 해시 함수, - \mathbf{K}_{mac}는 MAC용 비밀 키, - \mathbf{M}은 송수신되는 메시지이다.

이때, SSH에서 자주 사용하는 해시 함수는 HMAC (Hashed Message Authentication Code)이다. HMAC는 해시 함수(예: SHA-256, SHA-512)를 사용하여 메시지 인증 코드를 생성하며, 이를 통해 메시지의 변조 여부를 확인한다.

HMAC의 작동 원리

HMAC는 다음과 같은 방식으로 작동한다:

  1. 메시지 \mathbf{M}과 MAC용 비밀 키 \mathbf{K}_{mac}가 입력된다.
  2. 내부 해시 계산을 위한 패딩된 키와 메시지가 결합된다.
  3. 해시 함수 H를 사용하여 MAC을 계산한다.

HMAC는 기본적으로 해시 함수를 두 번 사용하는 구조로 설계되었다:

HMAC(\mathbf{K}_{mac}, \mathbf{M}) = H((\mathbf{K}_{mac} \oplus \mathbf{opad}) \parallel H((\mathbf{K}_{mac} \oplus \mathbf{ipad}) \parallel \mathbf{M}))

여기서, - \oplus는 XOR 연산, - \mathbf{opad}는 외부 패딩(0x5c가 반복된 값), - \mathbf{ipad}는 내부 패딩(0x36가 반복된 값), - \parallel는 문자열 연결을 의미한다.

이 과정을 통해 수신 측은 전송된 메시지와 함께 전달된 MAC 값을 검증하여 데이터의 무결성을 확인한다.

SSH 암호화 알고리즘의 상호작용

SSH 프로토콜에서 보안 계층들은 키 교환, 암호화, MAC이 조화를 이루어 작동한다. 전체 보안 통신 과정은 다음과 같은 단계로 이루어진다:

  1. 키 교환: 클라이언트와 서버는 Diffie-Hellman과 같은 알고리즘을 사용하여 공유된 비밀 키를 생성한다.
  2. 암호화: 공유된 비밀 키를 사용하여 대칭 키 암호화 알고리즘(AES, 3DES 등)을 통해 데이터를 암호화한다.
  3. 무결성 검증: MAC을 사용하여 전송된 데이터의 무결성을 확인한다.

각 단계는 독립적으로 작동하는 것이 아니라, 서로 밀접하게 연계되어 클라이언트와 서버 간의 안전한 통신을 보장한다.