
프라이빗 서브넷의 인스턴스 접근을 위해 일반적으로 Bastion host를 사용한다. 그러나 Bastion host는 오버헤드가 지나치게 크다거나, 보안상 부적절하다는 비판을 받는다. 과연 Bastion host가 부적절하기만 한 것일까? 아래에서 bastion host와 이의 대안을 함께 알아보자!
Bastion host는 프라이빗 서브넷의 인스턴스에 접근하기 위해 사용하는 인스턴스이다.
프라이빗 서브넷에 위치한 인스턴스는 퍼블릭 IP가 없어 직접 접근이 불가능하다. 따라서 퍼블릭 IP를 가진 인스턴스에 직접 접근하고, 이를 통해 프라이빗 서브넷의 인스턴스에 접근해야 한다. 이 인스턴스가 바로 Bastion host이다. Bastion host에 접근 후 이를 경유해 프라이빗 서브넷의 인스턴스에 접근한다.
구축하기 매우 쉽다! 아래의 과정만 진행하면 된다.
키페어 설정, 퍼블릭 서브넷 위치, 퍼블릭 IP 할당 설정이 필요하다. 이 외의 설정(OS, 인스턴스 유형 등)은 자유롭게 설정 가능하다.
NAT Instance를 Bastion host로도 사용 가능하다. NAT Instance에 아래의 설정(보안그룹, 키페어 전송)을 동일하게 진행하면 된다.
아래의 인바운드 규칙을 보안그룹에 추가하자.
위 규칙을 적용했는데 Bastion host 접속이 안된다면, 소스를 사용자 지정으로, IP를 0.0.0.0/0으로 설정하자. 모든 ssh 접근을 허용하므로 보안상 권장하는 설정은 아니다.
아래의 인바운드 규칙을 보안그룹에 추가하자. 이 규칙은 SSH 포트에 들어온 요청 중 Bastion host로부터 들어온 트래픽만 허용한다는 의미이다.
Bastion host에 scp 명령어를 사용해 프라이빗 서브넷 인스턴스의 ssh 키 파일을 전달한다.
scp -i "[인증 keypair 경로]" "[전송할 파일 경로]" [사용자 이름]@[ip 주소]:[파일 저장 경로]
scp -i "C:\Users\a-keypair.pem" "C:\Users\b-keypair.pem" ec2-user@x.x.x.x:/home/ec2-user/
a-keypair.pem로 사용자명이 ec2-user인 x.x.x.x 프라이빗 IP를 가진 인스턴스를 인증한다.b-keypair.pem라는 파일을 로컬에서 전송해 /home/ec2-user/ 경로에 저장하겠다는 뜻이다.키페어를 Bastion host에서 받은 후, 아래의 명령어를 입력해 키페어 파일의 사용 권한을 제한한다.
chmod 400 [키페어 저장 경로]
이제 bastion host를 사용해 인스턴스에 접속해보자. 먼저 EC2 인스턴스에서 연결을 누르고 bastion host에 접속한다. ssh 명령어를 사용해 cmd에서 접속해도 되고, AWS 콘솔에서 접속해도 된다.
접속한 bastion host에서 ssh 명령어를 입력해 프라이빗 인스턴스로 접속하면 된다.
만약 접속되지 않는다면 보안그룹 설정을 다시 확인하자.
bastion host 용도로만 사용하는 것보다는 다른 용도(NAT 등)와 함께 사용하는 쪽이 좋아보인다.
VPC 설정
EC2
AmazonEC2RoleforSSM 정책을 추가한다.VPC 엔드포인트 보안그룹 생성
VPC 엔드포인트 생성
com.amazonaws.[region].ssmcom.amazonaws.[region].ssmmessagescom.amazonaws.[region].ec2messages
인스턴스 연결에서 Session Manager 연결이 가능한 것을 확인할 수 있다.
VPC 엔드포인트 보안그룹 생성
접속 인스턴스 보안그룹 설정
VPC 엔드포인트 생성
인스턴스 연결에서 Session Manager 연결이 가능한 것을 확인할 수 있다. 사용자 이름은 root 말고 사용하는 ami에서 정의한 사용자 이름으로 변경하자.
만약 콘솔 접속에서 오류가 발생한다면, aws-cli를 사용해 접속하자.
aws ec2-instance-connect ssh --instance-id [인스턴스 id] --connection-type eice
만약 위 명령어에서 키페어 관련 오류가 발생한다면, 키페어 파일경로를 지정하는 아래의 명령어를 사용해 접속하자.
aws ec2-instance-connect ssh --instance-id [인스턴스 id] --private-key-file [keypair 파일 경로]
VPC Cloudshell 보안그룹 생성하기
접속 인스턴스 보안그룹 설정
VPC Cloudshell 생성하기



모두 사용해본 결과, 다음과 같은 결론을 내릴 수 있었다.
단순 학습용 아키텍처를 구축하는 경우 instance connect endpoint를 적극 추천한다!
nat instance를 사용하는 경우, nat 겸 bastion host로 사용하는 것을 추천한다. 무조건 부적절하다고 하기보다는 프로젝트의 현재 상황에 맞게 적절한 방법을 선택해 사용하자.