[Server] Bastion Host란? (부제. GCP에서 Bastion 띄우기)
resilient
·2022. 7. 29. 01:39
일반적으로 개발을 하면서 Cloud DB에 접근할 때는 바로 DB host로 연결해서 사용할 수도 있지만 일반적으로 prod레벨에서는 보안을 위해 DB를 띄워놓은 인스턴스가 들어있는 VPC 안을 Proxy서버를 통해서 접근하게 됩니다.
자 그렇다면 여기서 VPC안에 들어갈 때 사용되는 Proxy서버는 어떤 역할을 할까요?
이번 시간에 Proxy 서버역할을 하는 Bastion host에 대해 알아보려고 합니다.
0. Bastion host란?
먼저 Bastion은 직역해보면 군사, 요새에서 성 외곽을 보호하기 위해 돌출된 부분을 의미합니다.
따라서 Bastion host는 적을 가장 효과적으로 방어할 수 있는 host 겠구나.라고 생각해볼 수 있겠는데요. 말 그대로 컴퓨터 네트워크에서 적을 방어하기 위해서 사용하는 host를 Bastion host라고 합니다.
Bastion Host는 접근 제어 기능과 더불어 게이트웨이로서 가상 서버(Proxy Server)의 설치, 인증, 로그 등을 담당합니다. 특히 내부와 외부 사이에서 일종의 게이트 역할을 수행하는데요. 그만큼 위험에 노출되는 경우가 많기 때문에, 배스천 호스트는 네트워크 보안상 가장 중요한 방화벽 호스트라고도 할 수 있죠. 아래 사진을 보겠습니다.
Bastion Host를 통해서 Cloud VPC안에 있는 Private IP에 접근하는 과정을 위 그림으로 쉽게 확인할 수 있습니다.
1. GCP에서 Bastion을 언제 사용할까?
먼저 현재 프로젝트에서는 GCP Cloud sql을 사용합니다.
local에서 개발을 할 때, VPC안에 있는 Cloud sql 을 사용하기 위해서 Bastion Host를 사용했는데요. 그 과정을 정리해보려고 합니다.
1-1. 먼저 Code level에서 database.provider을 보겠습니다.
NestJS를 사용하고 있고, 원래는 Firestore을 사용했지만 이번에 MySQL로 migration을 하고 있습니다. Cloud SQL을 사용하기 위한 provider는 아래와 같습니다.
import { DataSource } from 'typeorm';
export const databaseProviders = [
{
provide: 'DATA_SOURCE',
useFactory: async () => {
const dataSource = new DataSource({
type: 'mysql',
host: 'localhost',
port: 13306,
username: 'root',
password: '123',
database: 'test',
entities: [__dirname + '/../../**/*.entity{.ts,.js}'],
synchronize: true,
logging: true,
});
return dataSource.initialize();
},
},
];
위에 코드를 보면 host가 localhost 인데요. 여기는 mysql server ip를 입력해야 합니다. 하지만 여기에 mysql server ip를 바로 입력한다면? 당연히 접속이 안될 겁니다. 이유는 vpc 내부에 있는 private mysql server ip 이기 때문이죠.
그렇다면 Bastion host를 이용해서 local에서 localhost를 통해서 private mysql server ip에 접속하는 법을 알아보겠습니다.
2. GCP에서 Bastion을 사용해보자.
Playground라는 GCP Project가 있습니다. Playground 에 있는 sql을 로컬에서 사용하기 위해서 먼저 private ip를 가진 sql의 server instance가 필요합니다. Linux instance는 공개적으로 액세스할 수 없는 Subnet에 있으며, Bastion host를 실행하는 기본 VM instance에 연결된 SSH 액세스를 허용하는 instance입니다.
따라서 Playground Project와 같은 VPC안에 private mysql ip를 가지고 있는 VM instance를 하나 생성해줍니다. 이름은 instance-sql로 하겠습니다. (보통 Bastion, Bastion-host로 naming을 많이 하곤 합니다.)
완료가 되었다면, 이제 아래와 같은 command를 알아보겠습니다. ( 이 문서에서 더 자세한 내용을 확인하실 수 있습니다. )
gcloud compute ssh instance-sql --project {project name} -- -NL 13306:{mysql private ip address}:3306
위 command를 간단하게 살펴보자면 아래와 같습니다.
instance-sql이라는 VM instance의 mysql private ip address에서 3306을 (mysql의 default port는 3306입니다.) localhost의 13306 port로 compute 해줘
따라서 private ip의 mysql server를 localhost 13306 port에서 사용할 수 있게 해 줘라고 할 수 있는 것이죠.
위와 같이 실행을 하면 아래처럼
gcp-auth password를 요구하고, password를 입력한 뒤 locahost:13306에 databaseprovider을 연결하고 서버를 실행하면
위와 같이 DatabaseModule의 의존성이 주입이 되는 것을 확인할 수 있습니다.
3. 정리
팀 리더가 '바스티온'이라 불렀던 Bastion host를 이번에 사용해보면서 Bastion이 어떤 건지 찾아보고, 사용해볼 수 있던 기회였던 것 같습니다.
다음에는 이 게시물의 연장선으로 cloud_sql_proxy를 사용해서 gcp-auth 권한을 가지고 별 다른 물리적(code level) 인증 없이 Bastion host를 운영하는 방법에 대해 알아보겠습니다.
감사합니다.
'Back-end > Server & Cloud' 카테고리의 다른 글
[GCP/Cloud Logging] NestJs에서 winston을 사용해서 google cloud logging sink router 설정하기. (0) | 2022.12.02 |
---|---|
[GCP/docker] Appengine 배포환경에서 .env 분기하기(부제. env-cmd) (1) | 2022.10.03 |
[Server] pub/sub 이란? (0) | 2022.06.09 |
[Server] Restful API란? (0) | 2022.03.29 |
[Server] 토이프로젝트 (0) | 2021.02.16 |