文章段落
你還在用 VPN 連線與跳板機提升遠端連線安全嗎?其實比起前2種方法,Google 推出的 Cloud IAP,當中的 TCP-Forwarding 功能藉由 HTTPS 加密連線和 IAM 權限判讀,能讓我們直接不透過外部 IP,用更短的時間建立安全的遠端連線!下面就讓我們一起來認識 Cloud IAP 的 TCP-Forwarding 功能吧!
Cloud IAP 的 TCP-Forwarding 是什麼?
在上篇文章《比 SSH 連線 GCE 更好管理!輕鬆以 OS Login 掌握用戶資訊》中我們提到使用 OS Login 作為登入用戶的權限控管方式,而透過它我們可以確保所有用戶都是在 IAM 的識別核准下登入的。而在《[DDoS大作戰] BeyondCorp實作 – 設定 Cloud IAP 完全封鎖外部異常流量》裡,我們也提過使用 Identity-Aware Proxy(IAP)做網頁應用登入的身份驗證代理服務,並且解釋了 Google 所提倡的零信任企業安全模型 BeyondCorp。前者讓我們得以追蹤登入主機的用戶名稱並限制其權限,後者則透過身份驗證與情境感知的方式來限制用戶進入應用程式的權限。
使用 OS Login 需要給予 VM 外部 IP 才能讓外部用戶訪問 VM,並透過 IAM 去查核用戶權限。此舉雖然可有效認證用戶權限,但暴露的 IP 位置仍會給 VM 帶來資安的隱憂。而 IAP 則是能在進入應用位置前先驗證用戶身份再予進入許可,但卻只針對網頁應用程式使用。所以我們不禁想問,有沒有什麼兩全其美的服務讓用戶在登入 VM 時能不透過外部 IP,直接以身份驗證做資源的存取許可指認呢?當然有,所以在此隆重為大家介紹 IAP TCP-Forwarding!
如何快速建立安全的網路環境
我們都知道讓 IP 暴露在外面是非常危險的,所以為了避免給主機外部 IP 且仍能具備登入能力,通常我們會使用 VPN Connection 的方式讓雲端能直接與地端建立私密連線,或使用 Bastion Host(俗稱跳板機)來獲得內網的連線能力。 但這兩種方式都需要花費額外的時間進行設置,同時也可能產生其他資安疑慮或增加維護管理的困難。
IAP TCP-Forwarding 藉由聽取指定的本機 Port 來創建 TCP 通道,將流量封包以 HTTPS 加密連線至 IAP 節點,並藉由 IAM 權限的判讀來做轉發進入服務的許可控管。整個過程因為是透過 IAP 轉發,所以只需 VM 的內部 IP 即可完成連線。因此透過 IAP TCP-Forwarding,我們不需再串接 VPN 或創建跳板機,直接在本機開啟與 VM 對接的通道即可。
Cloud IAP 的 TCP-Forwarding 支援哪些情境?
由於 IAP TCP-Forwarding 是由本機透過指定的 Port 與 IAP 對接,用戶可自行決定用於連線的 TCP Port,不受限於 22 或 3389 Port。此外 Cloud IAP 以 IAM 作為查驗權限的閘口,我們可以自行設定用戶的登入權限與內容感知。比如我們希望限制非台灣地區的用戶登入,就可以透過 IAP 權限設置進行篩選條件的設定。這樣一來,當我們使用 IAP ,就能最小化外部登入的許可範圍,大大增加雲端環境的安全性。
而在本篇文章中,我們將帶領大家操作使用 IAP TCP-Forwarding 從本地端連接無外部 IP 的 VM,並操作 Linux 與 Windows OS 各兩種登入方式,讓大家直接體會 IAP 的安全性與設置便利性,那麼我們就馬上開始吧!
建置 Linux IAP TCP-Forwarding 的兩種 SSH 登入方法
在這個階段我們要來為專案設置 IAP TCP-Forwarding,並試著透過 Cloud SDK 與 GCP Web SSH 來登入無外部 IP 的 Linux VM,還沒安裝 Cloud SDK 或是不知道怎麼使用 gcloud ssh 指令進行登入的朋友可以參考《比 SSH 連線 GCE 更好管理!輕鬆以 OS Login 掌握用戶資訊》來設置,對 VM 網路環境設置不熟悉的朋友則可閱讀《第一次開Google VM要注意什麼?Compute Engine開機詳細介紹》裡的「Network 網路相關設定」,那下面就馬上進入正題吧!
觀察沒使用 TCP-Forwarding 的內部 VM
首先我們要來看看在沒有外部 IP 的情況下,使用 GCP Console 與 Cloud SDK 來以 SSH 登入 Linux 主機會發生什麼事。點擊 Compute Engine > VM Instances 可以看到當前建立的 VM。我們可以看到沒有外部 IP 的 VM,其 SSH 連線按鈕會出現反灰無法點選的狀態,並提示我們需要指派外部 IP 才能使用。再來我們使用 gcloud compute ssh <VM名稱> 指令,發現提示訊息說明沒有找到外部 IP,預設將使用 IAP tunneling,而後又出現 start-iap-tunnel 的連線錯誤訊息,告訴我們沒有得到授權。
從上面兩個觀察的結果,習慣使用 Web SSH 的朋友,可能第一個反應就是去指派外部 IP 給 VM,進而提升資安危險性。而透過使用 Cloud SDK 我們得知,在沒有外部 IP 的情況下,GCP 才會去使用 IAP Tunnel(除非手動創建 IAP Tunnel)。所以如果我們給 VM 掛上外部 IP ,這樣即便我們設置了 IAP TCP-Forwarding ,GCP 還是會優先使用外部 IP 作為連線方式,這點要特別的注意!
設定 Cloud IAP 的 TCP-Forwarding 專用防火牆
理解了以上的錯誤連線訊息後,我們就要正式為專案開通 IAP TCP-Forwarding 服務。首先,由於 IAP TCP-Forwarding 是透過 IAP 轉發 TCP 流量,所以我們需要針對從 IAP 到 VM 的流量設置防火牆。在這裡我們設置來源 IP range 為 「35.235.240.0/20」,而 Protocols 與 Ports 在這裡則為了方便設為 Allow all,讀者可自行依使用的連線方式調整。
設置 IAM 權限並開啟 IAP 服務
剛剛我們提到, IAP 會透過 IAM 來檢查登入用戶的權限,進而管理操作人員的進入,而我們知道 IAM 能在 Organization、Project、Instance 層級授與用戶權限。所以為了最小化權限的賦予,我們可以在 Project 層級給予用戶 Compute Instance Admin(v1)作為針對 VM 操作行為的角色賦予。而如果需要用到 VM 的 Service Account 來操作,在這邊也要記得給 Service Account User 角色。
上面的 IAM 角色主要是針對操作 VM,並不涉及 IAP TCP-Forwarding 的使用權限。接下來我們就要來設定 IAP 相關的服務啟用,首先我們進到 Security > Identity-Aware Proxy,並切換分頁至 SSH AND TCP RESOURCES。在這裡我們可以觀察到下方列出了所有的 VM 資源,我們可分別控管個別 VM 的 IAP 啟用,或直接對 Subnet 乃至 Project 內的所有資源進行控管。我們可以勾選要啟用 IAP TCP-Forwarding 的資源,並於右側點選 ADD PRINCIPAL 來設置 IAP 用戶。
如前面所提,當今天用戶在地端主機開啟 TCP 通道並進行 VM 連線,IAP 在做 Port 轉發前,會先透過 IAM 查核用戶的權限與情境感知。所以我們啟用 IAP TCP-Forwarding 的方法便是給予用戶 IAP-secured Tunnel User 這個角色作為 IAP 查核權限使用。如果希望加上情境感知或特定使用條件的話,可點選 Add condition 並設定限定條件,下圖示範限定使用 SSH 與 RDP 的 Port 作為登入條件。
使用 Cloud SDK 測試 Linux SSH 登入
以上就是 IAP TCP-Forwarding 的設定步驟,是不是很方便呢?使用 IAP 的方式讓我們可以從 IAM 層級控管 VM 管理者,同時又避免使用外部 IP 讓 VM 處於安全的內網環境,真是一石二鳥呢!接著我們就來測試使用 Cloud SDK 進行 SSH 登入。輸入 gcloud compute ssh <vm名稱> –zone <zone名稱>,即可看到在沒有外部 IP 的情況下,Cloud SDK 自動為我們創建了 TCP 通道,並且從登入的 IP 可以觀察到,使用的正是我們前面於防火牆設置的網段 IP,這代表登入 VM 必須要通過 IAP 的身份查核,才能轉發放行,大大提升了 VM 的安全性。
gcloud compute ssh <vm名稱> --zone <zone名稱>
修改 IAP-secured Tunnel User 授權層級
不知道讀者們有沒有發現,如果回到 Compute Engine > Instances 分頁,會看到 VM 的 Web SSH 按鈕仍然是反灰的狀態。這裡官方文件沒有特別提到,但如果沒有在 Project 層級賦予用戶 IAP-secured Tunnel User 這個角色,Web SSH 功能是無法使用的,所以使用前要記得別漏了這個步驟。
使用 Web Console 測試 Linux SSH 登入
接著我們可以觀察到透過 Web SSH 登入 VM 依然會透過 IAP TCP-Forwarding 進行轉發,但由於我們在 Project 層級賦予用戶 IAP-secured Tunnel User 角色,所以他就擁有了對所有資源使用 IAP 的權限。這裡我以交換一下規則,將 Compute Instance Admin(v1)轉到 Instance 層級,並在 Project 層級給予 Compute Viewer 角色,這樣沒有賦予 Admin 權限給該用戶的 VM,即便能看到 SSH 按鈕也無法登入。
建置 Windows IAP TCP-Forwarding 的兩種 RDP 登入方法
上面我們介紹了使用 IAP TCP-Forwarding 登入 Linux VM 的兩種方法,現在我們要來介紹使用 RDP 登入 Windows 的兩種方法。其中 IAP TCP-Forwarding 的設置如上所述,比較需要特別注意的是創建防火牆規則時,需允許 3389 Port 的流量進入。
下載安裝 IAP Desktop 並登入 Google Account
IAP Desktop 是一款開源的 Windows 應用程式,其內建使用 IAP TCP-Tunneling 來連接 GCP 上的 VM,讀者們可在其 Github 頁面下載。下載後我們可以直接進行安裝,記得一路確認就行了。安裝完後我們需要用 Google 帳戶登入,這裡的帳戶就是我們擁有 IAP 權限的用戶,如果讀者有開啟 2FA 認證功能的話會需要做些額外的認證。
創建本地端 Credentials 並使用 Windows IAP Desktop 測試 RDP 登入
進入軟體後, IAP Desktop 會自動為我們抓取所有有權限的 Project,而選定 Project 後出現的樹狀圖和我們在 IAP TCP-Forwarding 分頁看到的結構相同,這裡我們可以雙擊 VM 登入。如果是第一次登入,軟體會自動要求我們生成 Credentials。按照指示填入希望的本機用戶名稱後,即可獲得一組 Credential Passward,這裡可以備份起來或直接關閉,軟體會自動儲存密碼所以不用擔心。建立完 Credentials 後,只要再度雙擊 VM 即可直接連線 Remote Desktop。
創建 IAP Tunnel 連結本機與雲端 VM
最後一種連線方式不像前面幾個是自動為我們創建連線,這裡我們必須自行透過 Cloud SDK 創建一條與 IAP 連通的 Tunnel,其方法是在本地端開啟一個專用的 Port 來與 IAP 對接,而後以 HTTPS 串流封包至 IAP 轉發 Port。意思是我們可以透過這個方式來使用任何 TCP-based 的協定。
首先我們要透過 Cloud SDK 登入具備 IAP TCP-Forwarding 權限的用戶,而後輸入下方灰框裡的指令。這裡的自訂 Port 為本地端應用程式與 IAP 對接使用的 Port,可以自行設定。之後我們會用這個 Port 來做遠端 RDP 的連線。而如果正常連線,會出現正在監聽自訂 Port 的提示,反之如果沒有對應的 IAP-secured Tunnel User 角色,就會出現 4033: not authorized 錯誤,表示該通道無法被建立。
gcloud compute start-iap-tunnel <vm 名稱> <vm port> \
--local-host-port=localhost:<自訂 Port> \
--zone=<zone 名稱>
使用 Windows Remote Desktop 測試 RDP 登入
在確定通道建立成功後,不要急著關閉終端機,因為要保持連線必須讓終端機維持運作。接著我們使用 Windows 開發的 Windows Remote Desktop 作為測試第三方遠端桌面軟體連線 IAP 的測試工具,還沒安裝的讀者可以在這裡下載 Windows 版本及 MacOS版本。首先點擊上方的「+」並選擇 Add PC,而後在 PC name 欄位輸入「localhost:<自訂 Port>」,之後即可雙擊創建出來的 PC 執行遠端連線。
結論
最後來總結一下。上面我們提到了四種不同的遠端連線方式,但原理都是從本地端指定的 Port 開啟與 IAP 串流的 HTTPS 加密通道,而後以 IAM 角色查核登入者的進入權限,最後透過 IAP TCP-Forwarding 轉發給指定的 VM 登入。這樣的流程既不需要創建 VPN 或使用跳板機避免使用外部 IP,也可以準確地限定登入用戶的權限,讓雲端作業環境更加安全便利。再加上之前提到 Linux 的 OS Login 與 Windows 的 AD 服務分享,如此一來我們就能更準確地管控用戶身份了!
以上就是運用 Cloud IAP 的 TCP-Forwarding 功能,建立無外部 IP 的加密連線方法。看完後是否覺得比起設定 VPN 連線與跳板機,真的方便很多呢?大家對文章內容有任何問題都歡迎直接留言詢問,想更了解GCP 或有導入的相關需求也歡迎直接聯繫我們喔。
▋延伸閱讀:
・什麼是 Cloud IAM
・比 SSH 連線 GCE 更好管理!輕鬆以 OS Login 掌握用戶資訊
・[DDoS大作戰] BeyondCorp實作 – 設定 Cloud IAP 完全封鎖外部異常流量
・[GCP 資安攻略] GCP 資訊安全各項功能簡介