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

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

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

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

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

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

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

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

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

방화벽

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

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

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

HTTPS 및 SSL

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

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

이전에 SSL 제공 도메인을 설정한 경우 Google Compute Engine에서 동일한 작업을 수행하는 것이 간단해야 합니다. 그렇지 않은 경우 포트 전달 또는 SOCKS 프록시와 같은 다른 보안 방법을 사용하는 것이 더 쉬울 수 있습니다.

SSH를 통한 포트 전달

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

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

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

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

  • example-instance는 연결하려는 인스턴스의 이름입니다.
  • my-projectGoogle Cloud Platform 프로젝트 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 \
    -- -NL 2222:localhost:8888 -NL 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-projectGoogle Cloud Platform 프로젝트 ID입니다.
  • us-central1-a는 인스턴스가 실행 중인 영역입니다.
  • 1080는 수신 중인 로컬 포트입니다.

이 경우 원격 포트를 지정할 필요가 없습니다. SOCKS 프록시는 특정 원격 포트에 결합하지 않으므로 SOCKS 프록시를 통해 연결하면 연결된 호스트와 관련하여 해결됩니다.

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

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

프록시를 사용하도록 브라우저를 구성하세요.

SOCKS 프록시용 Chrome 설정

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)으로 설정합니다.

SOCKS 프록시용 Firefox 설정

이 설정을 변경하기 전에 새로운 Firefox 프로필을 만들어야 할 수 있습니다. 그렇지 않으면, Firefox의 모든 인스턴스에 영향을 미치게 되어 원치 않아도 해당 호스트를 프록시로 사용하게 될 수 있습니다.

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

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

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

인스턴스에 외부 IP 주소가 없으면 네트워크의 다른 인스턴스 또는 관리형 VPN 게이트웨이를 통해서만 인스턴스에 연결할 수 있습니다. 인바운드 연결(요새 호스트) 또는 네트워크 송신(NAT 게이트웨이)에 대한 신뢰할 수 있는 릴레이 역할을 하도록 네트워크의 인스턴스를 프로비저닝할 수 있습니다. 이러한 연결을 설정하지 않고 보다 투명하게 연결하려면 관리형 VPN 게이트웨이 리소스를 사용할 수 있습니다.

요새 호스트

요새 호스트는 사설 네트워크 인스턴스가 포함된 네트워크에 외부 진입점을 제공합니다. 이 호스트는 단일 요새 지점 또는 감사를 제공할 수 있으며 인터넷에서 인바운드 SSH 통신을 사용하거나 사용하지 않도록 시작하고 중지할 수 있습니다.

요새 아키텍처

요새 호스트를 사용하면 외부 IP 주소가 없는 인스턴스에 연결할 수 있습니다. 예를 들어 이 접근 방식을 사용하면 추가 방화벽 규칙을 구성하지 않고도 개발 환경에 연결하거나 외부 애플리케이션의 데이터베이스 인스턴스를 관리할 수 있습니다.

완전한 요새 호스트의 강화는 이 문서의 범위를 벗어나지만 취할 수 있는 몇 가지 초기 단계는 다음과 같습니다.

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

기본적으로 인스턴스의 SSH는 인증에 비공개 키를 사용하도록 구성됩니다. 요새 호스트를 사용할 때는 우선 요새 호스트에 로그인한 다음 대상 비공개 인스턴스에 로그인합니다. 요새 호스트가 '점프 서버'라고도 불리는 이유가 되는 이 2단계 로그인으로 인해 대상 머신에 도달하는 방법으로 대상 머신의 비공개 키를 요새 호스트에 저장하는 대신 ssh-agent 전달을 사용해야 합니다. 요새는 공개된 키 쌍의 절반에만 직접 액세스할 수 있기 때문에 요새 및 대상 인스턴스에 대해 동일한 키 쌍을 사용하는 경우에도 이 작업을 수행해야 합니다.

요새 호스트 인스턴스를 사용하여 Cloud Platform 네트워크의 다른 인스턴스에 연결하고 ssh-agent 전달을 사용하는 방법을 알아보려면 외부 IP 주소가 없는 인스턴스에 연결을 참조하세요.

VPN

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

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

인스턴스의 외부 IP 주소 대신 기존 VPN을 통해 Cloud Platform 네트워크의 인스턴스에 연결하는 방법을 알아보려면 외부 IP 주소가 없는 인스턴스에 연결을 확인하세요.

NAT 게이트웨이를 사용한 트래픽 송신

인스턴스에 외부 IP 주소가 할당되어 있지 않으면 다른 Cloud Platform 서비스를 포함하여 외부 서비스에 직접 연결할 수 없습니다. 이러한 인스턴스가 공개 인터넷의 서비스에 도달할 수 있게 하려면 NAT 게이트웨이 머신을 설정하고 구성하여 네트워크상의 모든 인스턴스를 대신하여 트래픽을 라우팅할 수 있습니다. 단일 인스턴스는 가용성이 뛰어날 수 없으며 여러 인스턴스에 대한 높은 트래픽 처리량을 지원할 수 없습니다.

양방향 직렬 콘솔 액세스

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

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

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

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

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

Compute Engine 문서