AWS를 처음 시작하면 일반적으로 EC2를 가장 먼저 배포하게 되고, 그 위에서 작업을 시작하게 됩니다. On Premise에서는 개인 키 (Private Key)를 사용하든지 사용자 이름과 암호를 사용하여 로그인을 할 수 있었습니다. 그러나 AWS에서는 기본적으로 개인 키를 사용하도록 설정되어 있습니다.

이런 상황에서 VPC와 서브넷 구성, 그리고 보안 그룹에 따라서 EC2에 바로 연결이 될 수도, 안될 수도 있습니다. 이번 글에서는 EC2에 개인 키로 SSH 연결하기 위해서 네트워크와 보안 설정을 어떻게 해야 하는지 살펴본 후에 SSH 연결 방법을 알아보도록 하겠습니다.

VPC와 서브넷

Public 서브넷

개인적으로 AWS에 가입하여 계정을 생성하게 되면, 별도의 요청이 없어도 기본 VPC와 기본 서브넷이 하나씩 존재합니다. 이 때, 서브넷은 Public이라서 서브넷에 배포되는 EC2는 공인 아이피를 할당받게 됩니다. 그러면 네트워크의 별도 설정이 없어도 보안 그룹의 소스에 로컬 컴퓨터의 CIDR 블럭을 입력하고 SSH 프로토콜을 지정하면 곧바로 EC2의 공인 아이피를 통해서 SSH 연결이 가능합니다.

EC2에 공인 아이피로 접근하려면 외부에서 접근할 때에도 공인 아이피를 소스로 추가해야 합니다.

Private 서브넷

보안을 위해서 Public이 아닌 Private 서브넷에 EC2를 생성한다면, 공인 아이피를 통해서 SSH 연결을 할 수가 없습니다. 이 때는 현재 내 아이피가 AWS에 VPN (Virtual Private Network)으로 연결되어 있으면 사설 아이피를 통해서 SSH를 연결하면 됩니다. VPN과 AWS의 라우팅 테이블에서 적절한 라우팅 설정이 되어 있어야만 합니다.

만약, AWS의 VPC와 전혀 상관 없는 장소에서 접근을 하려고 한다면 직접적인 연결은 불가능하므로 우회를 위한 Bastion Host를 이용해야 합니다. 사전에 Public 서브넷에 Bastion용 EC2를 생성해놓고 Bastion에서 Private 서브넷의 EC2로 접근 가능하도록 보안 그룹을 추가합니다. Bastion에는 로컬 컴퓨터의 공인 아이피를 허용하도록 하면, 로컬 컴퓨터에서 Bastion Host를 거쳐 Private EC2로 SSH 연결이 가능해집니다.

PEM 키로 SSH 연결하기

AWS에서는 기본적으로 PEM 형태의 개인 키를 제공합니다. EC2를 생성하면서 제일 마지막에 새 키 페어 생성을 통해서 개인 키 파일을 생성할 수 있습니다.

신규 키 페어를 생성합니다.

해당 키 파일을 적절한 위치에 넣고 SSH 클라이언트를 통해서 EC2에 접속하면 됩니다. 저는 개인적으로 OpenSSH를 선호하므로 아래와 같이 명령어를 입력하여 EC2에 접속할 수 있습니다. Windows에서는 Git Bash를 이용하면 됩니다.

ssh <username>@<host> -i <key_path>

Last login: Thu Oct 15 10:46:15 2020 from *****

__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
[<username>@<host> ~]$

Code language: Bash (bash)

PPK 키로 SSH 연결하기

PuTTY처럼 별도의 SSH 클라이언트를 이용하려면 PPK 개인 키가 필요합니다. PEM 키를 PuTTYgen을 통해서 PPK 키로 변환할 수 있습니다.

File > Load Private Key > All Files (*)를 통해서 PEM 파일을 볼 수 있습니다.

PEM 개인 키 파일을 Load 한 다음에 Save Private Key를 눌러 PPK 개인 키 파일을 생성합니다. 그 후에, PuTTY를 실행합니다. HostName은 <username>@<host>, 키 파일은 Connection > SSH > Auth 에서 경로를 지정하면 됩니다. 이 상태로 Session 탭으로 돌아가서 Open을 누르면 정상적으로 연결됨을 확인할 수 있습니다.

Check List

접속에 실패한 경우에는 다음 순서대로 문제를 확인해보시기 바랍니다.

  • 보안 그룹에서 22 포트의 소스 CIDR 블럭에 내 아이피가 포함되었습니다.
  • VPC에 인터넷 게이트웨이가 정상적으로 연결되어 있습니다.
  • 서브넷이 Public 입니다.
  • 서브넷이 Private인 경우에는 Bastion Host를 통해서 SSH 연결을 수행중입니다.
    • SSH 연결을 2회 수행하거나, SSH 터널을 이용합니다.
  • 키 파일이 EC2에 정상적으로 할당되어 있습니다.
  • PEM 키를 PPK로 적절하게 변환을 하였습니다.

AWS 계정 설정 초기 단계에서는 특별히 문제가 없겠지만, 별도로 서브넷을 구축하다 보면 Private 설정을 하게 되거나 보안 그룹의 미비로 연결이 되지 않는 경우가 많이 발생합니다. 꼼꼼하게 SSH 관련 설정을 살펴보시는 것이 좋습니다.

문제점

개인 키를 사용하여 EC2에 SSH 연결하는 것은 사용자 계정과 암호를 이용하는 것보다 안전해 보입니다. 그러나 이 방법은 굉장히 초보적이고 여전히 많은 문제점들이 산재하고 있습니다.

  • 개인 키를 공유하게 되면 누가 접속했는지 파악하기 어렵습니다.
  • 개인 키를 분실하게 되면 EC2 접속이 불가능합니다.
    • EC2의 이미지를 생성하여 EC2를 재배포함으로써 해결은 가능합니다.
  • 개인 키의 사용 여부 파악이 어려워서 AWS에서의 키 페어 관리가 어렵습니다.
  • 개인 키 파일 자체가 해킹될 수 있습니다.

이러한 문제점들을 보안한 방법은 당연히 존재합니다. 다음 글에서는 AWS의 IAM (Identity & Access Manager)을 통해서 좀 더 고급지게 EC2에 SSH 연결하는 방법을 알아보도록 하고, 위에서 언급한 문제점들이 어떻게 해결/관리 가능한지 살펴보겠습니다.