[AWS] 공인IP 없이 SSH접속 방법 – EC2 인스턴스 커넥트 엔드포인트 사용

현대화된 시스템은 주로 서버리스로 구성을 하게 되어, 인스턴스에 쉘 로그인을 하는 비중이 점점 작아지고 있습니다. 그래서 좀 더 간편하게 쉘 로그인하는 방법들이 나오고 있습니다. 전통적으로는 VPN을 사용하는 방법이 가장 편리하고 안전하지만 VPN을 구성하는 과정과 비용이 부담되고, 배스천호스트는 구성은 간단하지만 그 호스트를 관리해야 하는 부담과 VPN보다는 다소 불편한 단점이 있습니다. AWS에서 최근에 출시한 EC2 Instance Connect Endpoint(이하 EIC엔드포인트)는 이러한 단점들을 해소하고 고유의 장점을 가지고 있어서 매우 고무적입니다.

이번 글에서는 EIC엔드포인트를 구성하여 프라이빗 서브넷에 배치된 EC2와 RDS에 공인IP 없이 SSH/MySQL접속하는 방법을 소개해 드립니다.

들어가기 전에

본 기능 구성에 필요한 EIC엔드포인트는 비용이 발생하지 않는 리소스입니다.
일반적으로 VPC 엔드포인트는 약 $10/월 비용이 발생하지만, 예외로 EIC엔드포인트와 S3 Gateway용 엔드포인트는 비용이 발생하지 않습니다.

기본 개념

기본 구성도는 아래와 같습니다. 프라이빗 서브넷에 있는 EC2가, 좌측에서는 배스천호스트를 통해 접속하는 구성이고, 우측은 EIC엔드포인트를 통해 접속하는 구성입니다.

배스천호스트를 통한 연결 구성

EC2 Instance Connect Endpoint를 통한 연결 구성

좌측의 구성에서는 배스천호스트의 공인IP를 통해 VPC 서브넷 내부의 인스턴스에 접근하는 모습입니다. 우측은 EIC엔드포인트에 공인IP가 아닌 AWS의 IAM인증을 통해 VPC 서브넷 내부의 인스턴스에 접근하는 구성입니다.

구성하기

1. VPC/Subnet 구성

VPC와 EIC를 배치할 서브넷 그리고 접속해볼 인스턴스를 생성할 서브넷 이렇게 최소한 두개의 서브넷이 필요합니다. 두 서브넷은 VPC외부로 라우팅 되지 않는 프라이빗 서브넷도 됩니다.

2. EC2 Instance Connect Endpoint 생성

VPC > 엔드포인트 > 엔드포인트 생성 페이지에서 아래와 같이 EIC엔드포인트를 선택하고 배치할 VPC, 서브넷, 보안그룹을 선택하여 생성합니다.
EIC엔드포인트의 보안그룹은 인바운드 룰은 비어있어도 됩니다. 하지만 아웃바운드 룰은 모두 허용하거나 접속할 서브넷의 CIDR만으로 제한할 수 있습니다. EIC엔드포인트 보안그룹을 전용으로 생성하는것을 권장합니다. EIC엔드포인트를 배치할 서브넷은 프라이빗 서브넷이어도 상관없습니다.
구성이 완료되기까지 수 분이 소요됩니다.

3. 인스턴스 보안그룹

접속을 테스트 할 인스턴스의 보안그룹을 미리 생성합니다.
인바운드 룰에 엔드포인트의 보안그룹을 허용해 줍니다. EIC엔드포인트가 배치된 서브넷의 CIDR도 허용해 줍니다.
그리고, 생성 시 옵션 항목에서 "Preserv Client IP"를 활성화했다면 클라이언트의 IP도 허용해 주어야겠습니다.

4. EC2 인스턴스 생성

접속을 테스트해 볼 수 있는 EC2를 생성합니다.
외부 네트워크와 단절되어 있는 프라이빗 서브넷을 만들고 여기에 작은 타입의 EC2를 생성하여 배치합니다. 공인IP는 활성화하지 않습니다. 위에서 미리 생성한 보안그룹을 적용합니다.
키페어 없이 EIC엔드포인트로 연결을 할 수 있는 인스턴스는 아래와 같습니다. (AWS 문서에는 언급되지 않으나 EC2 Instance Connect 패키지가 설치되어 있어야 합니다!)

EC2 Instance Connect는 다음 AMI에 사전 설치되어 제공됩니다.
– Amazon Linux 2 2.0.20190618 이상
– 우분투 20.04 이상
다음 AMI를 사용하여 시작된 인스턴스에 EC2 Instance Connect를 설치할 수 있습니다.
– Amazon Linux 2(모든 버전)
– 우분투 16.04 이상

접속 테스트

이제 EC2 > 인스턴스 > [선택 체크] > 연결 > 을 선택하여 아래와 같이 EC2 인스턴스 연결 탭에서 "EC2 인스턴스 연결 엔드포인트를 사용하여 연결"을 선택 후 "EC2 인스턴스 연결 엔드포인트"에서 위에서 생성한 EIC엔드포인트를 선택하고 연결을 테스트 해 봅니다.

새 탭이 열리면서 검정바탕의 웹터미널에서 ssh 접속이 되는 것을 확인할 수 있습니다. 여기서 주목할 점은 연결 과정에서 키페어를 필요로 하지 않았다는 것입니다. 이것은 EIC엔드포인트의 서비스가 내부 동작으로 임시 키페어를 발급하여서 접속할 인스턴스에 넣어주기 때문입니다. 이 블로그의 다른 글에서 소개하였던 Systems Manager도 키페어 없이 인스턴스에 접속하는데 이것은 sshd가 아닌 Systems Manager Agent를 통해서 다른 방식으로 인증을 처리하여 연결되기 때문입니다.

여기까지 단일 인스턴스에 대한 EIC엔드포인트를 통한 간단한 연결을 해 보았습니다.
그런데, 여러 인스턴스에 MobaXterm이나 Putty 등 터미널 프로그램을 사용하여 접속하는 환경을 구성해야 할 필요도 있을 것입니다.

터널링을 통해 연결하기

EIC엔드포인트는 VPC 내부의 인스턴스로의 터널링을 생성할 수 있습니다.
다음은 이 기능을 사용하여 다수의 EC2 인스턴스뿐만 아니라 RDS에 대한 접속을 구성하는 방법을 설명하겠습니다.

1. IAM 사용자

먼저, EIC터널링 전용 IAM 사용자를 따로 만들기를 권장합니다. 마치 VPN 계정과 같이 터널링만을 위한 사용자입니다.
이 사용자는 AWS API의 Access Key로 EIC엔드포인트에 접근하여 터널을 오픈할 수 있도록 최소한의 필수적인 권한만 부여합니다.
우선, 아래 내용으로 IAM 정책을 만듭니다(예: ec2-instance-connect-opentunnel-role)

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EC2InstanceConnect",
            "Action": "ec2-instance-connect:OpenTunnel",
            "Effect": "Allow",
            "Resource": "arn:aws:ec2:*:*:instance-connect-endpoint/eice-*
        },
        {
            "Sid": "Describe",
            "Action": [
            "ec2:DescribeInstances",
            "ec2:DescribeInstanceConnectEndpoints"
            ],
        "Effect": "Allow",
        "Resource": "*"
        }
    ]
}

IAM 사용자(예: ec2-connect-api)는 AWS API로만 사용할 것이므로 AWS콘솔 엑세스는 비활성화하고 위에서 만든 정책을 선택하여 만들어 줍니다.

조직에 터널링을 사용하여 접속할 관리자가 다수인 경우는 IAM그룹을 먼저 구성하고 동일 그룹으로 여러 IAM 사용자를 발급해주면 좋습니다.
마지막으로, IAM 사용자의 보안자격증명 탭에서 엑세스키를 발급합니다. 이 때 발급받은 시크릿 엑세스키는 한번만 볼 수 있으므로 잘 다운받아 둡니다.

2. AWS CLI 설정

AWS CLI를 사용하여 터널링을 생성하기 위해 피시에 아래 링크의 설치파일을 다운받고 설치합니다.
Installing or updating the latest version of the AWS CLI
기존에 설치가 되어 있다면 버전이 2.12.x 이상 버전이어야 합니다.
아래와 같이 버전을 확인하고, aws configure 명령을 실행하여 위에서 발급받은 엑세스키와 시크릿 엑세스키를 저장합니다

C:\>aws –version
aws-cli/2.12.2 Python/3.11.4 Windows/10 exe/AMD64 prompt/off

C:\>aws configure
> aws configure
AWS Access Key ID []: AKIASDLK5TPHJFLKDJRV
AWS Secret Access Key []: JFLGMDLJKFLFGKFkfjslfmvldjfldjfKJFLFJVLe
Default region name [ap-northeast-2]:
Default output format [json]:

AWS CLI에서 여러 개의 엑세스키를 사용하고 있다면 아래와 같이 ec2-connect 전용 프로필을 지정하여 저장 및 사용할 수 있습니다.

C:\> aws –profile ec2-connect configure

설정파일 직접 편집:
C:\> notepad %HOMEPATH%\.aws\config
C:\> notepad %HOMEPATH%\.aws\credentials

3. 터널링 실행 및 접속

open-tunnel 명령은 지정한 EIC엔드포인트로 localhost: 2201 => [인스턴스]:22로 터널링을 만들어줍니다.
아래 명령으로 터널링을 실행하고 접속을 할 수 있습니다.

C:\> aws ec2-instance-connect open-tunnel –instance-connect-endpoint-id eice-02328748jhfdjhfcd –remote-port 22 –local-port 2201 –instance-id i-007dfgflkg846949f

C\> ssh -i mykey.pem ec2-user@localhost -p 2201

실제 실행 결과는 아래와 같습니다.

하나가 아닌 여러 인스턴스에 대한 연결이 필요하다면 아래처럼 인스턴스 별 포트를 다르게 매핑하여 터널링을 실행합니다.

[mysystem-db]
aws ec2-instance-connect open-tunnel –instance-connect-endpoint-id eice-75aaf136023b924cd –remote-port 3306 –local-port 33061 –private-ip-address 10.0.0.10

[mysystem-web01]
aws ec2-instance-connect open-tunnel –instance-connect-endpoint-id eice-75aaf136023b924cd –remote-port 22 –local-port 2201 –instance-id i-007c3faa734d6595f

[mysystem-was01]
aws ec2-instance-connect open-tunnel –instance-connect-endpoint-id eice-75aaf1369023b24cd –remote-port 22 –local-port 2202 –instance-id i-09357ac6cc2c7002b

주의! EC2 인스턴스는 instance-id로 지정할 수 있지만, RDS는 RDS의 사설아이피를 조회하여 private-ip-address로 지정해야 합니다.

맺음말

이상으로 EIC엔드포인트를 사용하여, AWS 콘솔에서 간단히 EC2에 접속하거나 터널링을 통해 한 개 혹은 다수의 EC2나 RDS에 대한 연결 방법을 설명 드렸습니다. 이 방법이 다소 번거롭게 느껴질 수도 있겠으나 배스천호스트에 대한 관리부담과 VPN 비용 이 두가지 문제를 동시에 해결할 수 있는 훌륭한 대안이라고 생각합니다.