공부하게 된 배경
AWS를 이용해서 EC2 서버를 띄우게 되면, 그 호스트에 접속하기 위해서 CLI 상에서 SSH 프로토콜을 사용하게 된다.
SSH가 원격 호스트에 접속하기 위해 사용되는 프로토콜이라는 것까지만 알고 있었는데, SSH가 정확히 무엇인 지, 어떠한 방식으로 원격호스트에 접근하는 지에 대해서는 정확히 알고 있지 않았다.
따라서 이번 기회에 서버 보안에 있어서 가장 대표적이고 유용한 수단인 SSH
에 대해서 정리해보려한다.
이 글에서 다루는 내용
- 텔넷(Telnet)과 SSH
- SSH 동작 방식
- 대칭키와 비대칭키
등을 다루고 있다.
SSH란?
Secure Shell의 줄임말로, 원격 호스트에 접속하기 위해 사용되는 보안 프로토콜.
Shell(쉘)이란?
명령어와 프로그램을 사용할 때 쓰는 인터페이스. 좀 더 자세하게 표현하자면 커널과 사용자 간의 다리 역할을 하는 것으로, 사용자로부터 명령을 받아 그것을 해석하고 실행하는 역할을 한다. Shell에 대한 자세한 설명
SSH는 네트워크 상 다른 컴퓨터의 쉘을 사용할 수 있게 해 주는 프로그램 혹은 그 프로토콜을 의미한다. SSH를 사용하면 원격에서 네트워크 상의 컴퓨터에 접속할 수 있다. SSH는 강력한 보안을 제공하기에 안전하지 못한, 개방된 네트워크에서도 안전하게 통신할 수 있다. 서버 관리자가 항상 서버 옆에 있을 수는 없으므로, 서버 관리자는 일반적으로 원격지에서 SSH를 통해 서버에 접속해 서버를 관리하게 된다.
- 원격 접속의 방식으로 기존에는 ‘텔넷(Telnet)’ 1을 사용했는데, 이는 암호화를 제공하지 않기 때문에 보안상 취약하다는 단점이 있었다.
- 실제로 WireShark같은 패킷 분석 프로그램을 이용하면 누구나 쉽게 (텔넷)원격 접속 과정에서 옮겨지는 비밀번호나 파일 내용 등의 데이터를 탈취할 수 있다.
- 때문에 1995년에 이를 암호화하는 SSH 기술이 등장했고, 현재 원격 접속 보안을 위한 필수적인 요소로 자리잡고 있다.
- SSH 통신은 노출되더라도 이해할 수 없는 암호화된 문자로 보인다.
- Telnet은 기본 포트로 23을 사용했지만, SSH의 경우에는 기본 포트로 22번을 사용한다.
- 추가 설명 : FTP(File Transfer Protocol)는 21번을 기본 포트로 사용하고 있는데, Telnet vs SSH 와 FTP vs SFTP는 둘 다 Secure이 추가된 비슷한 맥락이므로 같이 외워두면 좋을 것 같다.
- 리눅스와 Mac과 같은 Unix 계열의 운영체제의 경우에는 SSH 클라이언트와 서버가 이미 설치되어 있기 때문에 SSH를 이용하기 위한 특별한 사전 준비가 필요없지만, 윈도우의 경우에는 추가 설정이 필요하다.
클라우드 서비스에서 제공하는 서버는 기본적으로 원격 접속을 기반으로 사용되기 때문에 AWS와 같은 CSP(Cloud Service Provider)에서 서버 생성 시 필수적으로 SSH 보안 과정을 거치고 있다.2
SSH의 작동원리
그렇다면 이 SSH는 도대체 어떤 원리로 동작하는 것일까?
SSH의 보안 방식에는 다양한 종류가 있지만 여기서는 가장 대중적으로 쓰이는 방식을 설명하고자 한다.
아래의 작동 순서 설명 이전에 키를 생성하는 과정이 필요하다. openSSH 등을 이용해서 키를 생성하는 과정은 본 게시글에서는 생략하도록 하겠다. 다만, 키를 생성하면 공개키와 비공개키가 만들어지게 되는데, 이 중 비공개키는 로컬 머신에 위치해야 하고 공개키는 원격 머신에 위치해야 한다는 것은 알고 가자.(로컬 머신은 SSH Client, 원격 머신은 SSH Server가 설치된 컴퓨터를 의미한다)
SSH 작동 원리는 아래와 같다.
- 연결 이전, 서버와 클라이언트는 서로의 공개 키(Public Key)를 알고 있다.
- 클라이언트가 서버에 연결 요청을 보내면, 우선 서로를 인증(Authentication)하는 절차를 거친다.
- 서버 인증 : 클라이언트는 난수를 하나 생성한 후, 이를 서버의 공개 키로 암호화해서 서버에게 전송하고, 난수의 해시(Hash)를 저장해 둔다. 서버는 전송받은 암호화된 난수를 서버 자신의 개인 키(Private Key)로 복호화한 후, 복호화된 난수의 해시를 계산해 클라이언트에게 전송한다. 클라이언트는 전송받은 난수의 해시를 저장된 해시와 비교하여 서버를 인증한다.
- 클라이언트 인증 : 위 서버 인증 과정에서 서로의 역할만 바꿔 동일하게 진행한다. 즉, 서버는 난수를 하나 생성한 후, 이를 클라이언트의 공개 키로 암호화해서 클라이언트에 전송하고, 난수의 해시를 저장해 둔다. 클라이언트는 전송받은 암호화된 난수를 클라이언트 자신의 개인 키로 복호화한 후, 복호화된 난수의 해시를 계산해 서버에게 전송한다. 서버는 전송받은 난수의 해시를 저장된 해시와 비교하여 클라이언트를 인증한다.
- 양 측간의 인증이 끝나면, 비대칭 키를 이용하여 대칭 키(Session Key)를 교환한다.
교환된 대칭 키를 이용해 SSH 서버와 클라이언트 간 모든 통신은 암호화하여 진행되기에, SSH 연결은 매우 안전하다.
SSH를 구성하는 가장 핵심적인 키워드는 KEY(키, 열쇠)
라고 할 수 있다.
사용자(클라이언트)와 서버(호스트)는 각각의 키를 보유하고 있으며, 이 키를 이용해 연결 상대를 인증하고 안전하게 데이터를 주고 받게 된다.
키를 생성하는 방식에는 두 가지가 있는데, 바로 ‘대칭키’와 ‘비대칭키(또는 공개 키)’방식이다.
대칭키와 비대칭키는 SSL 인증서 등 다른 곳에서도 암호화 방식으로 굉장히 많이 사용되므로 잘 알고 있어야 한다.
비대칭키 방식
비대칭키 방식에서는 서버 또는 사용자가 Key Pair(키 페어, 키 쌍)를 생성한다.
키 페어는 공개 키와 개인 키의 두 가지로 이루어진 한 쌍을 뜻하며, 보통 공개 키의 경우
.pub
, 개인 키의 경우.pem
의 파일 형식을 띄고 있다.
사용자가 키 페어를 생성했을 경우, 공개 키를 서버에 전송한다. 공개 키는 말 그대로 ‘공개’된 키이기 때문에 누구나 가질 수 있고, 때문에 전송과정에서 유출되어도 크게 문제가 되지 않는다.
서버는 공개 키를 받아서, 이 공개 키로 만들어진 랜덤한 값을 생성한다. 이 값은 사용자가 올바른 키 페어를 가지고 있는지 시험하는 일종의 시험지와 같다.
시험지를 받은 사용자는 가지고 있는 개인 키를 이용해 이 시험지를 푼다.
여기서 중요한 점은!
앞서 말한 것처럼 공개 키와 개인 키는 한 쌍이므로, 다른 공개 키나 개인 키를 이용해서 풀어낼 수 없다. (오직 키 페어 생성 시 함께 생성된 개인 키와 공개 키만 서로 해석이 가능하다.)
따라서 개인 키는 서버와 사용자 간의 사이를 증명하는 수단이 될 수 있고, 공유하지 않으며 개인이 안전한 방법으로 관리한다.
우리가 그동안 CSP를 이용하면서 서버 생성 시에 제공받았던pem
파일이 바로 이 파일이다.
다시 과정으로 돌아와서, 시험지를 풀어서 나온 값(개인키로 복호화한 값)을 사용자는 다시 서버에 전송하고, 서버는 사용자로부터 전송받은 값을 자신이 처음에 낸 값과 비교한다. 두 값이 같다면, 서버는 “이 사용자는 내 공개 키에 대응하는 올바른 개인 키를 보유하고 있으니, 내가 아는 사용자가 맞다!” 라고 판단하고 접속을 허용해준다.
이렇게 최초 접속 시 사용자와 서버 간의 인증 절차가 비대칭키 방식을 통해 완료된다.
대칭키 방식
비대칭키 방식을 이용해 서로의 신원을 확인했으니, 이제 정보를 주고받을 차례이다.
이때 통신 과정에서 정보가 새어나가지 않기 위해 암호화해서 주고받는데, 여기서 사용되는 과정이 대칭키 방식이다.
대칭키 방식에서는 비대칭키 방식과 달리 한 개의 키만을 사용한다.
대칭키 방식을 사용하게 되면, 사용자 또는 서버는 하나의 대칭 키를 만들어 서로 공유한다.
공유된 대칭 키를 이용해 정보를 암호화하면, 받은 쪽에서 동일한 대칭 키로 암호를 풀어 정보를 습득하게 된다. 정보 교환이 완료되면 교환 당시 썼던 대칭 키는 폐기되고, 나중에 다시 접속할 때마다 새로운 대칭 키를 생성하여 사용하게 된다.
이렇게 하여 일련의 원격 접속 과정이 SSH를 통해 안전하게 이루어지는 것을 알 수 있다.
SSH의 사용법 및 주의사항
기본적인 SSH 접속 명령문은 아래와 같다.
1
ssh (사용자 계정)@(원격지 ip)
개인 키(pem파일)를 잃어버리거나 손상시키게 되면 기본적으로 복구가 불가능하다. 때문에 개인 키는 반드시 안전한 곳에 백업하거나 보관해놓아야 한다. 또한 개인 키 파일이 위치한 파일 경로가 서버 상에서 인식하고 있는 경로와 다를 경우 서버가 개인 키 파일을 찾지 못하므로 수동으로 경로를 생성하거나 직접 새로운 경로를 입력해서 접속해야 한다.
이 경우에는 아래 커맨드를 입력하면 된다.
1
ssh –i (파일경로) (서버 아이디)@(ip주소)
: Reference
위키백과 - 시큐어 셸
가비아 - SSH 명칭부터 접속까지 한 번에 이해하기 1
가비아 - SSH 명칭부터 접속까지 한 번에 이해하기 2
Reinventing the Wheel - SSH란?
[리눅스] ssh란?
[네트워크] 프로토콜 : SSH, Telnet (22 port)// SFTP, FTP (21 port)// RDP
Telnet(텔넷)이란 원격 컴퓨터에 접근하기 위한 명령줄 도구이자 기본 TCP/IP 프로토콜으로서, 로컬 네트워크 내에서 직접 연결된 것처럼 리모트 컴퓨터에 로그온하여 사용할 수 있도록 한다. 실제로 사용하는 시스템(보통 PC)은 Telnet 클라이언트이며, Telnet 서버는 클라이언트가 접속되어 있는 리모트 컴퓨터이다. TCP/IP는 Telnet 클라이언트와 서버 모두를 지원한다. ↩
흔히 NBP나 AWS같은 클라우드 서비스에서 서버를 생성해보면 ‘인증키’나 ‘키 페어’라는 것을 생성하는 과정을 반드시 거치게 되고 pem이라는 낯선 형식의 파일을 다운로드 받게 된다. 이 파일이 있어야만 ‘SSH’ 보안 방식이 적용된 서버에 원격으로 접속이 가능하다. ↩