[AWS] Bastion 호스트로 프라이빗 RDS 접속하기 (w. HeidiSQL)

Kai·2022년 11월 6일
2

이번 글에서는 Private subnet에 세팅된 RDS에 bastion ec2를 통해서 접근하는 방법에 대해서 알아보겠다.
먼저 AWS의 VPC, Subnet에 대해서는 알고 있어야 해서 만약 vpc, subnet에 대해서 궁금하다면 이 글을 참고하자.


🤔 Bastion 호스트?


Bastion수호자, 보루, 요새라는 사전적 의미를 갖고 있다. 이 글에서 쓰이는 의미도 같다고 볼 수 있다.
내가 구축한 인프라 또는 네트워크의 입구에서 허용된 사람만 출입할 수 있는 역할을 수행하는 녀석이다.
즉, 위의 역할을 수행하는 서버를 Bastion 호스트 또는 Bastion 서버 라고 부른다.

🧐 왜 필요한가?

어떤 서비스를 만들때, 보통은 FE, BE, DB 이런 형태로 리소스가 구성이 된다. 서비스의 성격에 따라 다르겠지만 DB는 거의 무조건 퍼블릭한 접근을 불허하게 된다.
왜냐하면, DB에는 중요한 정보들이 가득해서 최대한 꽁꽁 숨기는 것이 좋기 때문이다.

근데 개발을 하려면 로컬에서도 접근해야하고, 뭐 이래저래 간편하게 접근을 해야하는 경우가 많다.
그래서 특정 서버에서 DB에 접근하는 것을 허용한 후, 그 서버를 통해서 DB에 접속하는 방법을 사용하게 되는데, 이때 통로 역할을 해주는 서버를 Bastion 호스트라고 부른다.


📲 구조


어떻게 구조를 가져가는 지는 아키텍쳐의 스타일 또는 조직의 상황에 따라 다르겠지만, 이번 글에서는 다른 서버 역할 없이 Bastion 호스트의 역할만 하는 EC2를 생성하도록 하겠다. 그러면 아래와 같은 구조를 갖게 된다.
프라이빗 서브넷에 있는 리소스에 접근하려면 무조건 Bastion EC2를 통하게 하는 것이다.
이 EC2 정보는 사내 또는 팀내에만 공유하고, 사내의 IP에서만 접근이 가능하도록 보안그룹을 설정하면 더 탄탄하게 인프라를 구축할 수 있을 것이다. 🤭


💻 실습


1. 준비사항 ⭐

Bastion 호스트에 대해서 알아봤다면, 이제 실제로 Bastion호스트와 프라이빗 RDS를 구축을 해보겠다.
단, VPC와 Subnet구성은 이미 되어 있다는 가정하에 진행하겠다.
(VPC, Subnet을 생성하려면 이 글을 참고)

1개 이상의 Public subnet, 2개 이상의 Private subnet 필요

2. 리전 확인

  • 먼저 내 VPC가 있는 리전으로 선택이 되어 있는지 확인한다. 나는 '서울'리전으로 진행

3. DB 서브넷 그룹 생성

  • DB 서브넷 그룹 생성: DB 인스턴스를 만들기 위해서는 DB 서브넷 그룹이 있어야 한다.
    다음의 경로로 먼저 이동한다. RDS > 서브넷 그룹 > DB 서브넷 그룹
    그리고, 아래와 같이 값을 설정해주면 된다.
    -> 서브넷: RDS를 위치시킬 곳을 정하면 된다. 단, private 서브넷으로 설정해주자.
    -> 가용 영역: 위의 서브넷이 속한 가용영역을 선택해주면 된다. 헷갈리면 모두 선택해줘도 무방하다.

4. 보안 그룹 생성

  • EC2 > 보안그룹 으로 이동한다.
  • '보안 그룹 생성' 버튼 클릭
  • 그리고, 이름을 써주고 생성한 VPC를 선택해준다. 그리고 인바운드 규칙은 아래와 같이 설정해주고, 아웃바운드 규칙은 그대로 두자.

⭐인바운드 규칙의 '소스'는 선택한 VPC의 CIDR로 설정한다. 즉, VPC안에서 출발하는 트래픽은 모두 허용한다는 의미이고, 다시 말하면 내부망에서의 통신은 허용한다는 의미이다.

5. RDS 생성

  • RDS >'데이터베이스'페이지 접속
  • 데이터베이스 생성: DB는 원하는 옵션으로 진행하면 되는데, 나는 아래의 옵션으로 진행하겠다. 프리티어로 실습하는 것이라면, 기본 값으로 DB를 생성해도 괜찮다. (세팅한 것을 캡쳐로도 보여주고 싶지만 이미지가 너무 길어서 제외하겠다. 😂)
엔진 유형: MySQL
템플릿: 프로덕션
가용성 및 내구성: 단일 DB 인스턴스
인스턴스 구성: 버스터블 클래스 (db.t3.micro)
스토리지: 범용 SSD(gp2)
할당된 스토리지: 100GB
VPC, 서브넷 그룹, 보안 그룹: 미리 생성한 것들로 설정
가용 영역: ap-northeast-2a (이건 프라이빗 서브넷을 어디에 생성했는지에 따라서 사람마다 다름)
모니터링: off
(나머지는 기본값)

이제 Bastion 호스트를 생성해주자.


6. Bastion 호스트 (EC2) 생성

구성하기 나름이지만 나는 이 서버는 오직 프라이빗 리소스에 대한 접근을 위해서만 사용할 것이므로, 최소의 서버 스펙으로 인스턴스를 생성해주자.
생성 자체는 매우 간단하다.

먼저 22번포트를 통한 SSH통신을 모든 곳에서 허용 하는 보안 그룹을 생성해준다.

그리고 Amazon Linux에 모두 기본값으로 세팅하고 위에서 생성한 보안그룹을 설정해준 후에 EC2를 생성해준다.
네트워크 설정에서 퍼블릭 IP 자동 할당은 비활성화해주자.
(키페어는 새로 생성한 후, 잃어버리지 않게 잘 갖고 있기)

7. 탄력적 IP 생성 및 EC2에 연결

  • 탄력적 IP (Elastic IP) 페이지에서 eip를 하나 생성해준다.
  • 그리고 EC2와 연결을 시켜주자.

8. HeidiSQL로 접속

7번까지하면 모든 준비가 완료되었다.
이제 HeidiSQL을 통해서 로컬에서 프라이빗 서브넷에 위치한 RDS로 접근해보도록 하겠다.
HeidiSQL이 아니여도 되고, 자기가 편한 방식 또는 프로그램을 사용해도 된다.

  1. HeidiSQL 실행 후 아래와 같이 RDS설정 입력

  1. SSH터널에 배스천 EC2 설정 입력

  1. 접속 확인


😎 마무리


이번 글에서는 프라이빗 서브넷에 RDS를 생성하고, 배스천 EC2를 통해서 로컬에서 이 RDS에 접근하는 방법에 대해서 알아봤다.
이런 식으로 인프라를 구성하면 보안적인 측면에서 굉장히 큰 이점을 갖게 되는 것 같다 ㅎㅎ

또, 혹시나 배스쳔 EC2가 노출되어서 DB가 공격받고 있다면, 배스천 EC2 인스턴스를 중지 시켜버리고 새로운 배스천 EC2를 구축해서 공격에 대응할 수도 있겠다라고 개인적으로 생각이 들기도 했다 🤭


🙏 참조


0개의 댓글