SSH : Secure Shell / Secure Socket Shell
- 참고문서 : Understanding SSH workflow
SSH란 ?
SSH는 관리자들이 원격 컴퓨터에 안전한 방법으로 접근할 수 있게끔 해주는 네트워크 프로토콜이다. SSH는 클라이언트와 서버 간에 보안된 연결을 형성하며, 서로 간에 증명하며 명령어를 전달할 수 있다.
SSH는 어떻게 동작하는가?
SSH 프로토콜은 정보의 전송을 안전하게 하기 위해 대칭 / 비대칭 암호화와 해싱을 사용한다. 클라이언트와 서버 간의 SSH 연결은 다음의 세 단계를 거친다.
- 클라이언트에 의한 서버의 증명
- 모든 통신을 암호화하기 위한 세션 키 생성
- 클라이언트의 인증
위의 세 단계에 대해서는 아래에서 살펴보자.
1. 서버의 증명
클라이언트가 처음 서버와 SSH 연결을 실행한다. 서버는 기본적으로는 SSH 연결에 대해서 22번 포트(바뀔 수 있다)를 수신한다. 이 시점에서, 서버의 신원이 확인되는데, 두 가지 경우가 있다.
- 만약 클라이언트가 서버에 처음으로 접속하는 것이라면, 클라이언트는 서버의 공개 키(퍼블릭 키 : Public key)를 검증함으로써 직접 인증해야 한다. 서버의 퍼블릭 키는
ssh-keyscan
커맨드를 통해서 확인하거나, 구글 등을 통해 살펴볼 수 있다. 일단 키가 증명되면, 클라이언트 측의~/.ssh
디렉토리에known_hosts
파일에 해당 서버를 추가한다. 이known_hosts
파일은 클라이언트에 의해 검증된 서버들에 대한 정보들을 담고 있다. - 만약 클라이언트가 처음으로 서버에 접속하는 게 아니라면, 앞서 생성한
known_hosts
파일에 기록된 정보들로 서버의 신원을 확인하며, 이를 인증에 사용한다.
2. 세션 키 생성
일단 서버가 인증되고 나면, 클라이언트와 서버 양측에서 Diffie-Hellman 알고리즘이라는 버전을 사용하여 세션 키를 협상한다. 해당 알고리즘은 세션 키 생성 시에 양측이 동등하게 기여할 수 있는 방식으로 설계된다. 생성된 세션키는 공유 대칭 키(Shared symmetirc key)이며, 다시 말해 동일한 키가 암호화와 복호화에 같이 사용된다.