민프
[AWS] Bastion Host란 (feat. Private VPC, RDS) | ECS, EKS, EC2 VPC 보안을 지키는 관문 서버의 모든 것 본문
[AWS] Bastion Host란 (feat. Private VPC, RDS) | ECS, EKS, EC2 VPC 보안을 지키는 관문 서버의 모든 것
민프야 2025. 7. 3. 21:00Bastion Host에 대해서 알아보도록 하겠습니다.
1. Bastion Host란?
Bastion [ˈbæstiən]. "요새", "보루"를 뜻하는 영어 단어이다. 특히 성형 요새를 의미하는 모양이다.
그러나 자주 사용되지는 않고 이러한 의미로는 Fortress가 압도적으로 많이 쓰인다.
- 나무위키, 위키백과, 네이버 사전

Bastion Host는 Private Subnet에 위치한 리소스에 접근할 수 있도록 중간에 배치하는 ‘관문 서버’입니다.
외부 네트워크와 내부 네트워크 사이에서 SSH 또는 터널링을 통해 보안된 접근 경로를 제공합니다.
2. 왜 Bastion Host가 필요한가?
| 항목 | 일반적인 접근 | Bastion Host 사용 시 |
| RDS 보안 | 퍼블릭 IP 노출됨 | 퍼블릭 IP 없이 내부만 노출 |
| 보안그룹 설정 | IP 기반 접근 제한 | 보안 그룹 기반으로 접근 제어 |
| SSH 접속 | 모든 서버에 개별 허용 | Bastion 1곳만 SSH 허용 |
| 감사 로그 | 분산되어 관리 어려움 | Bastion에만 집중 가능 |
| 공격 표면 | 넓음 | 매우 좁아짐 |
즉, 보안성 향상 + 관리 편의성 두 마리 토끼를 잡는 구조입니다.
현재 저는 운영, 개발 DB가 나뉘어있고, 그에따른 각각의 ECS를 사용하고 있습니다.
개발은 pubilc으로 접근할 수 있도록 하였고,
운영은 private으로 적용하여서 DB 확인 시 Bastion EC2으로만 접근하여 작업을 하고 있습니다.
3. 작동 방식 (아키텍처 포함)
🧑💻 개발자 로컬 PC
│
│ (SSH 또는 SSM)
▼
🔐 Bastion Host (EC2, Public Subnet)
│
│ (VPC 내 통신)
▼
🛢️ Private RDS (MySQL 등, Private Subnet)
▲
│
▼
🚀 ECS (Fargate or EC2 기반, Private Subnet)
- Bastion Host EC2는 퍼블릭 서브넷에 배치되어 Public IP 보유
- RDS나 내부 EC2는 퍼블릭 접근이 전혀 없으며 오직 Bastion을 통해서만 접근 가능
- SSH 터널링을 통해 로컬 포트 -> 내부 리소스 포트로 안전하게 연결
- ECS -> 같은 VPC, 같은 Private Subnet(또는 다른 AZ 내 Private Subnet)에 있으면 접근 가능
여기서 중요한건
- Bastion EC2와 RDS가 같은 VPC에 존재해야 함
- Bastion EC2의 보안 그룹이 RDS 보안 그룹의 인바운드로 허용되어야 함 (TCP 3306 등)
그럼 ECS 운영에서 사용되는 같은 DB - RDS를 접근했는지에 대한 확인은 어떻게 할까요?
아래 체크리스트를 봅시다.
| 조건 | 설정 |
| 같은 VPC인가? | test-vpc |
| RDS가 Private Subnet에 위치했는가? | V |
| ECS Task가 Private Subnet에서 실행 중인가? | V |
| RDS 보안 그룹에 ECS Task Role IP 범위를 허용했는가? | V (sg-from-ecs → sg-of-rds로 인바운드 허용) |
| 포트 허용했는가? | V 보통 TCP 3306 |
4. 실습
4-1단계. VPC 및 Subnet 구조 준비


이렇게 생성하면 VPC, 서브넷, 라우팅 테이블, IGW까지 연결된 상태로 생성되게 됩니다.
그렇지만 실제 잘 연결되어 생성됐는지 아래 체크 리스트를 확인해봅시다.
- VPC는 DNS 호스트 이름과 DNS 지원이 모두 활성화
- 퍼블릭 서브넷은 IGW와 연결된 라우팅 테이블이 있어야 함
- 프라이빗 서브넷은 NAT Gateway 또는 외부 인터넷 연결 없이 설정
- 보안 그룹은 아래 단계에서 구성
생성 된 VPC의 리소스 맵을 보면
프라이빗 서브넷은 igw가 연결되지 않은 것을 확인하실 수 있습니다.


4-2단계. DB Subnet Group 생성
RDS가 프라이빗 서브넷에만 배포될 수 있도록 서브넷 그룹 구성
- 이름: test-rds-private-subnet-group
- 포함 서브넷
- private1-ap-northeast-2a
- private2-ap-northeast-2b

4-3단계. RDS(MySQL) 생성 - Private 접근용
주요 체크 리스트 설정은 아래와 같습니다.
| 항목 | 값 |
| DB 엔진 | MySQL (또는 원하는 엔진) |
| 버전 | 최신 안정 버전 |
| DB 인스턴스 클래스 | db.t3.micro 또는 db.t4g.micro |
| DB 서브넷 그룹 | 방금 만든 test-rds-private-subnet-group |
| 퍼블릭 액세스 가능 여부 | 아니오 (반드시 private) |
| 보안 그룹 | test-db-prod-sg (생성 필요)(Bastion EC2에 허용되어야 함) |
| 인증 | 사용자 지정 (ex: admin / 비밀번호 지정) |
| 포트 | 3306 |
test-db-prod-sg 보안그룹 설정
| 유형 |
프로토콜 | 포트 범위 | 소스 |
| MySQL/Aurora | TCP | 3306 | test-bastion-sg |
4-4단계. Bastion EC2 생성 및 SSH 접근 (Public Subnet)


위에서 생성한 VPC(public), 보안그룹 설정만 잘 해주시면 됩니다.
아래 SSH접근까지 완료되었습니다.

4-5단계. Bastion EC2 → Private RDS 접근 테스트
EC2 프리티어 사용 시 mysql 설치전에 스왑하여 메모리를 늘려주는게 좋습니다.
# SSH 접속
SSH접속이 되어있어야합니다.
# MySQL 설치 (Amazon ubuntu 22.04 기준)
sudo apt update
sudo apt install mysql-client -y
# RDS 접속 테스트
mysql -h <RDS_ENDPOINT> -P 3306 -u <USERNAME> -p
# 성공 메세지
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is ...
Server version: 8.0.x

5. 로컬에 백업해놓은 DB.sql 파일을 -> Bastion EC2 -> Private RDS에 적용하는 방법
자 그럼 이제 로컬에 백업해놓은 DB.SQL파일을 private RDS에 적용하기 위하여
로컬에 있는 .sql파일을 -> Bastion EC2에 업로드 후 -> Bastion EC2에서 RDS연결 확인 후 .sql에 적용(복원)
하는 것을 해보겠습니다.
5-1단계. Bastion EC2에 .sql 파일 업로드 (방법 A: scp 명령어 사용 (로컬 -> EC2))
로컬에서 아래 커맨드를 입력합니다.
scp -i path/to/your-key.pem backup.sql ubuntu@<bastion-public-ip>:/home/ubuntu/
성공 시 아래와 같이 나옵니다.

Bastion EC2에서 잘 옮겨졌나 확인을 해봅니다.
ls -al /home/ubuntu
잘 옮겨졌습니다.

5-2단계. Bastion EC2에서 RDS 연결 확인
mysql -h <RDS-endpoint> -u <username> -p

5-3단계. .sql파일을 MySQL에 적용 (복원)
mysql -h <RDS-endpoint> -u <username> -p < database_name < backup.sql
!주의사항
여기에서는 먼저 database_name의 DB가 미리 생성되어있어야 합니다.
없다면 아래 커맨드를 입력하여 만들어야 합니다.
// 접속
mysql -h db주소 -u admin -p
// 접속 이후
CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
EXIT;
자 그럼 확인해보겠습니다.
- Bastion EC2 MySQL에서
# DB 목록 확인
SHOW DATABASES;
# DB 진입
USE database_name;
# 모든 테이블 조회
SHOW TABLES;
확인결과 잘 옮겨진 것을 확인할 수 있었습니다.

5-4단계. DBeaver에서 SSH 접속


위와 같이 SSH, MAIN 설정해주시면 아래와 같이 잘 성공되시는 것을 확인하실 수 있습니다.

https://en.wikipedia.org/wiki/Bastion_host
Bastion host - Wikipedia
From Wikipedia, the free encyclopedia Special purpose computer on network A bastion host is a special-purpose computer on a network specifically designed and configured to withstand attacks, so named by analogy to the bastion, a military fortification. The
en.wikipedia.org
https://namu.wiki/w/bastion?uuid=136d0798-1f62-4b73-9fab-68dd67cbe369
bastion
Bastion [ˈbæstiən, ˈbæstʃən ]. 성형 요새 에서 돌출 지점마다 건설된 포루를 의미한다. 이
namu.wiki
https://en.dict.naver.com/#/entry/enko/4012e6055c46419eb34173f16c3fe3a5
Naver English-Korean Dictionary
Provide American/British pronunciation, kinds of dictionaries, plenty of Thesaurus, preferred dictionary setting option, advanced search function and Wordbook
en.dict.naver.com