AWS Systems Manager를 통해 SSH 터널을 사용하여 프라이빗 VPC 리소스에 액세스하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2021년 3월 24일

AWS Systems Manager를 통해 SSH 터널을 사용하여 프라이빗 VPC 리소스에 액세스하려고 합니다. 어떻게 해야 하나요?

간략한 설명

AWS Systems Manager 세션 관리자는 Systems Manager 인프라를 사용하여 인스턴스에 SSH와 같은 세션을 생성합니다. 세션 관리자는 실제 SSH 연결을 터널링하므로 로컬 시스템에서 직접 Virtual Private Cloud(VPC) 내의 다른 리소스로 터널링할 수 있습니다. 생성한 관리형 인스턴스는 AWS 리소스에 대한 배스천 호스트 또는 게이트웨이 역할을 합니다. 이 구성의 이점은 다음과 같습니다.

  • 보안 강화: 이 구성은 1개의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스(배스천 호스트)만 사용하여 아웃바운드 포트 443을 Systems Manager 인프라에 연결합니다. 이렇게 하면 인바운드 연결 없이 세션 관리자를 사용할 수 있습니다. 로컬 리소스는 배스천 호스트 역할을 하는 인스턴스의 인바운드 트래픽만 허용해야 합니다. 따라서 인바운드 규칙을 공개적으로 열 필요가 없습니다.
  • 사용 편의성: 로컬 시스템에서 프라이빗 VPC의 리소스에 직접 액세스할 수 있습니다.

참고: Systems Manager를 사용하여 터미널 또는 단일 포트 전달을 통해 EC2 인스턴스에 액세스하는 방법에 대한 지침은 세션 관리자 설정하기를 참조하세요.

사전 조건

세션 관리자 사전 조건 완료

AWS 명령줄 인터페이스(AWS CLI)용 세션 관리자 플러그인 설치

세션 관리자를 통해 SSH 연결을 사용하도록 설정하고 SSH 연결 요구 사항이 충족되는지 확인합니다.

참고: SSH 기능을 사용하려면 다음을 설치해야 합니다.

1.    AWS Systems Manager Agent(SSM Agent) v2.3.672.0 이상.

2.    로컬 시스템의 세션 관리자 플러그인 v1.1.23 이상.

3.    로컬 시스템의 AWS CLI v1.16.12 이상.

해결 방법

세션 관리자를 사용하여 SSH 터널을 시작하려면 다음과 같이 합니다.

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.

1.    다음 명령을 실행하여 SSH 터널을 시작합니다.

ssh -i /path/my-key-pair.pem username@instance-id -L localport:targethost:destport

2.    다음 명령을 실행하여 1단계에서 생성한 대상 포트에서 터널에 대한 액세스를 테스트합니다.

telnet 127.0.0.1 localport

앞의 예제에서 127.0.0.1localporttargethost: destport에 액세스하도록 변환됩니다.

구성 예제

시나리오 1

로컬 시스템에서 터널을 생성하고 SSM 호스트를 배스천 호스트로 사용하여 EC2 인스턴스에서 실행 중인 MySQL 데이터베이스에 액세스합니다.

사용된 리소스

instance1: 배스천 호스트 역할을 하고 AWS Systems Manager에서 관리하는 EC2 인스턴스.

    Hostname = ec2-198-51-100-1.compute-1.amazonaws.com Instance id = i-0123456789abcdefa

instance2: 기본 포트 3306에서 MySQL 데이터베이스를 실행하는 EC2 인스턴스.

    Hostname = ec2-198-51-100-2.compute-1.amazonaws.com

안내

1.    로컬 시스템(예: 노트북)에서 SSH 명령을 실행하고 세션 관리자 기반 SSH를 사용하여 instance1에 연결합니다. 이 명령은 instance2의 포트 3306에 대한 터널을 설정하여 포트 9090의 로컬 시스템에 제공합니다.

ssh -i /path/key-pair_instance1.pem username_of_instance1@i-0123456789abcdefa -L 9090:ec2-198-51-100-2.compute-1.amazonaws.com:3306

참고: 앞의 예제에서 포트 9090은 로컬 시스템에서 사용할 수 있습니다.

2.    로컬 시스템에서 1단계에서 사용한 사용 가능 포트(이 예에서는 9090)를 사용하여 데이터베이스에 액세스합니다.

mysql -u user -h 127.0.0.1 -P 9090 -p password

중요: instance2에 존재하는 보안 그룹, 네트워크 액세스 제어 목록(ACL), 보안 규칙 또는 타사 보안 소프트웨어는 instance1으로부터의 트래픽을 허용해야 합니다. 앞의 예제에서 instance2instance1에서 포트 3306 액세스를 허용해야 합니다.

시나리오 2

로컬 시스템에서 다음으로 단일 SSH 연결을 통해 3개의 터널을 생성합니다.

  • instance1의 SSH 포트에 연결
  • RDS 인스턴스의 MySQL 데이터베이스에 액세스
  • instance3의 웹 서버에 액세스

사용된 리소스

instance1: 배스천 호스트 역할을 하고 AWS Systems Manager에서 관리하는 EC2 인스턴스.

    Hostname = ec2-198-51-100-1.compute-1.amazonaws.com Instance id = i-0123456789abcdefa

RDS 인스턴스: 프라이빗 서브넷에 위치한 MySQL RDS 인스턴스

    Hostname = DBinstanceidentifier.abcdefg12345.region.rds.amazonaws.com

instance3: 프라이빗 서브넷에 위치한 EC2 인스턴스

    Hostname = ec2-198-51-100-3.compute-3.amazonaws.com

안내

1.    SSH 명령을 사용하여 3개의 터널로 세션을 시작합니다.

참고: 이 명령에는 세 가지 터널 호출이 있습니다.

ssh -i /path/key-pair_instance1.pem username_of_instance1@i-0123456789abcdefa -L 8080:ec2-198-51-100-1.compute-1.amazonaws.com:22 -L 9090:DBinstanceidentifier.abcdefg12345.region.rds.amazonaws.com:3306 -L 9091:ec2-198-51-100-3.compute-1.amazonaws.com:80

참고: 이전 예제에서 포트 8080, 9090 및 9091은 로컬 시스템에서 사용할 수 있습니다.

2.    로컬 시스템에서 instance1로 SSH에 액세스합니다. 로컬 포트 8080은 instance1의 SSH 포트(22)로 터널링됩니다. key-pairusername은 터널링할 인스턴스용입니다(이 예제에서는 instance1).

ssh -i /path/key-pair_instance1.pem username_of_instance1@127.0.0.1 -p 8080

3.    RDS 인스턴스의 데이터베이스에 액세스합니다. 로컬 포트 9090은 RDS 인스턴스의 포트 3306으로 터널링됩니다. GUI를 통해 호스트 이름 127.0.0.1, 포트 9090으로 DB 서버에 액세스할 수 있는 MySQL 워크벤치를 사용할 수 있습니다. 또는 셸 명령 프롬프트에서 다음 명령을 실행합니다.

mysql -u user -h 127.0.0.1 -P 9090 -p password

4.    로컬 시스템에서 instance3의 웹 사이트에 액세스하려면 브라우저를 열고 웹 사이트로 이동합니다.

http://127.0.0.1:9091

중요: RDS 인스턴스instance3에 존재하는 보안 그룹, 네트워크 ACL, 보안 규칙 또는 타사 보안 소프트웨어는 instance1으로부터의 트래픽을 허용해야 합니다. 앞의 예제에서 instance3 instance1에서 포트 80 액세스를 허용해야 합니다.