VM 인스턴스에 안전하게 연결

Compute Engine에서 프로젝트를 개발할 때 공개 인터넷에서 인스턴스에 접근하지 못하도록 하는 다양한 시나리오가 있습니다.

  • 웹 서비스는 아직 개발 중이며 기능이 불완전하거나 아직 HTTPS로 구성되지 않았기 때문에 외부 사용자에게 노출될 준비가 되어 있지 않습니다.
  • 인스턴스는 프로젝트의 다른 인스턴스에 의해서만 사용되도록 설계된 서비스를 제공할 수 있습니다.
  • 인스턴스는 회사 사무실 또는 데이터 센터의 Dedicated Interconnect 옵션을 통해서만 접근해야 합니다.

서비스가 의도적으로 인터넷 연결을 사용하는 경우에도 서비스와의 통신을 대상 사용자 그룹으로 제한하고 민감한 정보를 보호하기 위해 SSH 또는 HTTPS와 같은 보안 채널을 통해 이루어지도록 하는 것이 중요합니다.

이 문서에서는 외부 IP 주소의 유무와 관계없이 Compute Engine 인스턴스와 안전하게 통신하기 위한 몇 가지 방법을 보여줍니다.

외부 IP 주소가 있는 머신의 서비스 보호

외부 IP 주소가 없는 인스턴스에 연결

외부 IP 주소가 있는 머신의 서비스 보호

인스턴스에 공개 IP 주소가 있는 경우 노출하려는 서비스 및 트래픽에만 접근할 수 있어야 하며 노출된 서비스 및 트래픽에 대해서는 민감한 정보가 안전하게 보호되어야 합니다.

방화벽

첫 번째 방어선은 방화벽을 사용하여 인스턴스에 접근할 수 있는 대상을 제한하는 것입니다. 방화벽 규칙을 만들면 특정 포트 집합의 네트워크 또는 대상 머신에 대한 모든 트래픽을 특정 소스 IP 주소로 제한할 수 있습니다.

방화벽은 독립형 솔루션이 아닙니다. 특정 소스 IP에 대한 트래픽을 제한한다고 해서 로그인 사용자 인증 정보, 리소스나 파일을 만들거나 폐기하는 명령어, 로그와 같은 민감한 정보가 보호되지는 않습니다. 외부 IP가 있는 Compute Engine 인스턴스와 같이 공개적으로 액세스할 수 있는 머신에서 웹 서비스를 실행하는 경우 적절한 보안 유지를 위해 호스트와 배포된 인스턴스 간의 모든 통신을 암호화해야 합니다.

또한 방화벽이 항상 적절한 솔루션이라고 할 수는 없습니다. 예를 들어 방화벽은 로밍 노트북과 같이 정적 IP 주소가 없는 개발 환경에 적합하지 않습니다.

HTTPS 및 SSL

프로덕션 웹 시스템의 경우 HTTPS/SSL을 구성해야 합니다. HTTPS를 종료하도록 인스턴스를 설정하거나 HTTPS 부하 분산을 구성하여 HTTPS/SSL을 설정할 수 있습니다. HTTPS/SSL은 초기에 몇 가지 복잡한 문제가 수반되므로 다음 작업을 수행해야 합니다.

  • 도메인 이름 등록
  • 인증 기관에서 SSL 인증서 얻기
  • 인증서를 HTTPS 부하 분산기 및 연결된 인스턴스에 등록하거나 하나 이상의 Compute Engine 인스턴스에서 SSL로 종료되는 웹 서버 또는 프록시 구성

이전에 SSL 제공 도메인을 설정했다면 Compute Engine에서 동일한 작업을 수행하는 것은 간단합니다. 그렇지 않으면 포트 전달, SOCKS 프록시 등의 다른 보안 방법을 사용하는 것이 더 간편할 수 있습니다.

SSH를 통한 포트 전달

gcloud 명령줄 도구를 사용하여 SSH 연결을 통해 원격 호스트에 모든 트래픽을 전달하는 서버를 특정 로컬 포트에서 시작할 수 있습니다.

먼저 보안 연결을 설정하려는 서비스를 제공하는 인스턴스와 포트를 기록합니다. 그리고 다음 명령어를 실행합니다.

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    -- -L 2222:localhost:8888

위의 명령어에서 매개변수는 다음과 같이 정의됩니다.

  • example-instance는 연결할 인스턴스의 이름입니다.
  • my-projectGoogle Cloud Platform(GCP) 프로젝트 ID입니다.
  • us-central1-a는 인스턴스가 실행 중인 영역입니다.
  • 2222는 수신 중인 로컬 포트입니다.
  • 8888은 연결할 원격 포트입니다.

이러한 설정 예를 사용하여 브라우저에서 http://localhost:2222/를 열면 HTTP 연결은 원격 호스트에 방금 만든 SSH 터널을 지나 SSH를 통해 지정된 인스턴스에 연결된 다음 동일한 머신의 포트 8888에 연결됩니다. 이때 암호화된 안전한 SSH 연결을 통해 연결됩니다.

gcloud 명령어는 SSH 연결을 만들고 유지하며 SSH 세션이 활성화된 동안에만 작동합니다. gcloud가 만든 SSH 세션을 종료하면 http://localhost:2222/를 통한 포트 전달도 바로 작동이 중지됩니다.

2개 이상의 포트 전달 규칙을 만들려면 플래그를 반복하여 단일 명령줄에 여러 규칙을 지정할 수 있습니다.

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    -- -L 2222:localhost:8888 -L 2299:localhost:8000

또는 매번 새로운 gcloud 명령어를 실행하여 별도의 터널을 만들 수 있습니다. 처음부터 연결을 종료하고 다시 설정하지 않고는 기존 연결에서 포트 전달을 추가하거나 삭제할 수 없습니다.

SSH를 통한 SOCKS 프록시

클라우드 배포에서 여러 호스트에 연결하려는 경우 브라우저에서 직접 네트워크를 통해 조회하는 것이 가장 쉬운 방법입니다. 이 접근 방식을 사용하면 각 호스트의 IP 주소를 검색하거나 각 서비스의 포트를 열거나 각 호스트/포트 쌍에 대한 SSH 터널을 만드는 대신 호스트의 닉네임을 사용할 수 있습니다.

여기에서 사용하는 접근 방식은 다음과 같습니다.

  1. 네트워크 상의 호스트 중 하나에 단일 SSH 터널을 설정하고 해당 호스트에 SOCKS 프록시를 만듭니다.
  2. 해당 SOCKS 프록시 호스트를 통해 모든 조회를 수행하도록 브라우저 구성을 변경합니다.

해당 호스트를 통해 모든 트래픽을 터널링하기 때문에 해당 브라우저나 특정 프로필을 사용하여 전반적인 웹 탐색을 수행하지 않아도 됩니다. 이때는 클라우드 서비스의 대역폭을 사용하게 됩니다. 일반적으로 별도의 브라우저 프로필을 사용하고 필요할 때 전환할 수 있습니다.

SOCKS 프록시 시작

SOCKS 프록시를 시작하려면 다음 명령어를 실행하세요.

gcloud compute ssh example-instance \
    --project my-project \
    --zone us-central1-a \
    --ssh-flag="-D" \
    --ssh-flag="1080" \
    --ssh-flag="-N"

위의 명령어에서 매개변수는 다음과 같이 정의됩니다.

  • example-instance는 연결할 인스턴스의 이름입니다.
  • my-projectGCP 프로젝트 ID입니다.
  • us-central1-a는 인스턴스가 실행 중인 영역입니다.
  • 1080는 수신 중인 로컬 포트입니다.

이 경우 원격 포트를 지정할 필요가 없습니다. SOCKS 프록시는 특정 원격 포트에 결합되지 않으므로 SOCKS 프록시를 통한 모든 연결은 연결된 호스트 기준으로 결정됩니다.

SOCKS 프록시를 사용하면 인스턴스의 닉네임을 사용하여 Compute Engine 네트워크를 프록시 인스턴스와 공유하는 모든 인스턴스에 연결할 수 있습니다. 또한 특정 인스턴스의 모든 포트에 연결할 수 있습니다.

이 접근 방식은 단순한 포트 전달 방법보다 훨씬 유연하지만 프록시를 사용하기 위해 웹 브라우저의 설정을 변경해야 합니다.

다음으로, 프록시를 사용하도록 Chrome 또는 Firefox를 구성합니다.

크롬

Chrome은 기본적으로 시스템 전체의 프록시 설정을 사용하므로 명령줄 플래그를 사용하여 다른 프록시를 지정해야 합니다. Chrome을 실행하면 기본적으로 이미 실행 중인 프로필의 인스턴스가 만들어지므로, 여러 개의 Chrome 사본(하나는 프록시를 사용하며 나머지는 사용하지 않음)을 동시에 실행하려면 새 프로필이 필요합니다.

새 프로필을 사용하여 Chrome을 시작합니다. 프로필이 없으면 자동으로 생성됩니다.

Linux:

"/usr/bin/google-chrome \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

macOS:

"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" \
    --user-data-dir="$HOME/chrome-proxy-profile" \
    --proxy-server="socks5://localhost:1080"

Windows:

"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" ^
    --user-data-dir="%USERPROFILE%\chrome-proxy-profile" ^
    --proxy-server="socks5://localhost:1080"

localhost 포트를 이전에 gcloud 명령어에서 사용한 값(이 예에서는 1080)으로 설정합니다.

Firefox

이러한 설정을 변경하기 전에 새 Firefox 프로필을 만드는 것이 좋습니다. 이렇게 하지 않으면 Firefox의 모든 인스턴스가 해당 호스트를 프록시로 사용하게 되는데, 이는 바람직한 동작이 아닐 수 있습니다.

별도의 프로필로 Firefox를 실행한 후 SOCKS 프록시를 설정할 수 있습니다.

  1. 환경설정을 엽니다.
  2. 고급 > 네트워크 > 설정을 클릭하여 연결 설정 대화상자를 엽니다.
  3. 수동 프록시 구성 옵션을 선택합니다.
    1. SOCKS 호스트 섹션에서 localhost를 호스트로 입력하고 이전에 gcloud 명령어를 실행할 때 선택한 포트를 입력합니다.
    2. SOCKS v5를 선택합니다.
    3. 원격 DNS 상자를 선택합니다.
    4. 다른 모든 항목은 비워 둡니다.
  4. 확인을 클릭하고 환경설정 대화상자를 닫습니다.

외부 IP 주소가 없는 인스턴스에 연결

인스턴스에 외부 IP 주소가 없으면 네트워크 상의 다른 인스턴스, Cloud Identity-Aware Proxy의 TCP 전달 기능 또는 관리형 VPN 게이트웨이를 통해서만 인스턴스에 연결할 수 있습니다. 인바운드 연결(배스천 호스트) 또는 네트워크 이그레스(NAT 게이트웨이)에 대해 신뢰할 수 있는 릴레이 역할을 하는 인스턴스를 네트워크에 프로비저닝할 수 있습니다. 이러한 연결을 설정하지 않고 보다 투명하게 연결하려면 관리형 VPN 게이트웨이 리소스를 사용할 수 있습니다.

배스천 호스트

배스천 호스트는 다음 다이어그램에 표시된 것처럼 비공개 네트워크 인스턴스가 포함된 네트워크에서 외부 진입점 역할을 합니다. 인터넷에서 통신 사용 설정하기

비공개 인스턴스의 네트워크에 대한 외부 진입점 역할을 하는 배스천 호스트의 아키텍처

이 호스트는 단일 요새 지점 또는 감사 지점이 될 수 있으며, 이 호스트를 시작 또는 중지시켜 인바운드 SSH를 사용 설정 또는 중지할 수 있습니다. 배스천 호스트를 사용하면 외부 IP 주소가 없는 인스턴스에 연결할 수 있습니다. 예를 들어 이 접근 방식을 사용하면 추가 방화벽 규칙을 구성하지 않고도 개발 환경에 연결하거나 외부 애플리케이션의 데이터베이스 인스턴스를 관리할 수 있습니다.

배스천 호스트의 완벽한 강화는 이 문서의 범위를 벗어나지만 다음을 비롯한 몇 가지 초기 조치를 취할 수 있습니다.

  • 요새와 통신할 수 있는 소스 IP의 CIDR 범위를 제한합니다.
  • 요새 호스트에서만 SSH 트래픽을 허용하는 방화벽 규칙을 구성합니다.

기본적으로 인스턴스의 SSH는 인증에 비공개 키를 사용하도록 구성됩니다. 배스천 호스트를 사용할 때는 우선 배스천 호스트에 로그인한 다음 대상 비공개 인스턴스에 로그인합니다. 이러한 2단계 로그인으로 인해 배스천 호스트를 '점프 서버'라고도 하며, 대상 머신에 연결하기 위해 대상 머신의 비공개 키를 배스천 호스트에 저장하는 대신 ssh 전달을 사용해야 합니다. 배스천과 대상 인스턴스에 동일한 키 쌍을 사용하는 경우에도 마찬가지인데, 배스천은 키 쌍에서 공개된 절반 부분에만 직접 액세스할 수 있기 때문입니다.

배스천 호스트 인스턴스를 사용하여 GCP 네트워크의 다른 인스턴스에 연결하는 방법 및 ssh 전달을 사용하는 방법은 외부 IP 주소가 없는 인스턴스에 연결을 참조하세요.

TCP 전달을 위한 Cloud IAP

Cloud IAP의 TCP 전달 기능과 함께 SSH를 사용하면 SSH 연결이 HTTPS 안에 래핑됩니다. 그런 다음 Cloud IAP의 TCP 전달 기능이 원격 인스턴스로 연결을 보냅니다.

Cloud IAP로 원격 인스턴스에 연결하는 방법은 TCP 전달을 위한 Cloud IAP 사용을 참조하세요.

VPN

Cloud VPN을 사용하면 VPN 게이트웨이 기기에 대한 IPsec 연결을 사용하여 기존 네트워크를 GCP 네트워크에 연결할 수 있습니다.` 이를 통해 프레미스에서 Compute Engine 인스턴스의 비공개 IP 인터페이스로 트래픽을 직접 라우팅할 수 있습니다. 트래픽은 공개 링크를 통해 Google로 전송될 때 암호화됩니다.

Compute Engine을 사용하여 VPN을 설정, 구성, 사용하는 방법에 대한 자세한 내용은 Cloud VPN 문서를 참조하세요.

인스턴스의 외부 IP 주소가 아니라 기존 VPN을 통해 GCP 네트워크의 인스턴스에 연결하는 방법은 외부 IP 주소가 없는 인스턴스에 연결을 참조하세요.

NAT 게이트웨이를 사용한 트래픽 이그레스

인스턴스에 외부 IP 주소가 할당되어 있지 않으면 다른 GCP 서비스를 비롯한 외부 서비스에 직접 연결할 수 없습니다. 이러한 인스턴스를 공개 인터넷 상의 서비스에 연결하기 위해 NAT 게이트웨이 머신을 설정하고 구성하여 네트워크 상의 모든 인스턴스를 대신하여 트래픽을 라우팅할 수 있습니다. 단일 인스턴스의 가용성은 그다지 높지 않으므로 여러 인스턴스에서 발생하는 높은 트래픽 처리량을 지원하지 못합니다.

양방향 직렬 콘솔 액세스

인스턴스에 외부 IP 주소가 없지만 문제해결이나 유지보수 목적으로 인스턴스와 상호작용해야 할 수도 있습니다. 앞서 설명한 것처럼 배스천 호스트 설정이 하나의 옵션이지만 필요한 것보다 더 많은 설정이 필요할 수 있습니다. 외부 IP 주소 없이 인스턴스 문제를 해결하려면 직렬 콘솔에서 대화형 액세스를 사용하도록 설정하세요. 이렇게 하면 SSH를 사용하여 인스턴스의 직렬 콘솔과 상호작용하고 직렬 콘솔에 대해 명령어를 실행할 수 있습니다.

자세한 내용은 직렬 콘솔과 상호작용을 참조하세요.

HTTPS 및 SSL 프록시 부하 분산기

HTTPS 및 SSL 프록시 부하 분산기의 백엔드 역할을 하는 인스턴스에는 외부 IP 주소가 없어도 부하 분산기를 통해 액세스가 가능합니다. 이러한 리소스에 직접 액세스하려면 외부 IP 주소가 없는 인스턴스에 연결에서 제시하는 방법을 사용해야 합니다.

자세한 내용은 해당 부하 분산기의 부하 분산 문서를 참조하세요.

다른 Google Cloud Platform 기능을 직접 사용해 보세요. 가이드 참조

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Compute Engine 문서