AWS 기술 블로그

GUI 환경을 이용하여 안전하게 Amazon RDS 또는 Amazon EC2 DB 인스턴스에 원격 접근하기

이 글은 AWS Database Blog에 게시된 Securely connect to an Amazon RDS or Amazon EC2 database instance remotely with your preferred GUI by Jonathan Kerr, Uwe Kuechler, and Vincent Lesierse를 한국어로 번역 및 편집하였습니다.

데이터베이스 전문가들은 지난 수년간 GUI 기반의 도구를 사용해 왔습니다. 이러한 도구는 기능이 다양하고, 스크립트 개체 정의를 마우스 오른쪽 버튼으로 클릭하여 볼 수 있고, 데이터베이스에서 일어나는 일에 대한 그래픽 실시간 보기를 제공하며, 일반적으로 특정 데이터베이스 엔진을 처음 사용하는 경우 학습 곡선을 단축하는 등의 멋진 기능을 제공합니다.

Amazon Relational Database Service (Amazon RDS)를 사용하면 AWS에서 OS 계층을 유지 관리하므로 모니터링, 패치 적용, 장애 발생 시 복구에 대해 걱정할 필요가 없습니다. 또한 데이터베이스에 직접 접근하거나 퍼블릭 서브넷에서 RDP 또는 SSH를 통해 데이터베이스 서버에 접근할 필요가 없습니다.

일부 회사에서는 데이터베이스와 같이 매우 중요한 서비스가 호스팅되는 프라이빗 또는 접근이 제한된 서브넷에 접근하기 위해 먼저 원격으로 퍼블릭 서브넷에 있는 인스턴스에 RDP 또는 SSH로 접속한 뒤 데이터베이스에 접속하는 것을 보안 정책으로 제한하는 경우도 있습니다.

이 블로그 포스트에서는 AWS Systems Manager 세션 관리자를 사용하여 고객의 워크스테이션에서 RDS 인스턴스로 안전하게 접속하는 방법을 소개합니다.

아키텍처 개요

중요한 인프라스트럭처는 접근이 제한된 서브넷에서 호스팅되는 것이 모범 사례입니다. 데이터베이스의 경우, 이 모범사례를 따라 데이터베이스에 반드시 접근이 필요한 사용자와 애플리케이션 외에는 접근을 차단할 수 있습니다.

회사의 데이터베이스 관리자, 엔지니어 그리고 개발팀에게 데이터베이스에 대한 접근 권한을 부여하는 경우, 배스천 호스트를 사용하는 것이 일반적입니다. 아래 아키텍처 구성도는 RDP/SSH 배스천 엑세스를 거쳐 프라이빗 서브넷에 위치한 SQL 서버에 접속하는 구성을 나타낸 것입니다.

이 시나리오에서는 배스천 호스트에 GUI 도구 세트를 설치해야 하며, 필요한 경우 인스턴스를 시작하거나 종료할 수 있습니다.

또한 팀 간에 여러 호스트를 공유해야 할 필요가 있을 수 있습니다. 만약 대규모 조직에서 사용하는 것처럼 Windows 기반의 호스트를 사용하며, 터미널 서버가 아닌 경우 RDP 세션 수를 제한하거나 그에 따라 라이센스를 부여해야 합니다.

또 이러한 구성의 경우 배스천 호스트가 퍼블릭 서브넷에 위치하며, 배스천 호스트에 원격 데스크톱에서 접속할 수 있도록 3389 포트가 열려있게 됩니다.

반면, 아래의 아키텍처 구성도는 세션 관리자 배스천 액세스를 통해 프라이빗 서브넷에 위치한 SQL 서버에 접근하는 구성을 보여줍니다.세션 관리자를 이용하면, 배스천 호스트에 접근하기 위해 어떠한 포트도 열지 않을 수 있어 보안 유지가 가능하며, 데이터베이스 접근권한이 필요한 사용자의 워크스테이션에서 프라이빗 서브넷에 위치한 Amazon RDS에 바로 연결할 수 있습니다.

이 방법의 또 한 가지 장점으로는 접속에 필요한 SSH/PEM 키를 관리할 필요가 전혀 없다는 점입니다.

모든 액세스는 AWS Identity and Access Manager에서 관리됩니다.

사전 준비사항

이 포스트에서 저는 원격 세션을 시작하기 위해 Windows 노트북과 Windows PowerShell을 사용합니다. bash를 사용해서 이 실습 과정을 진행할 수 있지만, 사용하는 명령어는 블로그 포스트에 기재된 내용과 차이가 있을 수 있습니다.

진행하기에 앞서 먼저 로컬 데스크톱 또는 노트북에 아래의 도구와 서비스가 설치되어 있어야 합니다.

  • AWS Command Line Interface (AWS CLI)
  • AWS 관리 콘솔에 접속
  • Windows PowerShell 5.1 이상의 버전
  • 로컬 데스크톱 또는 노트북에 세션 관리자 플러그인 설치
  • GUI 가 제공되는 데이터베이스 도구 세트. 이 포스트에서는 SQL Server Management Studio (SSMS)를 사용합니다. pgAdmin4와 같은 다른 도구를 사용하셔도 됩니다.

아래의 AWS 구성요소와 서비스도 필요합니다.

솔루션 개요

새로운 EC2 보안 그룹을 만들고, 새 보안그룹이 RDS 인스턴스가 포함된 EC2 보안그룹에 접속할 수 있도록 합니다.

그다음 새 보안 그룹에 EC2 인스턴스를 프로비전하고 워크스테이션 도구 세트가 EC2 인스턴스를 거쳐 RDS 인스턴스에 접속할 수 있도록 포트 포워딩 세션을 만듭니다.

다음은 각 단계에 대한 설명입니다.

  1. 초기 셋업 수행
    1. EC2 배스천 호스트를 위한 보안 그룹 생성
    2. EC2 배스천 호스트를 위한 IAM 역할 생성
    3. 배스천 호스트 프로비전
  2. 포트 포워딩 세션 생성
    1. 트래픽을 RDS 인스턴스로 전달하기 위해 EC2 배스천 호스트에 원격 포트 포워딩을 생성
    2. 데스크톱에서 EC2 배스천 호스트 포트로 로컬 포트 포워딩 세션을 생성
    3. 로컬에 설치된 SSMS 복사본을 통해 RDS 인스턴스로 연결

초기 셋업

초기 셋업을 위해 아래의 단계를 따르시기를 바랍니다.

EC2 인스턴스를 위한 보안 그룹 생성

  1. Amazon EC2 관리 콘솔에서 보안 그룹(Security Groups)을 선택합니다.
  2. 보안 그룹 생성(Create security group)을 선택합니다.
  3. 보안 그룹(Security Groups) 생성 페이지에서 아래 예시와 같이 정보를 입력하시기를 바랍니다.
  4. 보안 그룹의 아웃바운드 규칙(Outbound rules) 섹션에서, 데이터베이스 포트에 대한 접근을 허용하시기를 바랍니다. 또한 VPC 엔드포인트에 연결할 수 있도록 아웃바운드 규칙이 443 포트(HTTPS)를 허용하는 규칙이 하나 이상 존재하는지 확인해야 합니다.
  5. 보안 그룹 생성(Create security group)을 선택합니다.
  6. EC2 관리 콘솔에서 DB의 보안 그룹을 선택합니다.
  7. DB 보안 그룹의 인바운드 규칙(Inbound rule) 섹션에서 EC2 배스천 보안 그룹에서 DB 보안 그룹으로 트래픽이 전달되도록 사용하는 DB 인스턴스의 포트를 허용해야 합니다.
  8. 규칙 저장(Save rules)을 선택합니다.

EC2 인스턴스를 위한 IAM 역할 생성

  1. IAM 관리 콘솔에서, 역할(Roles)을 선택합니다.
  2. 역할 만들기(Create role)를 선택합니다.
  3. 신뢰할 수 있는 엔터티 유형(Trusted entity type)으로 AWS 서비스를 선택합니다.
  4. 일반 사용 사례(Common use cases)에서 EC2를 선택합니다.
  5. 다음(Next)을 선택합니다.
  6. 권한 추가(Add permissions) 페이지에서 AmazonSSMManagedInstanceCore 권한 정책을 선택합니다.
  7. 다음(Next)을 선택합니다.
  8. 역할 이름(필수)과 태그(선택 사항)를 입력하고 역할 생성(Create role)을 선택합니다.

배스천 호스트 프로비저닝

배스천 호스트를 프로비저닝 하기 위해서는 EC2 인스턴스를 시작해야 합니다.

  1. Amazon EC2 콘솔에서 가장 최신의 Amazon Linux AMI를 선택합니다.
  2. 트래픽을 포워딩하기 위한 용도로는 충분한 성능을 제공하는 t3.micro 인스턴스 유형을 선택합니다.
  3. 서브넷 설정에서 프라이빗 서브넷을 선택합니다. 이 배스천 호스트는 인터넷에 직접 연결이 필요하지 않습니다.
  4. 퍼블릭 IP 자동 할당(Auto-assign public IP)비활성화(Disable)로 선택합니다. 만약 서브넷에서 퍼블릭 IP 할당을 허용하지 않도록 설정된 경우라면, 서브넷 설정을 따름을 선택합니다.
  5. 방화벽(보안 그룹)을 앞 단계에서 만든 보안 그룹으로 선택해 줍니다.
  6. 고급 세부 정보를 펼친 후 설정하는 IAM 인스턴스 프로파일은 앞의 단계에서 생성한 IAM 역할을 선택합니다.
  7. 키 페어(로그인)에서 키 페어 이름을 키 페어 없이 계속 진행(권장되지 않음)으로 선택합니다. 세션 관리자를 사용할 것이기 때문에 키페어가 필요하지 않습니다.
  8. 설정한 내용을 확인 후 인스턴스 시작(Launch Instance)을 선택합니다.

원격 포트의 포워딩 세션 생성

이 섹션에서는 Systems Manager를 사용하여 원격 호스트에 대한 포트 포워딩 세션을 만들고 SSMS에서 RDS 인스턴스에 연결합니다.

  1. 로컬의 Windows 컴퓨터에서 새로운 PowerShell 창을 엽니다. 그리고 AWS 자격증명이 유효한지, AWS 계정에 접속할 수 있는지 확인합니다. 만약 재인증이 필요하면, AWS CLI 구성 페이지의 내용을 참고하세요.
  2. 배스천 호스트를 사용하여 원격의 RDS 호스트에 접속할 수 있도록 Systems Manager 세션을 생성합니다.
    aws ssm start-session \
        --region <your region> \
        --target <your bastion instance id> \
        --document-name AWS-StartPortForwardingSessionToRemoteHost \
        --parameters host="<your rds endpoint name>",portNumber="1433",localPortNumber="1433"

    명령어를 실행하면 아래와 같은 응답이 나타납니다.

    Starting session with SessionId: 12a3456bcdefghi789
    Port 1433 opened for sessionId 12a3456bcdefghi789.
    Waiting for connections...

    창을 닫지 말고 열어놓은 채로 유지하세요.

  3. SSMS를 사용하여 SQL Server에 접속합니다. Encrypt connection을 선택하고, 127.0.0.1, 1433에 대해 Trust server certificate 또한 선택합니다.
    self-signed 인증서는 보안을 충분히 보장하지는 않지만, 아무것도 사용하지 않는 것보다는 더 나은 선택입니다. 더 많은 정보가 필요한 경우, Using Encryption Without Validation in SQL Server Native Client 문서의 내용을 참고하시기를 바랍니다.

    PowerShell 창에서 아래와 같은 연결 요청을 확인할 수 있습니다.

    Connection accepted for session [12a3456bcdefghi789]

    이제 연결이 된 것을 확인할 수 있습니다.동일한 1433 포트를 사용하는 두 번째 RDS 인스턴스에 연결하기 위해서는 배스천 호스트의 원격 포트 구성에서 로컬 포트를 다르게 변경하고 나머지는 동일하게 앞의 단계를 반복하면 됩니다.

두번째 포트 포워딩 세션 생성

이번에는 로컬의 노트북 또는 데스크톱이 1533 포트를 사용하여 연결되도록 배스천 호스트의 원격 포트 구성을 구성해 보겠습니다.

  1. RDS 호스트에 연결하기 위해 배스천 호스트를 사용해서 원격(RDS) 호스트에 대한 원격 Systems Manager 연결을 생성합니다.
    aws ssm start-session \
        --region <your region> \
        --target <your bastion instance id> \
        --document-name AWS-StartPortForwardingSessionToRemoteHost \
        --parameters host="<your rds endpoint name>",portNumber="1433",localPortNumber="1533"

    이 창은 열린 채로 유지합니다.

  2. 포트 포워딩을 구성한 포트로 두 번째 RDS에 연결합니다. 이 블로그 포스트에서는 1533번을 사용했습니다.

결론

Amazon RDS는 완전 관리형 데이터베이스 서비스입니다. Amazon RDS의 OS는 AWS에서 관리하기 때문에 고객은 RDP 또는 SSH를 통해 RDS가 호스팅되는 서버에 직접 접속할 수 없습니다.

이 블로그 포스트에서는 보안 수준을 손상하지 않으면서 고객이 원하는 GUI 도구 세트를 사용하여 로컬의 워크스테이션에서 RDS 인스턴스에 연결하는 방법을 보여드렸습니다.

Systems Manager에 대한 더 자세한 내용은 사용자 가이드를 참조하세요.

이 게시물에 대한 질문이 있는 경우 AWS Support 팀을 통해 문의해주시기를 바랍니다.

JinHyeok Lee

JinHyeok Lee

이진혁 솔루션즈 아키텍트는 솔루션 개발 및 보안 프로젝트 경험을 통해 스타트업 고객들이 안전하게 워크로드를 설계하고 운영할 수 있도록 지원하는 일을 담당하고 있습니다.