EMD Blog

Bastion Host를 통한 RDS SQL Server 접속 본문

Public Cloud/AWS

Bastion Host를 통한 RDS SQL Server 접속

EmaDam 2022. 10. 22. 11:11

Private하게 구성해놓은 RDS를 외부에서 접근하고 싶을 때가 있다.

다른 DBMS는 SSH 터널링 옵션을 사용해서 쉽게 붙을 수 있지만 SQL Server는 직접 터널을 열어줘야 한다고 한다.

RDS 구성

RDS는 따로 구성이 필요하지는 않지만 외부 액세스 허용을 Off로 해주는 것과 Bastion host로 부터 접근 가능하도록 방화벽은 설정해주어야 한다.

Bastion Host 구성

제일 최저 사양의 VM을 RDS와 같은 VPC에 생성한다. 이때 Bastion Host는 외부에서도 접근 가능해야하기 때문에 Public 서브넷에 구성해야하며 외부 IP를 부여해주어야 한다.

module "ec2_instance_bastion" {
  source  = "terraform-aws-modules/ec2-instance/aws"
  version = "~> 3.0"

  count = (var.environment_use) ? 1 : 0

  name = <instance_name>

  ami                    = <ami> 
  instance_type          = <instance_type>
  key_name               = <key_name>
  subnet_id              = <public_subnet_id>
  vpc_security_group_ids = [<security_group_ids>]
}

항목설명

instance_name EC2 인스턴스의 이름
ami Amazon Machine Image로 Linux 계열을 지정하면 된다. 꼭 Destination Host의 OS와 맞출 필요는 없다.
instance_type t2.micro 처럼 가장 작은 유형을 사용하면 된다.
key_name Instance에 접속할 때 사용되는 Private Key다. 미리 AWS Console에서 생성한 후 키 이름을 지정해주면 된다.
public_subnet_id 외부에서 접근 가능해야 하니 Public Subnet의 id를 입력한다.
security_group_ids 보안그룹을 여러개 지정한다. 필요한 최소 구성은
  • Bastion Host에 접근하기 위한 SSH 허용
이다.

이렇게 생성했으면 먼저 Bastion Host와 RDS가 잘 통신되는지 확인해볼 필요가 있다.

sqlcmd를 직접 설치해서 확인해도 되고 telnet으로 붙어봐도 된다.

Bastion Host에 접속해서 둘 중 아무거나 시도해본다.

[sqlcmd 설치 - ubuntu]

https://learn.microsoft.com/ko-kr/sql/linux/sql-server-linux-setup-tools?view=sql-server-ver16#ubuntu

sqlcmd -S <rds_endpoint> -U <user> -P <password> -Q "SELECT Name from sys.Databases"

성공하면 DB 목록들이 출력될 것이다.

[telnet]

telnet homepage-db-dev-1.cj7qpqwfltdi.ap-northeast-2.rds.amazonaws.com 1433

개인 PC 설정 - MacOS

Bastion Host와 RDS간 통신이 잘 되는 것 같다면 이제 터널을 구성해야 한다.

ssh -i <key_file> <bastion_host_user>@<bastion_host_ip> -L <local_port>:<rds_endpoint>:<rds_port>

항목설명

key_file Bastion Host ssh 접속에 필요한 Key file의 경로와 이름을 지정해준다. (ex ~/Desktop/bastion.pem)
bastion_host_user Bastion Host의 user명
bastion_host_ip Bastion Host의 IP
local_port 로컬에서 사용중이지 않은 포트 중 아무거나 입력해준다.
rds_endpoint rds의 Endpoint
rds_port rds의 port

SSH로 접속이 되면 터널이 된 것이다. 아래 명령어로 내부에 local_port가 생겼는지 확인할 수 있다. (mac)

lsof -i :<local_port>

이렇게 하면 자신의 PC에서 127.0.0.1,<local_port>로 rds에 접근할 수 있다.

sqlcmd -S 127.0.0.1,<local_port> -U <rds_user> -P <rds_password> -Q "SELECT Name from sys.Databases" 

127.0.0.1,<local_port>로 접근해야 한다. localhost,<local_port>는 접속이 안된다. (이유는 모르겠음.)

개인 PC 설정 - Windows PC

Windows 같은 경우는 Putty를 기준으로 작성한다.

일반적으로 SSH 접속하는 것과 같은 절차이지만 Tunnel을 위한 한 가지 설정이 더 필요하다.

  1. Bastion Host 접속정보 설정

2. Bastion Host 접속을 위한 Private Key 지정

3. tunnel 정보 설정

Shell이 열리면 tunnel도 같이 열린다. 위 이미지는 local_port를 35000으로 설정.

터널이 열렸는지는 아래 명령어로 확인할 수 있다.

> netstat -ano | findstr <local_port>

포트가 확인이 된다면 PowerShell이나 Client 프로그램으로 접속할 수 있게 된다.

[PowerShell]

sqlcmd 설치 - https://learn.microsoft.com/ko-kr/sql/tools/sqlcmd-utility?view=sql-server-ver16#windows

sqlcmd -S 127.0.0.1,<local_port> -U <rds_user> -P <rds_password> -Q "SELECT Name from sys.Databases"

[ssms]

ssms 설치 - https://learn.microsoft.com/ko-kr/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver16

위에서는 Bastion Host로 Linux를 사용하였는데 OpsnSSH를 사용해 tunnel을 구성했기 때문이다. 그런데 Windows에서도 OpenSSH를 구성할 수 있다. 방법도 쉬우며 설치만 하면 위 과정과 똑같이 tunnel을 생성할 수 있게 된다. 

 

 

OpenSSH 설치

Windows용 OpenSSH 클라이언트 및 서버를 설치합니다.

learn.microsoft.com

만약 간단한 프로젝트라서 EC2 한 대를 따로 구성하기 아쉽다면, Windows도 tunnel 구성이 가능하니 기존에 Public에 구성되어 있는 서버를 활용하는 것도 좋은 방법이다.