安全地連線至 VM 執行個體

在 Google Compute Engine 上開發專案時,您在下列各種情境中會想要避免他人從公開網際網路連至執行個體:

  • 網路服務仍處於開發階段,且尚未準備好向外部使用者公開,因為其功能仍不完整或尚未使用 HTTPS 設定。
  • 執行個體提供的服務可能設計為僅供專案中其他執行個體使用。
  • 執行個體只應從公司的辦公室或資料中心透過專屬互連網路選項連線。

甚至在服務刻意連結網際網路時,必須將與服務之間的通訊限制為目標使用者群組,並在 SSH 或 HTTPS 等安全的通道上進行,以保護機密資訊。

本文說明保護與 Compute Engine 執行個體 (無論是否具有外部 IP 地址) 之間通訊安全的幾種方法。

保護具有外部 IP 位址的機器上的服務

連線至沒有外部 IP 位址的執行個體

保護具有外部 IP 位址的機器上的服務

當執行個體具有公開 IP 位址時,請務必確保只有您打算公開的服務和流量是可供存取的狀態,而針對公開的服務,請務必確保所有機密資訊在傳輸過程中都能受到保護。

防火牆

您的第一道防線是使用防火牆限制誰能連至執行個體。建立防火牆規則後,即可將網路或特定通訊埠上目標機器的所有流量限制在特定來源 IP 位址。

防火牆並非獨立式解決方案。將流量限制為特定來源 IP 並無法保護機密資訊,例如登入憑證、建立或刪除資源或檔案的指令,或者記錄。在可公開存取的機器 (例如具有外部 IP 的 Google Compute Engine 執行個體) 上執行網路服務時,您必須將主機與部署執行個體之間的所有通訊加密,以確保適當的安全性。

此外,防火牆不一定會是適合的解決方案。舉例來說,沒有靜態 IP 位址的開發環境就不適合使用防火牆,例如漫遊的筆記型電腦。

HTTPS 和 SSL

針對實際工作環境網路系統,您應設定 HTTPS/SSL,方法是設定執行個體來終止 HTTPS 或設定 HTTPS 負載平衡。HTTPS/SSL 確實包含一些複雜的初始化作業,您必須執行下列工作:

如果您之前曾設定由 SSL 提供內容的網域,Google Compute Engine 應可直接採取相同做法。如果未曾設定,使用通訊埠轉送SOCKS Proxy 等其他安全性方法可能比較簡單。

透過 SSH 進行通訊埠轉送

您可以使用 gcloud 指令列工具在指定的本機通訊埠上啟動伺服器,透過 SSH 連線將所有流量轉送至遠端主機。

首先,針對提供服務的執行個體和通訊埠,請記下您要建立安全連線的執行個體和通訊埠。接下來,請執行下列指令:

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

在上述指令中,參數的定義如下:

  • example-instance 是您要連線的執行個體的名稱。
  • my-project 是您的 Google Cloud Platform 專案 ID
  • us-central1-a 是您的執行個體執行所在的區域。
  • 2222 是您正在監聽的本機通訊埠。
  • 8888 是您要連線的遠端通訊埠。

透過這些設定範例,如果您在瀏覽器中開啟 http://localhost:2222/,HTTP 連線將經由您剛建立的 SSH 通道前往遠端主機,並透過 SSH 連線至指定的執行個體,然後連線至同一部機器上的通訊埠 8888,但經由加密的安全 SSH 連線。

gcloud 指令會建立並維護 SSH 連線,而且這個方法只有在 SSH 工作階段作用中時才能使用。當您結束 gcloud 建立的 SSH 工作階段時,透過 http://localhost:2222/ 的通訊埠轉送將立即停止運作。

如要建立多個通訊埠轉送規則,您可以重複標記以在單一指令列上指定多個規則:

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

您也可以在每次建立個別通道時,執行新的 gcloud 指令。請注意,您從現有的連線新增或移除通訊埠轉送時,必須結束連線並從頭重新建立連線。

經由 SSH 的 SOCKS Proxy

如要連線至雲端部署中多個不同的主機,最簡單的做法是將瀏覽器變更為直接從網路執行查詢。這個方法可讓您使用主機的簡稱,而不需要查詢每個主機的 IP 位址、為每個服務開啟通訊埠,也不用為每個主機/通訊埠組合建立 SSH 通道。

以下是您在這裡使用的方法:

  1. 對網路上的其中一個主機設定單一 SSH 通道,並在該主機上建立 SOCKS Proxy。
  2. 將瀏覽器設定變更為透過該 SOCKS Proxy 主機執行所有查詢。

請注意,由於您正在建立讓「所有」流量經由該主機的通道,通常您不會想要使用該瀏覽器或該特定設定檔來瀏覽網路,因為這將占用雲端服務的頻寬。一般而言,您可能會想要使用獨立的瀏覽器設定檔,並視需要切換至該設定檔。

啟動 SOCKS Proxy

如要啟動 SOCKS Proxy,請執行下列指令:

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

在上述指令中,參數的定義如下:

  • example-instance 是您要連線的執行個體的名稱。
  • my-project 是您的 Google Cloud Platform 專案 ID
  • us-central1-a 是您的執行個體執行所在的區域。
  • 1080 是您正在監聽的本機通訊埠。

請注意,在這種情況下,您不需要指定遠端通訊埠。由於 SOCKS Proxy 不會繫結至任何特定遠端通訊埠,您透過 SOCKS Proxy 建立的所有連線都會解析成相對於您連線的主機。

您可以透過 SOCKS Proxy 使用執行個體的簡稱,連線至與您的 Proxy 執行個體共用 Compute Engine 網路的任何執行個體。此外,您還可以連線至指定執行個體上的任何通訊埠。

這個方法比簡單的通訊埠轉送方法更具彈性,但您也必須變更網路瀏覽器中的設定以運用 Proxy。

接著,設定 Chrome 或 Firefox 來使用 Proxy。

Chrome

根據預設,Chrome 會使用全系統 Proxy 設定,因此,您必須使用指令列標記指定不同的 Proxy。啟動 Chrome 時,根據預設會為已在執行的設定檔建立例項,因此為了讓您能同時執行多個 Chrome 複本 (其中一個複本使用 Proxy,而其他複本不使用 Proxy),您需要一個新的設定檔。

使用新設定檔啟動 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 設定檔。否則,這會影響使用該主機做為 Proxy 的所有 Firefox 執行個體,這很可能不是您想要的情況。

使用獨立設定檔執行 Firefox 之後,即可設定 SOCKS Proxy:

  1. 開啟「Preferences」(偏好設定)
  2. 按一下 [Advanced] (進階) > [Networks] (網路) > [Settings] (設定),以開啟「Connection Settings」(連線設定) 對話方塊。
  3. 選擇 [Manual proxy configuration] (手動 Proxy 設定)
    1. 在「SOCKS Host」(SOCKS 主機)區段中,填寫 localhost 做為主機,以及之前執行 gcloud 指令時選取的通訊埠。
    2. 選擇 [SOCKS v5]
    3. 選取 [Remote DNS] (遠端 DNS) 方塊。
    4. 將所有其他項目保留為空白。
  4. 按一下 [OK] (確定),然後關閉「Preferences」(偏好設定) 對話方塊。

連線至沒有外部 IP 位址的執行個體

當執行個體沒有外部 IP 位址時,只有網路上的其他執行個體、Cloud Identity-Aware Proxy 的 TCP 轉送功能或透過代管 VPN 閘道才能存取這些執行個體。您可在網路中佈建執行個體,將其做為傳入連線 (防禦主機) 或網路輸出 (NAT 閘道) 的信任轉送來源。如果是不需要設定這類連線的較透明化連線,您可以使用代管 VPN 閘道資源。

防禦主機

防禦主機提供外部進入點,以進入包含私人網路執行個體的網路。這個主機可提供單一防禦或稽核點,您可啟動及停止該主機以啟用或停用來自網際網路的傳入 SSH 通訊。

防禦主機架構

您可以使用防禦主機連線至沒有外部 IP 位址的執行個體。這個方法可讓您連線至開發環境或管理外部應用程式的資料庫執行個體,無須設定額外的防火牆規則。

防禦主機的完整強化做法不在本文的探討範圍內,但一些可執行的初始步驟包括:

  • 限制可與防禦主機進行通訊的來源 IP 的 CIDR 範圍。
  • 將防火牆規則設定為僅允許來自防禦主機的私人執行個體 SSH 流量。

預設會將執行個體上的 SSH 設定為使用私人金鑰進行驗證。使用防禦主機時,您可以先記錄至防禦主機,然後記錄至目標私人執行個體。由於這個雙步驟登入方式 (這就是防禦主機有時也稱為「跳板機」的原因),您應使用 ssh 轉送,而不是將目標機器的私人金鑰儲存在防禦主機上以做為存取目標機器的方法。即使您將同一個金鑰組用於防禦主機和目標執行個體,也必須這麼做,因為防禦主機只能直接存取金鑰組的公開部分。

如要瞭解如何使用防禦主機執行個體連線至 Google Cloud Platform 網路上的其他執行個體,以及瞭解如何使用 ssh 轉送,請參閱連線至沒有外部 IP 位址的執行個體一節。

適用於 TCP 轉送的 Cloud IAP

將 SSH 與 Cloud IAP 的 TCP 轉送功能搭配使用會將 SSH 連線包裝在 HTTPS 之內包。然後,Cloud IAP 的 TCP 轉送功能會將其傳送至遠端執行個體。

如要瞭解如何使用 Cloud IAP 連線至遠端執行個體,請參閱使用 Cloud IAP 進行 TCP 轉送一文。

VPN

Cloud VPN 可讓您透過 VPN 閘道裝置的 IPsec 連線,將現有網路連線至 Google Cloud Platform 網路。這可讓流量從內部部署直接轉送至 Compute Engine 執行個體的私人 IP 介面。當流量透過 Google 的公開連結傳輸時,會將流量加密。

要進一步瞭解如何搭配 Compute Engine 建立、設定及使用 VPN,請參閱 Cloud VPN 說明文件。

要瞭解如何透過現有 VPN (而不是透過執行個體的外部 IP 位址) 連線至 Cloud Platform 網路上的執行個體,請參閱連線至沒有外部 IP 位址的執行個體一節。

使用 NAT 閘道的流量輸出

當執行個體未獲派外部 IP 位址時,則無法直接連線至外部服務,包括其他 Cloud Platform 服務。如要允許這些執行個體連至公開網際網路上的服務,您可以建立並設定 NAT 閘道機器,其可代表網路上的任何執行個體轉送流量。請注意,單一執行個體不應視為可用性高,而且無法支援多個執行個體的高流量總處理量。

互動式序列主控台存取權

當執行個體沒有外部 IP 位址時,為了進行疑難排解或維護,您可能仍須與執行個體互動。您可以選擇設定防禦主機,但您的需求可能不值得進行更多設定。如要針對沒有外部 IP 位址的執行個體進行疑難排解,請考慮啟用對序列主控台的互動式存取權,這可讓您使用 SSH 與執行個體的序列主控台進行互動,並對序列主控台執行指令。

如要瞭解詳情,請參閱與序列主控台互動一文。

HTTPS 和 SSL Proxy 負載平衡器

做為 HTTPS 和 SSL Proxy 負載平衡器後端的執行個體不必具有透過負載平衡器存取的外部 IP 位址。如要直接存取這些資源,您需要使用連線至沒有外部 IP 位址的執行個體中列出的方法。

如要瞭解詳情,請參閱相關負載平衡器的負載平衡說明文件

自行試用其他 Google Cloud Platform 功能。請參考我們的教學課程

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件