이번 글에서는 Private subnet에 세팅된 RDS에 bastion ec2를 통해서 접근하는 방법에 대해서 알아보겠다.
먼저 AWS의 VPC, Subnet에 대해서는 알고 있어야 해서 만약 vpc, subnet에 대해서 궁금하다면 이 글을 참고하자.
Bastion
은 수호자, 보루, 요새
라는 사전적 의미를 갖고 있다. 이 글에서 쓰이는 의미도 같다고 볼 수 있다.
내가 구축한 인프라 또는 네트워크의 입구에서 허용된 사람만 출입할 수 있는 역할을 수행하는 녀석이다.
즉, 위의 역할을 수행하는 서버를 Bastion 호스트
또는 Bastion 서버
라고 부른다.
어떤 서비스를 만들때, 보통은 FE, BE, DB
이런 형태로 리소스가 구성이 된다. 서비스의 성격에 따라 다르겠지만 DB는 거의 무조건 퍼블릭한 접근을 불허하게 된다.
왜냐하면, DB에는 중요한 정보들이 가득해서 최대한 꽁꽁 숨기는 것이 좋기 때문이다.
근데 개발을 하려면 로컬에서도 접근해야하고, 뭐 이래저래 간편하게 접근을 해야하는 경우가 많다.
그래서 특정 서버에서 DB에 접근하는 것을 허용한 후, 그 서버를 통해서 DB에 접속하는 방법을 사용하게 되는데, 이때 통로 역할을 해주는 서버를 Bastion 호스트
라고 부른다.
어떻게 구조를 가져가는 지는 아키텍쳐의 스타일 또는 조직의 상황에 따라 다르겠지만, 이번 글에서는 다른 서버 역할 없이 Bastion 호스트의 역할만 하는 EC2를 생성하도록 하겠다. 그러면 아래와 같은 구조를 갖게 된다.
프라이빗 서브넷에 있는 리소스에 접근하려면 무조건 Bastion EC2를 통하게 하는 것이다.
이 EC2 정보는 사내 또는 팀내에만 공유하고, 사내의 IP에서만 접근이 가능하도록 보안그룹을 설정하면 더 탄탄하게 인프라를 구축할 수 있을 것이다. 🤭
Bastion 호스트에 대해서 알아봤다면, 이제 실제로 Bastion호스트와 프라이빗 RDS를 구축을 해보겠다.
단, VPC와 Subnet구성은 이미 되어 있다는 가정하에 진행하겠다.
(VPC, Subnet을 생성하려면 이 글을 참고)
1개 이상의 Public subnet, 2개 이상의 Private subnet 필요
DB 서브넷 그룹
이 있어야 한다.RDS > 서브넷 그룹 > DB 서브넷 그룹
private
서브넷으로 설정해주자.EC2 > 보안그룹
으로 이동한다.⭐인바운드 규칙의 '소스'는 선택한 VPC의 CIDR로 설정한다. 즉, VPC안에서 출발하는 트래픽은 모두 허용한다는 의미이고, 다시 말하면 내부망에서의 통신은 허용한다는 의미이다.
엔진 유형: MySQL
템플릿: 프로덕션
가용성 및 내구성: 단일 DB 인스턴스
인스턴스 구성: 버스터블 클래스 (db.t3.micro)
스토리지: 범용 SSD(gp2)
할당된 스토리지: 100GB
VPC, 서브넷 그룹, 보안 그룹: 미리 생성한 것들로 설정
가용 영역: ap-northeast-2a (이건 프라이빗 서브넷을 어디에 생성했는지에 따라서 사람마다 다름)
모니터링: off
(나머지는 기본값)
이제 Bastion 호스트를 생성해주자.
구성하기 나름이지만 나는 이 서버는 오직 프라이빗 리소스에 대한 접근을 위해서만 사용할 것이므로, 최소의 서버 스펙으로 인스턴스를 생성해주자.
생성 자체는 매우 간단하다.
먼저 22번포트를 통한 SSH통신을 모든 곳에서 허용
하는 보안 그룹을 생성해준다.
그리고 Amazon Linux에 모두 기본값으로 세팅하고 위에서 생성한 보안그룹을 설정해준 후에 EC2를 생성해준다.
네트워크 설정에서 퍼블릭 IP 자동 할당은 비활성화해주자.
(키페어는 새로 생성한 후, 잃어버리지 않게 잘 갖고 있기)
7번까지하면 모든 준비가 완료되었다.
이제 HeidiSQL을 통해서 로컬에서 프라이빗 서브넷에 위치한 RDS로 접근해보도록 하겠다.
HeidiSQL이 아니여도 되고, 자기가 편한 방식 또는 프로그램을 사용해도 된다.
이번 글에서는 프라이빗 서브넷에 RDS를 생성하고, 배스천 EC2를 통해서 로컬에서 이 RDS에 접근하는 방법에 대해서 알아봤다.
이런 식으로 인프라를 구성하면 보안적인 측면에서 굉장히 큰 이점을 갖게 되는 것 같다 ㅎㅎ
또, 혹시나 배스쳔 EC2가 노출되어서 DB가 공격받고 있다면, 배스천 EC2 인스턴스를 중지 시켜버리고 새로운 배스천 EC2를 구축해서 공격에 대응할 수도 있겠다라고 개인적으로 생각이 들기도 했다 🤭