SSH는 Secure Shell 의 줄임말로, 원격 호스트에 접속하기 위해 사용되는 보안 프로토콜이다.
💡 (*Shell(쉘): 명령어와 프로그램을 사용할 때 쓰는 인터페이스를 말합니다. 좀 더 자세하게 표현하자면 커널과 사용자 간의 다리 역할을 하는 것으로, 사용자로부터 명령을 받아 그것을 해석하고 실행하는 역할을 합니다. 흔히 검은 바탕에 흰 글자가 나오는 명령어 입력 환경을 떠올리시면 됩니다.)
기존 원격 접속은 Telnet 이라는 방식을 사용했었다. 하지만 Telnet은 암호화 기능을 제공하지 않기 때문에 보안상 취약하다는 단점이 있었다.
따라서 Telnet의 보안상 취약점을 보안하기위해 SSH 기술이 등장했고, 현재는 원격 접속 보안을 위한 필수적인 요소로 자리잡고 있다.
최근 유행하는 클라우드 서비스에서 제공하는 서버는 기본적으로 원격 접속을 통해 접근하여 사용하므로 클라우드 서비스에서 서버 생성시 필수적으로 SSH보안 과정을 거치는 것이다.
SSH의 기본 개념에 대해 이해가 됐다면 이제 SSH의 작동원리에 대해 이해해보자.
SSH의 보안방식에는 다양한 종류가 있지만 가장 대중적이고 핵심적인 내용부터 알아보도록 하자.
SSH를 구성하는 가장 핵심적인 키워드는 ‘KEY’이다. 사용자(Client)와 서버(Host)는 각각의 키를 보유하고 있으며, 이 키를 통해 연결 상대를 인증하고 안전하게 데이터를 주고 받게 된다.
그럼 키를 생성하는 방식은 어떻게 될까? 대표적인 방법으로는 두 가지가 있다. 바로 ‘대칭 키' 와 ‘비대칭 키(공개 키)’ 방식이 있다.
먼저 비대칭 키가 작동하는 순서에 대해 알아보자.
가장 먼저 사용자와 서버가 서로의 정체를 증명해야 한다. 그 시점에 사용되는 것이 비대칭 키 방식이다. 비대칭 키 방식에서는 서버 또는 사용자가 Key Pair를 생성한다. 키페어는 공개 키와 개인 키의 두 가지로 이루어진 한 쌍을 뜻하며, 보통 공개 키의 경우.pub, 개인 키의 경우 .pem 파일의 형식을 가지고 있다.
예를 들어 사용자가 키 페어를 생성했을 경우, 공개 키를 서버에 전송한다. 공개 키는 말 그대로 ‘공개'된 키이기 때문에 통신하는 과정에서 유출되어도 크게 문제가 되지 않는다. 서버는 공개 키를 받아서 공개 키로 만들어진 랜덤한 값을 생성하게 되는데 이 값은 사용자가 올바른 키 페어를 가지고 있는지 시험하는 일종의 시험지와 같다고 생각하면 된다.
시험지를 받은 사용자는 가지고 있는 개인키를 이용해서 앞서 서버에서 공개 키를 이용해 생성한 랜덤한 값을 풀어낸다 앞에서 설명했듯이 공개 키와 개인 키는 하나의 쌍 이기 때문에 다른 공개 키나 개인 키를 이용해서 풀어낼 수 없다. 오직 키 페어 생성 시 함께 생성된 개인 키와 공개 키만이 서로 해석이 가능하다. 다시말해서 개인 키를 제외한 어떤 방법으로도 서버에서 공개 키를 이용해 생성한 랜덤한 값을 풀어 낼 수 없다.
정리해보자면 공개 키에서 나온 값은 개인 키로만 풀어낼 수 있는데 그 개인 키는 사용자 만 가지고 있다. 개인 키로 풀어낸 뒤 서버에 값을 전송한다.
이후 서버는 사용자로부터 전송받은 값과 처음에 낸 값과 비교해서 두 값이 같다면 서버의 접속을 허용해주는 것이다.
접속이 허용되었으니 이제 서로 통신을 통해 정보를 주고 받아야하는데, 서로 통신하는 과정에서 정보가 유출되지 않게 정보를 암호화해서 주고받는다. 여기서 사용되는 방식이 대칭 키 방식이다.
대칭 키라는 이름에서 알 수 있듯이 이미 비대칭 키를 이용해 서로 신뢰할 수 있는 상태가 되었으니 서로 하나의 키를 통해서 정보를 암호화하여 통신한다.