본문 바로가기
Infra

private subnet에 위치한 인스턴스에 안전하게 접근하기 (feat. Bastion host)

by CodingMasterLSW 2025. 7. 19.

 

개발자는 위와 같이 private subnet에 접근할 수 없다. 애초에 private subnet에 위치한 ec2 instance는 private IP 주소로 접근해야 하기 때문이다. 그렇다면 어떻게 접근할 수 있을까? 필자가 알아본 방법으로는 크게 두 가지로 나뉜다.

 

1) Bastion Host

EC2 instance를 public subnet에 두고, 해당 인스턴스를 통해 private subnet에 위치한 EC2 instance로 접근하는 방법이다. private subnet에 접근하기 위한 EC2 instance를 bastion host라고 부른다. 하단의 그림을 보면, 이해가 훨씬 쉬울 것이다.

 

Pem 키는 어디에 둬야 할까?

 

고민을 많이 했던 부분이다.  Bastion Host Instance 내부에 pem 키를 설정해 놓으면, private subnet에 편하게 접근할 수 있다. 하지만 공개적인 public subnet에 띄워진 instance에 pem키를 등록해 놓는다면, 운영 서버가 private subnet에 위치하는 게 의미 없다고 생각했다.

 

방법을 찾던 중, SSH Agent Forwarding라는 키워드를 발견했다.

 

SSH Agent Forwarding은 사용자의 로컬 SSH 에이전트에 저장된 인증 키를, 중간 서버(Bastion, Jump Host 등)를 거쳐 최종 대상 서버까지 전달하여 인증에 사용하는 기능이다. 간단하게 설명하자면 중간 서버에 개인 키를 복사하지 않고도, 그 서버를 통해 다른 서버에 접속할 수 있도록 도와준다.

 

이제, SSH Agent Forwarding + Bastion Host를 통해 private subnet에 접근하는 흐름을 이해해 보자. 

 

step1) SSH agent를 실행시킨다.

eval $(ssh-agent -s)

 

 

step2) pem 키를 등록한다.

ssh-add ~/경로/{본인 keypair.pem}

 

 

add 하는 과정에서 권한 오류가 발생할 수 있다.

Permissions 0644 for {본인 keypair.pem} are too open.

 

 

이 경우에 파일의 권한이 너무 열려있어서 등록이 안 되는 경우이므로, chmod 600으로 변경해 주자.

 

 

step3) Bastion Host에 접속한다.

ssh -A -i {bastion-host keypair.pem} {bastion ec2 instance 주소}

 

주의점 : -A 옵션을 꼭 넣어줘야 agent forwarding이 활성화가 된다.

 

 

 

step4) private subnet에 위치한 EC2 instance에 접속한다.

ssh ubuntu@<private-ec2-private-ip>

2) Session Manager

SSM Agent는 EC2 인스턴스 내에서 실행되며, AWS Systems Manager 서비스와 HTTPS 통신을 통해 명령을 받아 실행한다. SSH 접속과 달리 외부에서 접속하는 게 아니라, 내부 Agent가 AWS와 연결하는 구조다.

화살표를 잘 살펴보면 AWS System Manager -> EC2로 요청이 가는 것이 아니라, EC2 -> AWS System Manager로 요청이 간다.

즉, SSM 방식은 AWS System Manager에서 EC2로 인바운드 요청을 보내는 것이 아닌, Polling 방식을 통해 EC2 -> AWS System Manager에게 작업 있냐고 물어보는 형식이다. (최근에 공부한 self-hosted runner와 같은 방식!)

 

단, 해당 기능을 사용하려면 NAT Gateway를 사용하거나, VPC Endpoint를 사용해야 한다. private subnet에 구축해 놓은 시점부터 NAT Gateway는 필요하다고 생각한다. 그리고 무엇보다 우테코에서 NAT Gateway를 제공해 주기 때문에 SSM 방식을 사용 안 할 이유가 없어 보인다.


어떤 게 더 좋아 보여?

ssm 방식이 더 좋아 보인다.

1) pem키를 개별로 관리를 할 필요가 없다.

2) ssh 포트를 막아놓을 수 있다.

 

보안적으로도, 편리성 측면에서도 ssm이 더 좋아 보이지만 우선은 bastion host를 선택했다.

 

이유: ssm 방식을 사용하려면 AmazonSSMManagedInstanceCore 권한을 가진 IAM 역할이 필요한데, 현재 나에게 권한이 없다. 코치님께 문의를 해놨으니, 만약 해당 권한을 가진 IAM을 만들어주신다면 SSM으로 변경할 예정이다.