개요

SSH(Secure Shell)는 네트워크를 통해 암호화된 보안 통신을 제공하는 프로토콜로, 특히 원격 시스템과 안전하게 연결하는 데 사용된다. SSH는 안전하지 않은 네트워크 환경에서도 보안을 유지하기 위해 설계되었으며, 다양한 보안 기능을 통해 데이터의 기밀성, 무결성, 인증을 보장한다. SSH는 기본적으로 22번 포트를 사용하며, 클라이언트-서버 모델로 동작한다.

SSH 프로토콜의 주요 구성 요소

SSH는 여러 구성 요소로 나뉜다. 각각의 구성 요소는 SSH 통신에서 특정 역할을 수행하며, 이들은 함께 안전한 연결을 만든다. 주요 구성 요소는 다음과 같다:

  1. 전송 계층 (Transport Layer)

    • 전송 계층은 데이터의 기밀성과 무결성을 보장하며, 주로 암호화 및 무결성 검사에 사용된다. 이 계층에서 사용되는 암호화 알고리즘에는 대칭 키 암호화, 비대칭 키 암호화, 해시 함수 등이 있다.
  2. 사용자 인증 계층 (User Authentication Layer)

    • 사용자 인증 계층은 클라이언트가 서버에 접속할 때 올바른 사용자인지를 확인하는 역할을 한다. 이 계층에서는 비밀번호, 공개 키, 기타 인증 방법을 사용하여 사용자의 신원을 확인한다.
  3. 연결 계층 (Connection Layer)

    • 연결 계층은 SSH 프로토콜의 마지막 계층으로, 클라이언트와 서버 간의 실제 통신을 처리한다. 연결 계층에서는 여러 가상 세션을 관리할 수 있으며, 포트 포워딩, X11 포워딩 등 다양한 기능을 제공한다.

SSH 프로토콜 흐름

SSH 프로토콜은 클라이언트와 서버 간의 상호 작용을 통해 안전한 연결을 설정한다. 전송 과정에서 사용되는 주요 단계는 다음과 같다:

  1. 세션 초기화 (Session Initialization)

    • 클라이언트는 서버에 연결 요청을 보내고, 서버는 이를 받아들이면 SSH 프로토콜을 사용한 세션을 초기화한다. 이 과정에서 서버와 클라이언트는 사용하는 프로토콜 버전과 암호화 알고리즘을 협상한다.
  2. 암호화 협상 (Encryption Negotiation)

    • 서버와 클라이언트는 사용할 암호화 방식과 키 교환 방법을 협상한다. 키 교환 알고리즘으로는 Diffie-Hellman 방법이 주로 사용된다. 협상된 키는 대칭 키 암호화에 사용된다.

    Diffie-Hellman 키 교환 방식은 다음과 같이 수학적으로 정의된다:

g^a \mod p \quad \text{(클라이언트 측)}


$$ g^b \mod p \quad \text{(서버 측)} $$

여기서 $g$는 공개된 기본수(base), $p$는 소수(prime), $a$, $b$는 각각 클라이언트와 서버의 비밀 값이다. 클라이언트와 서버는 각각 $g^a$와 $g^b$ 값을 교환한 후, 최종적으로 공유된 비밀 키를 다음과 같이 계산한다:


$$ \mathbf{K} = (g^b)^a \mod p = (g^a)^b \mod p $$

  1. 서버 인증 (Server Authentication)
    • 서버는 클라이언트에게 자신이 올바른 서버임을 증명해야 한다. 이 과정에서는 서버의 공개 키를 클라이언트가 확인하고, 클라이언트는 서버의 신뢰성을 판단한다. 공개 키는 보통 다음과 같이 표현된다:
\mathbf{K_{\text{pub}}} = (g^a \mod p, g^b \mod p)
클라이언트는 서버의 공개 키를 이용해 서명을 검증하며, 서명이 올바르지 않으면 연결을 종료한다.

사용자 인증

암호화된 연결이 설정되고 서버의 신원이 검증된 후, 클라이언트는 자신이 올바른 사용자임을 서버에 증명해야 한다. SSH는 여러 가지 인증 방법을 지원하며, 가장 일반적인 방법은 비밀번호 인증과 공개 키 인증이다.

  1. 비밀번호 인증 (Password Authentication)
  2. 가장 간단한 인증 방법으로, 클라이언트가 서버에 비밀번호를 전송하여 인증받는 방식이다. 비밀번호는 암호화된 채널을 통해 전송되므로 안전한다. 그러나 비밀번호는 추측 공격에 취약할 수 있으며, 서버에 비밀번호가 저장되어 있어 보안에 취약할 수 있다.

  3. 공개 키 인증 (Public Key Authentication)

  4. 공개 키 인증은 SSH에서 선호되는 방법이다. 클라이언트는 공개 키와 개인 키 쌍을 생성하고, 서버에 공개 키를 등록한다. 인증 과정은 다음과 같이 진행된다:

  5. 클라이언트는 서버에 인증 요청을 보낸다.

  6. 서버는 클라이언트의 공개 키를 확인하고, 임의의 데이터를 클라이언트에게 보낸다.
  7. 클라이언트는 자신의 개인 키로 이 데이터를 암호화한 후, 서버에 전송한다.
  8. 서버는 클라이언트가 전송한 데이터를 클라이언트의 공개 키로 복호화하여 신뢰성을 확인한다.

이 과정을 수식으로 표현하면, 클라이언트가 서버로부터 받은 데이터를 D라 할 때, 클라이언트는 다음과 같이 서명한다:

\text{Sign}(D, \mathbf{K_{\text{priv}}})

여기서 \mathbf{K_{\text{priv}}}는 클라이언트의 개인 키이다. 서버는 클라이언트의 공개 키 \mathbf{K_{\text{pub}}}를 사용하여 서명을 검증한다.

  1. 기타 인증 방법
  2. SSH는 비밀번호 및 공개 키 인증 외에도 여러 다른 인증 방법을 지원한다. 대표적인 예로는 GSSAPI, Kerberos, 인증서 기반 인증 등이 있다. 이러한 방법들은 주로 대규모 네트워크 환경에서 사용되며, 추가적인 보안 계층을 제공한다.

세션 생성 및 데이터 교환

인증이 성공하면 SSH 연결이 설정되고, 클라이언트와 서버는 안전한 채널을 통해 데이터를 주고받을 수 있게 된다. 이 과정은 세션 계층에서 처리되며, 이때 여러 개의 가상 채널을 만들 수 있다. SSH는 터미널 접속뿐만 아니라 파일 전송(SCP, SFTP), 포트 포워딩, 원격 명령 실행 등을 지원한다.

  1. 세션 생성
  2. SSH는 클라이언트가 연결을 유지하는 동안 여러 개의 가상 세션을 지원한다. 각 세션은 독립적으로 관리되며, 클라이언트는 한 번의 SSH 연결을 통해 여러 작업을 동시에 수행할 수 있다.

  3. 데이터 암호화

  4. 데이터는 클라이언트와 서버 사이에서 전송될 때, 선택된 대칭 키 암호화 알고리즘을 사용하여 암호화된다. 일반적으로 사용되는 알고리즘은 AES(Advanced Encryption Standard)이다. 데이터를 암호화하는 대칭 키는 이전에 설명한 Diffie-Hellman 키 교환을 통해 공유된 비밀 값 \mathbf{K}로부터 생성된다.

예를 들어, AES 알고리즘을 사용한 암호화는 다음과 같이 표현된다:

\mathbf{C} = \text{AES}(\mathbf{P}, \mathbf{K})

여기서 \mathbf{C}는 암호화된 텍스트, \mathbf{P}는 평문, \mathbf{K}는 대칭 키이다.

  1. 데이터 무결성 검사
  2. 전송된 데이터의 무결성을 보장하기 위해 SSH는 메시지 인증 코드를 사용한다. 일반적으로 SHA-2(Secure Hash Algorithm 2)와 같은 해시 함수가 사용되며, 각 메시지는 전송 전 해시 값으로 변환되어 전송된다. 서버는 이 해시 값을 검증하여 데이터가 전송 중에 변경되지 않았음을 확인한다.

데이터 무결성 검사는 다음과 같은 수식으로 표현된다:

\mathbf{H} = \text{SHA-2}(\mathbf{M})

여기서 \mathbf{M}은 메시지, \mathbf{H}는 해시 값이다. 서버는 수신된 데이터 \mathbf{M'}에 대해서도 같은 해시 값을 계산하여 \mathbf{H}와 일치하는지 확인한다.