# SSH 프로토콜 개요

#### 개요

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
$$

3. **서버 인증** (Server Authentication)
   * 서버는 클라이언트에게 자신이 올바른 서버임을 증명해야 한다. 이 과정에서는 서버의 공개 키를 클라이언트가 확인하고, 클라이언트는 서버의 신뢰성을 판단한다. 공개 키는 보통 다음과 같이 표현된다:

$$
\mathbf{K\_{\text{pub}}} = (g^a \mod p, g^b \mod p)
$$

```
클라이언트는 서버의 공개 키를 이용해 서명을 검증하며, 서명이 올바르지 않으면 연결을 종료한다.
```

#### 사용자 인증

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

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

   * 공개 키 인증은 SSH에서 선호되는 방법이다. 클라이언트는 공개 키와 개인 키 쌍을 생성하고, 서버에 공개 키를 등록한다. 인증 과정은 다음과 같이 진행된다:
   * 클라이언트는 서버에 인증 요청을 보낸다.
   * 서버는 클라이언트의 공개 키를 확인하고, 임의의 데이터를 클라이언트에게 보낸다.
   * 클라이언트는 자신의 개인 키로 이 데이터를 암호화한 후, 서버에 전송한다.
   * 서버는 클라이언트가 전송한 데이터를 클라이언트의 공개 키로 복호화하여 신뢰성을 확인한다.

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

$$
\text{Sign}(D, \mathbf{K\_{\text{priv}}})
$$

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

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

#### 세션 생성 및 데이터 교환

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

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

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

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

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

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

3. **데이터 무결성 검사**

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

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

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

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