2024. 4. 11. 00:05ㆍ네트워크
SSH란?
SSH는 "Secure Shell"의 약자로 네트워크 프로토콜 중 하나입니다.
SSH는 주로 네트워크 상에서 안전하게 원격 서버에 로그인하여 명령을 실행하거나 파일을 관리하는 데 사용됩니다.
사용자 인증부터 데이터 전송까지 모든 과정이 암호화되기 때문에 보안성이 매우 높습니다.
SSH 암호화 방식
SSH에서 암호화 방식은 대칭키, 공개키 방식이 있습니다.
대칭키 방식
대칭키 방식은 데이터를 암호화하고 복호화하는데 동일한 키를 사용하는 암호화 방식을 말합니다.

대칭키 방식은 하나의 키로 암/복호화를 하므로 사용하는 키는 절대 노출되면 안됩니다.
따라서, 통신하는 상대방 간에 키를 안전하게 교환하는 것이 매우 중요합니다.
동일한 키를 가지고 암/복호화를 진행하기 때문에 비대칭키 방식보다 속도가 빠르다는 장점이 있습니다.
대칭키를 사용하는 대표적인 알고리즘으로는 AES가 있습니다.
비대칭키 방식
비대칭키 방식은 데이터를 통신하는 송신자/수신자가 동일한 키를 사용하지 않고 암/복호화를 하는 방식을 말합니다.

비대칭키 방식에서는 공개키와 비공개키라는 2개의 키가 등장합니다.
공개키는 암호화를 사용하는데 쓰이고 비공개키는 복호화를 하는데 사용합니다.
비공개키 방식의 통신은 아래와 같은 방식으로 이루어 집니다.
1. 송신자가 수신자에게 공개키를 요구합니다.
2. 송신자가 수신자에게 받은 공개키로 전달하려는 데이터를 암호화합니다.
3. 수신자는 송신자에게 받은 데이터를 비공개키로 복호화해서 사용합니다.
SSH의 동작 방식
연결 설정

클라이언트가 SSH를 사용해 서버의 IP주소와 SSH 포트 번호를 지정하여 연결을 시도합니다.
(SSH는 클라이언트 - 서버 모델로 동작합니다.)
(SSH 프로토콜은 기본적으로 22번 포트롤 사용해 통신합니다.)
서버 인증

1. 서버는 클라이언트에게 자신의 신원을 증명하기 위해 공개키(public key)를 제공합니다.
(클라이언트가 해당 서버에 최초 접속이라면 클라이언트는 로컬에 서버에서 받은 공개키를 저장합니다.
공개키는 클라이언트 측 홈 디렉토리의 .ssh/known_hosts 파일 안에 저장됩니다.)
클라이언트의 known_hosts 경로(기본값)
<Linux 운영체제>
일반계정 : /home/USER/.ssh/known_hosts
root 계정 : /root/.ssh/known_hosts
<Window 운영체제>
%USERNAME%\.ssh\known_hosts
2. 클라이언트는 난수를 생성하고 난수의 해시값을 만들어서 저장합니다.
3. 난수를 서버의 공개키로 암호화 후 서버에 전송합니다.
4. 서버에서는 서버의 개인키로 복호화해서 난수를 얻습니다.
5. 얻은 난수의 해시값을 생성 후 클라이언트에게 전송합니다.
6. 클라이언트에서 받은 해시값과 저장해 놓은 해시값을 비교해서 같다면 신원이 증명됩니다.
이때 함께 진행되는 절차 중 아주 중요한 것이 있는데, 바로 세션키를 생성하는 것입니다.
세션키는 일반적으로 SSH 연결마다 새로 생성되며 클라이언트와 서버가 데이터를 통신할 때 사용할 대칭키를 말합니다.
클라이언트 인증
서버 또한 자신에게 접속하려는 클라이언트가 접근할 수 있는 권한이 있는지 확인합니다.
패스워드 인증과 키 페어 인증 방식이 있습니다.
패스워드 인증
사용자가 입력한 비밀번호를 서버 인증 과정에서 생성된 세션키로 암호화하여 서버에게 보내고 서버는 이를 검증하는 방식으로 이루어집니다.
다만, 이 방식은 패스워드가 암호화되어 보내진 다 고해도 자동화된 스크립트를 이용하면 적당한 길이의 패스워드는 금방 뚫을 수 있기 때문입니다.
키 페어 인증 방식
서버 인증 방식에서 클라이언트와 서버만 바뀌면 클라이언트 키 페어 인증 방식이 됩니다.
1. 클라이언트에서 공개키와 개인키를 생성
2. 클라이언트의 공개키를 복사해서 서버의 .ssh/authorized_keys 파일에 저장
클라이언트 키 페어 인증방식은 상기의 두 과정이 미리 선행돼야 합니다.

1. 클라이언트는 서버에 접속하기 위해 공개키를 서버에게 전송합니다.
2. 서버는 해당 공개키가 .ssh/authorized_keys 파일 안에 저장되어 있는지 확인합니다.
3. 존재한다면 난수 값을 생성하고 해시값을 만들어서 저장합니다.
4. 서버에서 난수 값을 공개키로 암호화해서 클라이언트에게 전달합니다.
5. 클라이언트는 개인키로 복호화해서 난수를 얻습니다.
6. 얻은 난수의 해시 값을 생성해서 다시 서버로 전달합니다.
7. 해시 값을 비교해서 같을 경우 정상 사용자로 인식하고, 이제부터 데이터 통신이 가능해집니다.
데이터 통신
이제 서버 인증 과정에서 생성된 세션키를 이용해 대칭키 방식으로 데이터를 주고받으며 통신할 수 있게 되었습니다.
세션키는 대칭키 방식이기 때문에 세션키로 암호화하고 세션키로 복호화해서 하나의 키로 데이터를 통신합니다.
통신이 종료되면 SSH 세션이 종료되므로 해당 세션키는 사라집니다.