SSH란?
SSH(Secure Shell)는 네트워크를 통해 다른 원격지의 컴퓨터에 로그인하거나 명령을 실행하여 이를 조작하는 Protocol을 의미한다. => Remote Connection 방식 중 하나!
과거의 원격지의 컴퓨터와 통신하는 프로토콜은 Telnet이 존재한다.
다만, Telnet의 가장 큰 문제점은 데이터를 전송할 때 암호화(encryption)를 하지 않았고, 이를 원격 접속 간의 보안성을 유지하기 위해서 SSH를 사용하게 되었다.
Telnet을 사용해서 원격 접속을 수행하게 되면, 가상 네트워크 환경에서 WireShark를 통해 주고받은 패킷을 열어보면, 어떤 데이터가 오고갔는지 모두 볼 수 있게 된다.
실제 비즈니스 환경에서 이런 방식을 사용하면, 보안에 대해 굉장한 결함을 갖게 되는 것과 같다.
SSH를 이용하여 이러한 문제를 보완하였고, 현재는 이 방법으로 Cloud 인스턴스에 접속하는 방식을 자주 사용한다.
SSH 연결 방식
SSH 연결 방식에는 크게
- PASSWORD
- KEY
위의 두 가지 방법을 사용할 수 있다.
PASSWORD 방식은 말 그대로 접속하려는 사용자의 사용자명과 PASSWORD를 통하여 원격지에 접속이 가능한 방식이다.
KEY 방식
PASSWORD를 통한 접속 방법은 가장 쉽게 접속할 수 있고, 별다른 구성 없이 바로 접속을 할 수 있는 방법이다.
하지만, 자주 접속하는 특정 서버의 경우, 매번 이를 입력하는 것이 귀찮기도 하고, 만약 관리하는 서버가 많을 경우, 각각의 사용자 명칭과 비밀번호를 기억해야하는 불편함이 존재한다.
이러한 불편함을 해소하기 위해서 Server와 Client간 KEY를 이용하여 이들을 인증하는 방법을 통해 PASSWORD를 입력하지 않아도 원격 접속을 실시하는 방법이 현재는 많이 사용된다.
Key 기반 방식에는 마찬가지로 2가지의 방법이 존재한다.
- 비대칭 키 방식(Key-Pair)
- 대칭 키 방식
두 방법 모두 KEY를 바탕으로 인증 과정을 거치게 되고, 이들은 키를 하나로 사용하는지, 2가지로 사용하는지에 따라 구분된다.
클라우드 환경에서 자주 사용하는 방식은 KEY-PAIR 방식이다..
이번 포스팅에서는, 비대칭 키 인증 방식에 대해서 알아보려 한다.
Key Pair 방식
Key Pair 방식은 SSH의 키 기반 인증 방식 중 공개 키(Public Key)와 개인 키(Private Key) 2개(한 쌍)를 사용하여 접속을 인증하는 방식이다.
Public Key는 말 그대로 외부에 공개를 수행하는 키이고, 보통 사용자가 만든 공개 키를 서버에게 등록시킨다.
Private Key는 사용자가 Public Key를 서버에 등록했다면, Private Key는 사용자가 보관하고 있는 키이다.
가벼운 예시를 들어보자면,
1. 사용자는 자물쇠와 열쇠를 한 쌍 준비한다. 그리고 접속을 원하는 서버에 자신의 자물쇠를 등록한다.
2. 사용자가 접속을 요청하면, 서버는 내가 맞는지 확인하기 위해서 등록된 자물쇠를 기반으로 내의 열쇠를 통해 풀 수 있는 자물쇠를 전달한다.
3. 사용자는 전달받은 자물쇠를 나의 열쇠를 통하여 해결하고, 결과를 서버에게 전달한다.
4. 서버는 해당 결과를 바탕으로 사용자를 인식하고 접속을 제공한다.
예시에서 표현한 열쇠는 개인 키(Private Key)라고 볼 수 있고, 자물쇠는 공개 키(Public Key)라고 볼 수 있다.
실제로는, 공개 키를 통하여 서버는 특정 데이터의 암호화를 수행하고, 이 암호화된 결과는 같이 발행된 개인 키를 통해서만 해독이 가능하다.
따라서, 서버는 내가 만든 공개 키(Public Key)를 통하여 문제를 만들고, 나는 서버가 만든 문제를 개인 키(Private Key)를 통하여 푸는 방식이라고 표현할 수도 있다.
Key Pair 기반 인증의 방식을 순서대로 표현하면 아래와 같다.
- 사용자(Local 환경)의 기기에서 Key Pair를 생성한다.
- 이 중 공개 키(Public Key)를 서버에 등록시킨다.
- 접속을 요청하면 서버는 공개 키를 통하여 암호화된 문제를 제공한다.
- 암호화된 문제를 개인 키를 통하여 해독한다. 해독된 결과를 서버에 제출한다.
- 서버는 제출된 결과와 문제를 만든 값을 비교하여 사용자의 인증을 수행한다.
이렇게 사용자가 만든 공개 키를 통하여 문제를 만들고, 사용자는 개인 키를 통해 문제를 해결하여 얻은 결과를 통하여 사용자를 인증하는 방식을 사용하면, 보안 유지와 사용 편리성에도 더욱 도움을 받을 수 있다.
따라서, 공개 키는 인터넷 세상(외부)에 떠돌아다녀도 상관이 없지만, 개인 키는 절대적으로 안전하게 보관해야한다!
추가적으로, 개인 키와 공개 키는 각자를 통해서 서로 유추될 수 없도록 생성되어야하는 것이 중요하다(이건 키 생성 패키지가 해주므로 걱정하지 말자).
정리
SSH는 원격 접속을 하기 위한 프로토콜을 한 종류이고, 클라우드 환경에서 자주 사용되는 방식이다.
다른 원격 접속 프로토콜(Telnet)에 비하여 갖는 장점은 전송되는 패킷이 암호화되어있어 통신 과정에서 보안성을 확보할 수 있다는 장점이 존재한다.
SSH을 사용하기 위해선 당연하게도 인증 절차가 필수적인데, 이를 위한 방법은 크게 1. 비밀번호 인증 방식과 2. Key 기반 인증 방식이 존재한다.
Key 기반 인증방식 중에서도 Key Pair 인증 방식을 주로 사용하게 되는데, Key Pair 인증 방식의 장점은 다음과 같다.
- 강력한 보안
- 비밀번호의 중복 사용 방지
- 편리한 접속
- 자동화와 스트립팅
기본적으로 사람이 직접 비밀번호를 입력해야하는 방식은 비밀번호 자체에 대한 취약성을 가질 수 밖에 없다(수백, 수천개의 서버를 비밀번호로..?).
추가적으로, 별도의 장치를 마련하지 않는다면, 비밀번호 인증 방식은 무차별 대입 공격에 대해 취약점을 가질 수 있다.
Key Pair 방식의 중요한 장점으로는 편리하게 접속이 가능해지고, 이를 통하여 자동화를 수행할 수 있는 기반을 마련할 수 있다는 점이다.
Key Pair 인증을 통해 비밀번호를 입력하지 않아도 원격 서버에 자동으로 접속이 가능해지고, 스크립트 기반으로 SSH 접속 및 명령 실행이 가능해진다!
추가로 현재는 클라이언트가 Key Pair를 생성하고 서버에게 공개 키를 전달하는 구조를 살펴보았지만, 서버에서 Key Pair를 생성하여 인증하는 구조 또한 생성할 수 있다. 이 부분에 대해서는 나중에 살펴보겠다.