민프

[AWS] Bastion Host란 (feat. Private VPC, RDS) | ECS, EKS, EC2 VPC 보안을 지키는 관문 서버의 모든 것 본문

DevOps/[AWS]

[AWS] Bastion Host란 (feat. Private VPC, RDS) | ECS, EKS, EC2 VPC 보안을 지키는 관문 서버의 모든 것

민프야 2025. 7. 3. 21:00

Bastion 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-ecssg-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

 

Comments