教學目標

學習 Google Cloud Platform 的心得分享,初步了解在 Google Cloud 中建立安全連線的重點概念。

重點概念

首先當企業在 Compute Engine 的虛擬機器中開發專案時,將能夠透過多種方式讓建立來自網際網路的安全連線。在 Google Cloud 中不論是否有外部 IP 的虛擬機器皆能夠建立安全連線,當針對有外部 IP 的虛擬機器建立安全連線,主要有四種的方式,分別為 Firewalls、HTTPS and SSL、Port forwarding over SSH 和 SOCKS proxy over SSH,而當針對沒有外部 IP 的虛擬機器建立安全連線,主要有六種方式,分別為 Bastion hosts and SSH forwarding、IAP for TCP forwarding、VPN、NAT gateway for egress、Interactive serial console access 和 HTTPS and SSL proxy load balancers。此時我們需要針對不同的情境選擇最適合的安全連線的方式,實務應用中,則建議使用 IAP for TCP forwarding 透過 Google 帳號建立安全連線存取 Compute Engine 中的虛擬機器。

接著建立安全連線第一道防線主要是防火牆,透過建立防火牆規則限制所有連線至目標機器的來源 IP 位置的流量,但是個人工作筆電的 IP 位置通常是動態,因此防火牆無法充分滿足安全連線的需求。當防火牆開通之後,我們還需要確保安全連線,這時就會使用 HTTPS/SSL 建立安全連線,確保所有傳輸的資料皆被加密保護,請注意如果要建立 HTTPS/SSL 安全連線,則必須要先註冊網域名稱、從憑證頒發機制取得 SSL 憑證,以及設定 SSL 憑證至負載平衡器或虛擬機器中。此外除了建立 HTTPS/SSL 安全連線之外,我們更能夠建立 SSH 安全連線,又稱為 SSH Tunnel,主要有 Port Forwarding 和 SOCKS Proxy 兩種方式,主要皆是在個人工作筆電上透過 gcloud 工具建立 SSH Tunnel 的安全連線,其中 Port Forwarding 需要針對每個連接埠個別建立 SSH Tunnel 安全連線,而 SOCKS 雖然不需要針對每個連接埠個別建立 SSH Tunnel 安全連線,但是需要透過瀏覽器進行設定,像是 Cloud Dataproc 叢集主要包含核心 Apache Hadoop 和 Apache Spark 開放原始碼元件提供網頁 UI,透過網站介面將能夠用於管理及監控叢集資源和設施,此時如果使用 SOCKS Proxy 方式,則主要是透過「http://cluster-name-m:port」存取在主要執行個體上執行的遠端 UI 介面,但是如果使用 Port Forwarding 方式時,則是透過「http://localhost:port」存取主要執行個體的網頁應用程式 UI 介面,因此透過 SOCKS Proxy 方式將會比 Port Forwarding 方式更適合可存取所有網頁應用程式連接埠,而不必為每個 UI 連接埠設定 Port Forwarding 方式,並且能夠讓 Spark 和 Hadoop 網頁應用程式 UI 介面正確解析 DNS 名稱。

再來當虛擬機器沒有外部 IP 位置時,則我們能夠透過 Bastion hosts 虛擬機器提供外部連接點建立 SSH Tunnel 的安全連線,當連線至 Bastion hosts 虛擬機器之後,就能夠存取內部虛擬機器,通常我們又稱該虛擬機器為跳板機。更進一步 Google Cloud 有提供 IAP for TCP forwarding 的方式,其主要就是透過 HTTPS 安全連線中的 TCP 連線協定建立 SSH 連線至內部虛擬機器,其中主要會使用 Cloud IAP、Cloud IAM 和 Compute Engine 等雲端服務,請注意當需使用 IAP for TCP forwarding 的方式進行 SSH 或 RDP 遠端連線時,則必須設定防火牆規則「default-allow-rdp」和「default-allow-ssh」這兩個防火牆規則的來源 IP 範圍為「35.235.240.0/20」,而非「0.0.0.0/0」,並且透過 gcloud 工具設定「roles/iap.tunnelResourceAccessor」的存取權限給使用者和群組,以及將內部虛擬機器的外部 IP 設為「無」。當完成上述設定之後,如果虛擬機器是 Linux 作業系統,則我們就能夠直接透過 gcloud 工具執行「gcloud compute ssh INSTANCE_NAME」的指令透過 IAP Tunnel 安全連線至內部虛擬機器進行操作,請注意如果虛擬機器沒有外部 IP,則會自動使用 IAP Tunnel 安全連線,但是如果有外部 IP,則會發生錯誤,因為如果虛擬機器有外部 IP,則會使用外部 IP 進行安全連線,除非加上「–tunnel-through-iap」強制使用 IAP Tunnel 安全連線至 Linux 作業系統。此外如果虛擬機器是Windows 作業系統,則我們需要在個人工作筆電上透過 gcloud 工具執行「gcloud compute start-iap-tunnel INSTANCE_NAME INSTANCE_PORT –local-host-port=localhost:LOCAL_PORT 」的指令建立 IAP Tunnel 安全連線,當安全連線建立完成之後,此時就能夠透過遠端連線工具連線至「localhost:LOCAL_PORT」個人工作筆電上所設定的本機連接埠,就能夠透過 IAP Tunnel 安全連線至 Windows 作業系統。

最後如果我們使用 IAP for TCP forwarding 的方式進行安全連線,則有頻寬和連線長度的限制。所謂頻寬主要是指 IAP for TCP forwarding 的方式並不適用於大量資料移轉,Cloud IAP 會保留限制使用者使用頻寬上限,以防止濫用這項服務的權利,所以若是有檔案上傳的需求,則建議不要透過 IAP Tunnel 安全連線的方式進行檔案上傳處理,而是優先考慮 Cloud Storage 相關檔案上傳操作,至於所謂連線長度主要是指 Cloud IAP 除非必須進行維護作業,否則不會中斷使用中工作階段的連線,如果應用程式中有使用 IAP Tunnel 安全連線進行指令操作時,則建議當發生中斷時,會自動重新建立 IAP Tunnel 安全連線。

總結當企業在 Compute Engine 上開發專案時,將能夠透過多種方式讓建立來自網際網路的安全連線,其中非常建議使用 IAP for TCP forwarding 的方式建立 IAP Tunnel 的安全連線,以及能夠透過 Cloud IAM 控管使用者存取權限,僅有符合權限的使用者才能夠透過個人工作筆電安全連線至內部虛擬機器。

相關資源