SSH
- Secure Shell
- 네트워크의 다른 컴퓨터에 로그인하거나 원격 시스템에서 명령을 실행하고 다른 시스템으로 파일을 복사할 수 있도록 하는 보안 프로토콜입니다. SSH는 암호화된 연결을 사용하여 데이터를 전송하므로 전송 중인 데이터가 액세스되거나 가로채지 않도록 보호합니다.
- SSH는 OSI 7계층 모델에서 애플리케이션 계층에 있습니다.
- SSH는 공개 키 암호화를 사용합니다
- 비공개 키로 암호화된 데이터는 공개 키로만 복호화할 수 있고, 반대로 공개 키로 암호화된 데이터는 비공개 키로만 복호화할 수 있습니다.
SSH 연결 과정
클라이언트가 서버에 처음 연결을 요청할 때마다 발생합니다. 즉, 새로운 SSH 세션을 시작할 때마다 이런 인증 과정이 이루어집니다.
- 세션 생성: 클라이언트가 서버에 연결을 요청합니다. 이때 클라이언트의 SSH 버전 정보가 서버에게 전송됩니다.
- 암호화 방식 협상: 클라이언트와 서버는 양측이 지원하는 암호화 방식의 목록을 교환하고, 공통적으로 사용할 암호화 방식을 선택합니다. 이 과정에서 서버는 클라이언트에게 자신의 공개 키도 전송합니다.
- 공개 키 확인: 클라이언트는 서버로부터 받은 공개 키가 이미 저장된 서버의 공개 키와 일치하는지 확인합니다. 처음 연결하는 서버라면, 클라이언트는 서버의 공개 키를 저장합니다.
- 세션 키 생성 및 교환: 클라이언트는 일종의 비밀 값을 랜덤하게 생성하고 이를 서버의 공개 키로 암호화하여 서버에게 전송합니다. 서버는 자신의 비공개 키로 이 값을 복호화하여 클라이언트와 동일한 세션 키를 얻습니다.
- 사용자 인증: 클라이언트는 사용자 이름과 패스워드, 또는 공개 키 기반의 인증 방식을 사용해 서버에 접근합니다.
SSH 통신 과정
- 세션 시작: 사용자 인증이 성공적으로 이루어지면, SSH 세션은 시작됩니다. 이때부터 클라이언트와 서버 사이의 모든 통신은 암호화되어 이루어집니다.
- 데이터 전송: 클라이언트와 서버는 세션 키를 사용하여 데이터를 암호화하고 복호화합니다. 이렇게 암호화된 데이터는 네트워크를 통해 전송됩니다.
- 세션 종료: 사용자가 세션을 종료하면, 클라이언트와 서버 사이의 연결이 끊어집니다. 이때 사용했던 세션 키도 폐기되며, 이 후의 통신을 위해서는 새로운 세션 키가 필요합니다.
SSH 암호화 방식
SSH는 여러 가지 암호화 방식을 지원합니다. 여기서 암호화 방식이라는 것은 데이터를 암호화하고 복호화하는 방법을 말합니다. 암호화 방식에 따라 보안성과 성능이 달라질 수 있습니다. 이런 암호화 방식들 중 일부를 살펴보겠습니다:
- AES (Advanced Encryption Standard): AES는 현재 가장 널리 사용되는 암호화 방식 중 하나입니다. AES는 128, 192, 256 비트의 키 크기를 지원하며, 그에 따라 AES-128, AES-192, AES-256 등으로 표현됩니다.
- DES (Data Encryption Standard) & 3DES (Triple DES): DES는 오래된 암호화 방식으로, 현재는 보안상의 취약점 때문에 권장되지 않습니다. 3DES는 DES를 세 번 적용하는 방식으로, DES보다는 보안성이 높지만 AES에 비하면 상대적으로 느리고 비효율적입니다.
- Blowfish & Twofish: Blowfish는 빠른 속도와 효율적인 메모리 사용이 특징인 암호화 방식입니다. 하지만 키 크기가 64비트로 제한되어 있어 보안성에 문제가 있을 수 있습니다. 이를 해결하기 위해 나온 Twofish는 128비트 키를 지원합니다.
- RSA: RSA는 공개 키 암호화 방식으로, 주로 데이터를 암호화하거나 디지털 서명을 생성하는 데 사용됩니다. SSH에서 RSA는 주로 서버의 신원을 확인하고 세션 키를 교환하는 데 사용됩니다.
- ChaCha20: ChaCha20는 고성능 암호화 알고리즘으로, 특히 모바일 기기 등의 낮은 성능의 장치에서 빠른 성능을 보입니다. Poly1305 메시지 인증 코드와 함께 사용되어 ChaCha20-Poly1305라고도 불립니다.
이 외에도 SSH는 다양한 암호화 방식을 지원합니다. SSH 클라이언트와 서버는 연결 설정 과정에서 공통으로 지원하는 암호화 방식을 선택하여 사용합니다. 암호화 방식을 선택할 때는 보안성과 성능 사이의 균형을 고려해야 합니다.
Diffie-Hellman 키 교환
세션 키는 대부분의 경우 클라이언트와 서버 간의 공동 작업을 통해 생성됩니다. 이 과정은 Diffie-Hellman 키 교환 알고리즘을 사용하여 이루어집니다. 이 방법을 사용하면 두 개체가 공개 통신 채널을 통해 안전하게 공유 비밀을 생성할 수 있습니다.
Diffie-Hellman 키 교환의 간단한 설명은 다음과 같습니다:
- 클라이언트와 서버는 각각 비밀 값을 선택합니다. 이 비밀 값은 선택한 개체만 알고 있으며, 다른 개체나 통신 채널에 노출되지 않습니다.
- 클라이언트와 서버는 각각의 비밀 값을 사용하여 공개 값을 계산합니다. 이 계산 과정은 일방향 함수를 사용하므로, 공개 값을 보아서 비밀 값을 알아낼 수 없습니다.
- 클라이언트와 서버는 이렇게 생성된 공개 값을 서로에게 전송합니다.
- 클라이언트와 서버는 받은 공개 값을 자신의 비밀 값과 함께 사용하여 세션 키를 계산합니다. 이 계산 결과는 클라이언트와 서버가 선택한 비밀 값에 따라 달라지므로, 둘은 같은 세션 키를 도출하게 됩니다.
이 방법을 사용하면, 클라이언트와 서버는 서로 비밀을 교환할 필요 없이 동일한 세션 키를 생성할 수 있습니다. 따라서 둘 사이의 모든 통신은 이 세션 키를 사용하여 암호화되며, 이 세션 키는 공개 통신 채널을 통해서는 알아낼 수 없습니다.
'네트워크' 카테고리의 다른 글
DNS Lookup (0) | 2023.07.29 |
---|---|
AWS VPC, Region과 Zone (0) | 2023.06.09 |
Restful API (1) | 2023.05.31 |
OAuth 2.0 (0) | 2023.03.16 |
Session vs JWT (1) | 2023.01.26 |