AWS Systems Manager를 통해 SSH 터널을 사용하여 프라이빗 Amazon Virtual Private Cloud(VPC) 리소스에 액세스하고 싶습니다.
간략한 설명
SSH 터널링 또는 SSH 포트 전달은 암호화된 SSH 연결을 통해 데이터를 전송하는 방법입니다. SSH 터널을 사용하면 로컬 포트에 대한 연결을 보안 채널을 통해 원격 시스템으로 전달할 수 있습니다. SSH 터널을 만들려면 Session Manager를 사용하세요. Session Manager는 원격 호스트에 포트 전달을 사용할 수 있게 해주는 AWS Systems Manager의 기능입니다. 이 기능은 SSM Agent 버전 3.1.1374.0 이상에서 지원됩니다. 포트 전달은 다음 단계의 대안입니다. 자세한 내용은 세션 시작(원격 호스트에 포트 전달)을 참조하세요.
Session Manager는 Systems Manager 인프라를 사용하여 SSH와 유사한 인스턴스로 세션을 생성합니다. Session Manager는 실제 SSH 연결을 터널링하므로 로컬 머신에서 직접 Amazon VPC 내의 다른 리소스로 터널링할 수 있습니다. 생성한 관리형 인스턴스는 AWS 리소스의 Bastion 호스트 또는 게이트웨이 역할을 합니다.
이 구성의 이점은 다음과 같습니다.
- 보안 강화: 이 구성은 하나의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스(Bastion 호스트)를 사용하며 아웃바운드 포트 443을 Systems Manager 인프라에 연결합니다. 이렇게 하면 인바운드 연결 없이 Session Manager를 사용할 수 있습니다. 로컬 리소스는 Bastion 호스트 역할을 하는 인스턴스의 인바운드 트래픽만 허용해야 합니다. 이렇게 하면 인바운드 규칙을 공개적으로 열 필요가 없습니다.
- 사용 편의성: 로컬 머신에서 프라이빗 VPC의 리소스에 직접 액세스하세요.
참고: 터미널 또는 단일 포트 전달을 사용하여 EC2 인스턴스에 액세스하는 방법에 대한 지침은 Session Manager 설정을 참조하세요.
사전 조건
다음 전제 조건을 완료하세요.
참고: SSH 기능을 사용하려면 다음이 설치되어 있어야 합니다.
- SSM Agent v2.3.672.0 이상
- 로컬 머신의 Session Manager 플러그인 v1.1.23 이상
- 로컬 머신의 AWS CLI v1.16.12 이상
해결 방법
참고: AWS CLI 명령을 실행할 때 오류가 발생하면 최신 버전의 AWS CLI를 사용하고 있는지 확인하세요.
Session Manager를 사용하여 SSH 터널을 시작하려면 다음 단계를 완료하세요.
1. 다음 명령을 실행하여 SSH 터널을 시작합니다.
ssh -i /path/my-key-pair.pem username@instance-id -L localport:targethost:destport
2. 다음 명령을 실행하여 생성한 대상 포트의 터널에 대한 액세스를 테스트합니다.
telnet 127.0.0.1 localport
위 예시에서 127.0.0.1 및 localport는 targethost:destport에 액세스하도록 변환됩니다.
구성 예시: SSM 호스트를 Bastion 호스트로 사용하여 로컬 머신에서 MySQL 데이터베이스로 터널을 생성합니다.
로컬 머신에서 터널을 생성하여 MySQL 데이터베이스에 액세스합니다. 데이터베이스는 EC2 인스턴스에서 실행되고 SSM 호스트를 Bastion 호스트로 사용해야 합니다.
사용된 리소스
instance1: Bastion 호스트 역할을 하며 AWS Systems Manager에서 관리되는 EC2 인스턴스
호스트 이름 = ec2-198-51-100-1.compute-1.amazonaws.com, 인스턴스 ID = i-0123456789abcdefa
instance2: 기본 포트 3306에서 MySQL 데이터베이스를 실행하는 EC2 인스턴스
호스트 이름 = ec2-198-51-100-2.compute-1.amazonaws.com
1. 로컬 머신(예: 노트북)에서 다음 SSH 명령을 실행하여 instance1에 연결합니다. 이 명령은 Session Manager 기반 SSH를 사용하며 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는 instance1로부터의 트래픽을 허용해야 합니다. 여기에는 모든 보안 그룹, 네트워크 액세스 제어 목록(네트워크 ACL), 보안 규칙 및 instance2에 있는 타사 보안 소프트웨어가 포함됩니다. 위 예시에서 instance2는 instance1의 포트 3306 액세스를 허용해야 합니다.
구성 예시: 단일 SSH 연결을 통해 터널을 생성하여 MySQL 데이터베이스 및 웹 서버 인스턴스에 액세스
로컬 머신에서 단일 SSH 연결을 통해 다음과 같은 세 개의 터널을 생성합니다.
- instance1의 SSH 포트에 연결
- RDS 인스턴스의 MySQL 데이터베이스에 액세스
- instance3의 웹 서버에 액세스
사용된 리소스
instance1: Bastion 호스트 역할을 하며 AWS Systems Manager에서 관리되는 EC2 인스턴스
호스트 이름 = ec2-198-51-100-1.compute-1.amazonaws.com, 인스턴스 ID = i-0123456789abcdefa
**RDS 인스턴스: ** 프라이빗 서브넷에 위치한 MySQL RDS 인스턴스
호스트 이름 = DBinstanceidentifier.abcdefg12345.region.rds.amazonaws.com
instance3: 프라이빗 서브넷에 있는 EC2 인스턴스
호스트 이름 = ec2-198-51-100-3.compute-3.amazonaws.com
1. 다음 SSH 명령을 실행하여 세 개의 터널이 있는 세션을 시작합니다. 명령에는 세 개의 개별 터널 호출이 있습니다.
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-pair 및 username은 터널링하려는 인스턴스(이 예에서는 instance1)에 대한 것입니다.
ssh -i /path/key-pair_instance1.pem username_of_instance1@127.0.0.1 -p 8080
3. RDS 인스턴스의 데이터베이스에 액세스합니다. 로컬 포트 9090은 RDS 인스턴스의 포트 3306으로 터널링됩니다. MySQL 워크벤치의 GUI를 사용하여 127.0.0.1을 호스트 이름으로, 9090을 포트로 사용하여 DB 서버에 액세스할 수 있습니다. 또는 쉘 명령 프롬프트에서 다음 명령을 실행합니다.
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 액세스를 허용해야 합니다.
관련 정보
인터넷 게이트웨이 없이 Session Manager의 자동 구성
(GitHub 웹사이트의) session-manager-without-igw
선호하는 GUI를 사용하여 원격으로 Amazon RDS 또는 Amazon EC2 데이터베이스 인스턴스에 안전하게 연결
Systems Manager를 사용하여 인터넷에 액세스하지 않고도 프라이빗 EC2 인스턴스를 관리할 수 있도록 VPC 엔드포인트를 만들려면 어떻게 해야 하나요?