SSH 명칭부터 접속까지 한 번에 이해하기 1
서버를 만들 때 주는 ‘이 파일’이 뭘까?
흔히 NBP나 AWS같은 클라우드 서비스에서 서버를 생성해보면 ‘인증키’나 ‘키 페어’라는 것을 생성하는 과정을 반드시 거치게 됩니다. 생성하면 pem이라는 낯선 형식의 파일을 다운로드받게 되는데, 이게 대체 뭘까요? 서버 접속에 반드시 필요한 파일인줄은 알겠지만, 내 컴퓨터에 가만 놔 두기엔 그 정체를 모릅니다.
사실 이 파일은 우리가 생성한 서버에 원격으로 접속할 때, 외부의 보안 위협으로부터 보호해주는 ‘SSH’라는 보안 방식이 적용된 서버에서 반드시 필요한 파일입니다. 이전에도 ‘리눅스 보안 이슈를 해결하는 4가지 방법’에서 소개된 적이 있죠.
그만큼 SSH는 서버 보안에 있어서 가장 대표적이고 유용한 수단이기 때문에 많은 클라우드 서비스에서 이렇게 제공하고 있는 것입니다. 그렇다면 SSH란 정확히 무엇일까요? 이 파일의 정체에 대해 설명하기 위해선 먼저 SSH에 대해 알아야 합니다.
SSH란?
SSH는 Secure Shell의 줄임말로, 원격 호스트에 접속하기 위해 사용되는 보안 프로토콜입니다.
(*Shell(쉘): 명령어와 프로그램을 사용할 때 쓰는 인터페이스를 말합니다. 좀 더 자세하게 표현하자면 커널과 사용자 간의 다리 역할을 하는 것으로, 사용자로부터 명령을 받아 그것을 해석하고 실행하는 역할을 합니다. 흔히 검은 바탕에 흰 글자가 나오는 명령어 입력 환경을 떠올리시면 됩니다.)
기존 원격 접속은 ‘텔넷(Telnet)’이라는 방식을 사용했는데, 암호화를 제공하지 않기 때문에 보안상 취약하다는 단점이 있었습니다. 실제로 WireShark같은 패킷 분석 프로그램을 이용하면 누구나 쉽게 원격 접속 과정에서 옮겨지는 비밀번호나 파일 내용 등의 데이터를 탈취할 수 있습니다. 때문에 이를 암호화하는 SSH 기술이 등장했고, 현재 원격 접속 보안을 위한 필수적인 요소로 자리잡고 있습니다. 그리고 클라우드 서비스에서 제공하는 서버는 기본적으로 원격 접속을 해서 접근하고 사용합니다. 그래서 NBP나 AWS와 같은 CSP(Cloud Service Provider, 클라우드 서비스를 제공하는 곳)에서 서버 생성시 필수적으로 SSH 보안 과정을 거치는 것입니다.
SSH의 작동원리
이제 SSH의 명칭과 필요성에 대해서는 어느 정도 이해가 되었습니다. 그렇다면 이 SSH는 도대체 어떤 원리로 동작하길래 이런 파일을 사용자에게 주는 걸까요? SSH의 보안 방식에는 다양한 종류가 있지만 여기서는 가장 대중적으로 쓰이는 방식에 대해서 핵심적인 내용만 언급하도록 하겠습니다.
SSH를 구성하는 가장 핵심적인 키워드는 ‘KEY(키, 열쇠)’입니다. 사용자(클라이언트)와 서버(호스트)는 각각의 키를 보유하고 있으며, 이 키를 이용해 연결 상대를 인증하고 안전하게 데이터를 주고 받게 됩니다. 여기서 키를 생성하는 방식이 두 가지가 있는데, 그것이 SSH를 검색했을 때 가장 쉽게 볼 수 있는 ‘대칭키’와 ‘비대칭키(또는 공개 키)’ 방식입니다.
– 비대칭키 방식
작동하는 순서를 하나하나씩 짚어보도록 하겠습니다. 가장 먼저 사용자와 서버가 서로의 정체를 증명해야 합니다. 이 시점에서 사용되는 것이 비대칭키 방식입니다. 비대칭키 방식에서는 서버 또는 사용자가 Key Pair(키 페어, 키 쌍)를 생성합니다. 키 페어는 공개 키와 개인 키의 두 가지로 이루어진 한 쌍을 뜻하며, 보통 공개 키의 경우 .pub, 개인 키의 경우 .pem의 파일 형식을 띄고 있습니다.
예를 들어보겠습니다. 사용자가 키 페어를 생성했을 경우, 공개 키를 서버에 전송합니다. 공개 키는 말 그대로 ‘공개’된 키이기 때문에 누구나 가질 수 있습니다. 때문에 전송과정에서 유출되어도 크게 문제가 되지 않습니다. 서버는 공개 키를 받아서, 이 공개 키로 만들어진 랜덤한 값을 생성합니다. 이 값은 사용자가 올바른 키 페어를 가지고 있는지 시험하는 일종의 시험지와 같습니다.
시험지를 받은 사용자는 가지고 있는 개인 키를 이용해 이 시험지를 풉니다. 앞서 말씀드린 것처럼 공개 키와 개인 키는 하나의 커플 관계와도 같기 때문에, 다른 공개 키나 개인 키를 이용해서 풀어낼 수 없습니다. 오직 키 페어 생성 시 함께 생성된 개인 키와 공개 키만 서로 해석이 가능합니다. 다시 말해 개인 키를 제외한 그 어떤 방법으로도 이 시험지를 풀어낼 수 없습니다.
또한 개인 키는 공개 키와 달리 다른 어디에도 보여주지 않는 소중한 파일입니다. 그래서 결과적으로 개인 키가 서버와 사용자 간의 사이를 증명하는 수단이 되는 것입니다. 공개 키에서 나온 문제는 개인 키로만 풀 수 있고, 개인 키는 사용자만 가지고 있으니까요. 우리가 그동안 CSP를 이용하면서 서버 생성 시에 제공받았던 pem파일이 바로 이 파일인 것입니다. 다시 과정으로 돌아와서, 시험지를 풀어서 나온 값을 사용자는 다시 서버에 전송합니다.
서버는 사용자로부터 전송받은 값을 자신이 처음에 낸 값과 비교합니다. 두 값이 같게 되면 서버는 “이 사용자는 내 공개 키에 대응하는 올바른 개인 키를 보유하고 있으니, 내가 아는 사용자가 맞다!” 라고 판단하고 접속을 허용해줍니다. 이렇게 최초 접속 시 사용자와 서버 간의 인증 절차가 비대칭키 방식을 통해 완료됩니다.
– 대칭키 방식
서로가 누군지를 알았으니 이제 정보를 주고받을 차례입니다. 주고받는 과정에서 정보가 새어나가지 않기 위해 정보를 암호화해서 주고받는데, 여기서 사용되는 과정이 대칭키 방식입니다. 대칭키 방식에서는 비대칭키 방식과 달리 한 개의 키만을 사용하는데, 우리는 이것을 대칭 키라고 합니다.
아까와 같은 예를 들어보겠습니다. 사용자 또는 서버는 하나의 대칭 키를 만들어 서로 공유합니다. 공유된 대칭 키를 이용해 정보를 암호화하면, 받은 쪽에서 동일한 대칭 키로 암호를 풀어 정보를 습득하게 됩니다. 정보 교환이 완료되면 교환 당시 썼던 대칭 키는 폐기되고, 나중에 다시 접속할 때마다 새로운 대칭 키를 생성하여 사용하게 됩니다.
이렇게 하여 일련의 원격 접속 과정이 SSH를 통해 안전하게 이루어지는 것을 알 수 있습니다. SSH에 대한 이해가 모두 이루어졌으니, 2부에서는 SSH 키 페어를 직접 생성하여 서버에 적용하는 과정을 하나하나씩 면밀히 살펴보도록 하겠습니다.