本頁面說明如何使用 Identity-Aware Proxy (IAP) TCP 轉送功能,為沒有外部 IP 位址,或不允許直接透過網際網路存取的 VM 執行個體,啟用管理員權限。
IAP TCP 轉送功能可讓您建立加密通道,將 SSH、遠端桌面協定和其他流量轉送至 VM 執行個體。IAP TCP 轉送功能也能讓您精細控管哪些使用者可以建立通道,以及使用者可以連線至哪些 VM 執行個體。
如要進一步瞭解 IAP TCP 轉送的運作方式,請參閱 TCP 轉送總覽。
為 IAP TCP 轉送功能準備專案
本節將逐步說明如何在 Google Cloud 專案中啟用 IAP TCP 轉送功能。
建立防火牆規則
如要允許 IAP 連線至您的 VM 執行個體,請根據以下條件建立防火牆規則:
- 套用至所有您希望能透過 IAP 存取的 VM 執行個體。
- 允許來自 IP 範圍「
35.235.240.0/20
」的輸入流量。這個範圍包含 IAP 用於 TCP 轉送的所有 IP 位址。針對 IPv6 VM,請使用以下 IP 範圍:
2600:2d00:1:7::/64
。 - 允許連線至您希望透過 IAP TCP 轉送功能存取的所有通訊埠,例如適用於 SSH 的通訊埠「
22
」,及適用於 RDP 的通訊埠「3389
」。
主控台
如要允許透過 RDP 和 SSH 存取網路中的所有 VM 執行個體,請按照下列步驟操作:
- 開啟「Firewall Rules」(防火牆規則) 頁面。
其餘步驟會顯示在 Google Cloud 控制台。
- 選取 Google Cloud 專案。
操作示範 。 - 在「Firewall Rules」(防火牆規則) 頁面中,按一下
「Create firewall rule」(建立防火牆規則) 。 - 進行下列設定:
- Name (名稱):
allow-ingress-from-iap
- Direction of traffic (流量方向):「Ingress」(輸入)
- Target (目標):「All instances in the network」(網路中的所有執行個體)
- Source filter (來源篩選器):「IP ranges」(IP 範圍)
- Source IP ranges (來源 IP 範圍):
35.235.240.0/20
- 「Protocols and ports」 (通訊協定和通訊埠):選取「TCP」並輸入
22,3389
,以允許 RDP 和 SSH。
- Name (名稱):
- 按一下 [建立]。
gcloud
如要允許透過遠端桌面協定存取網路中的所有 VM,請執行:
gcloud compute firewall-rules create allow-rdp-ingress-from-iap \ --direction=INGRESS \ --action=allow \ --rules=tcp:3389 \ --source-ranges=35.235.240.0/20
如要取得 SSH 存取權,請執行以下指令:
gcloud compute firewall-rules create allow-ssh-ingress-from-iap \ --direction=INGRESS \ --action=allow \ --rules=tcp:22 \ --source-ranges=35.235.240.0/20
如要使用其他通訊協定,請執行
gcloud compute firewall-rules create allow-ingress-from-iap \ --direction=INGRESS \ --action=allow \ --rules=tcp:PORT \ --source-ranges=35.235.240.0/20
其中 PORT
是通訊協定使用的通訊埠。
授予 IAP TCP 轉送的角色
如要控管哪些使用者和群組可以使用 IAP TCP 轉送功能,以及他們可以連線至哪些 VM 執行個體,請授予專案適當的 Identity and Access Management (IAM) 角色。
如果您使用 OS 登入 (建議),請參閱「在使用者帳戶上設定 OS 登入角色」。
下表列出您需要授予信任的管理員,以便執行 TCP 轉送和相關工作時使用的預先定義角色:
工作 | 角色 | 更多資訊 |
---|---|---|
TCP 轉送 |
受 IAP 保護的通道使用者 (roles/iap.tunnelResourceAccessor )
|
請參閱「將存取權授予專案中的所有 VM 執行個體」或「將存取權授予特定 VM」。 |
SSH 存取 |
Compute 執行個體管理員 (v1) (roles/compute.instanceAdmin.v1 )
|
|
使用服務帳戶 | 服務帳戶使用者 (roles/iam.serviceAccountUser ) |
請參閱「 serviceAccountUser 角色」。 |
如果您只想建立具備此工作所需特定權限的自訂角色,請參閱「權限詳細資料」。
您可以將專案中的所有 VM 執行個體或特定 VM 的存取權授予使用者或群組,具體取決於您授予必要角色的方式。
不支援標記
目前不支援使用標記授予 IAP TCP 轉送功能的權限。
將存取權授予專案中的所有 VM 執行個體
您可以在專案層級授予必要的 IAM 角色,藉此將專案中的所有 VM 執行個體存取權授予使用者或群組:
主控台
- 在 Google Cloud 控制台中開啟「IAM & Admin」(IAM 與管理) 頁面。
其餘步驟會顯示在 Google Cloud 控制台。
- 在「IAM & admin」(IAM 與管理) 頁面上,按一下「Add」(新增) 並設定下列選項:
- 「New principals」(新增主體):指定您要授予存取權的使用者或群組。
- 「Select a role」(選取角色):依序選取「Cloud IAP」>「IAP-Secured Tunnel User」(受 IAP 保護的通道使用者)。
- 視需要按一下「Add Conditions」(新增條件) 並設定條件:
- Title (名稱):輸入條件名稱。
- Expression (運算式):輸入使用者必須符合哪項條件,才能取得「受 IAP 保護的通道使用者」角色的權限。
舉例來說,下列 CEL 運算式只會授予通訊埠 22 的存取權:
destination.port == 22
您也可以根據存取層級授予存取權:
destination.port == 22 && "FULL_ACCESS_LEVEL_NAME" in request.auth.access_levels
其中
FULL_ACCESS_LEVEL_NAME
是現有的存取層級,採用下列格式:accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
- 按一下「Add another role」(新增其他角色),然後進行下列設定:
- 在「Select a role」(選取角色) 中,依序選取「Compute Engine」>「Compute Instance Admin (v1)」(Compute 執行個體管理員 (v1))。
- 按一下 [儲存]。
gcloud
執行下列指令,將這兩個角色授予使用者:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:EMAIL \ --role=roles/iap.tunnelResourceAccessor gcloud projects add-iam-policy-binding PROJECT_ID \ --member=user:EMAIL \ --role=roles/compute.instanceAdmin.v1
更改下列內容:
PROJECT_ID
:專案 IDEMAIL
:您要授予存取權的使用者電子郵件地址,例如user@example.com
。
授予特定 VM 的存取權
如要將特定 VM 的存取權授予使用者或群組,您必須在該 VM 上授予 roles/iap.tunnelResourceAccessor
角色。其他角色必須在專案中授予。
主控台
- 開啟 IAP 管理員頁面,然後選取「SSH and TCP Resources」(SSH 和 TCP 資源) 分頁標籤。
其餘步驟會顯示在 Google Cloud 控制台。
- 在 IAP 管理員頁面的「SSH and TCP Resources」(SSH 與 TCP 資源) 分頁中,選取要設定的 VM 執行個體。
- 如果畫面上未顯示資訊面板,請按一下「Show info panel」(顯示資訊面板)。
按一下「Add principal」(新增主體),然後進行以下設定:
- 「New principals」(新增主體):指定您要授予存取權的使用者或群組。
- 「Select a role」(選取角色):依序選取「Cloud IAP」>「IAP-Secured Tunnel User」(受 IAP 保護的通道使用者)。
視需要按一下「Add Conditions」(新增條件) 並設定條件:
- Title (名稱):輸入條件名稱。
- Expression (運算式):輸入使用者必須符合哪項條件,才能取得「受 IAP 保護的通道使用者」角色的權限。
舉例來說,下列 CEL 運算式只會授予通訊埠 22 的存取權:
destination.port == 22
您也可以根據存取層級授予存取權:
destination.port == 22 &&
"FULL_ACCESS_LEVEL_NAME" in request.auth.access_levels其中
FULL_ACCESS_LEVEL_NAME
是現有的存取層級,採用accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME
格式。- 按一下 [儲存]。
API
如要編輯應用程式的 policy.json
檔案,請遵循下列程序。如要進一步瞭解如何使用 IAM API 管理存取政策,請參閱「管理受 Chrome Enterprise 進階版保護資源的存取權」一文。
匯出下列變數。
export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/PROJECT_NUMBER/iap_tunnel # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy export JSON_NEW_POLICY=POLICY_FILE.JSON
使用
getIamPolicy
方法取得 Compute Engine 執行個體的 IAM 政策。結尾的空資料位元會將curl
要求轉換為 POST,而不是 GET。curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \ ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \ -d ''
修改 IAM 政策 JSON 檔案,將
iap.tunnelResourceAccessor
角色授予您的授權對象。您也可以選擇根據 IAM 條件和存取層級,只將角色授予符合特定條件的主體。
以下是編輯後的
policy.json
檔案範例,會將iap.tunnelResourceAccessor
角色授予 VM 執行個體管理員群組,為其授予 Chrome Enterprise Premium 安全通道資源的存取權。新增 IAM 條件,讓只有 VM 執行個體管理員群組中的主體可以存取資源,這些主體的私人 IP 位址為10.0.0.1
,位於22
連接埠,並使用destination.ip
和destination.port
IAM 條件。並且必須符合 ACCESS_LEVEL_NAME 存取層級的規定。請注意,如果主體具有Owner 角色,則有權使用 IAP 進行 TCP 轉送。
範例 policy.json 檔案{ "policy": { "bindings": [ { "role": "roles/iap.tunnelResourceAccessor", "members": ["group:instance-admins@example.com"], "condition": { "expression": "\"accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME\" in request.auth.access_levels && destination.ip == \"10.0.0.1\" && destination.port == 22", "title": "CONDITION_NAME" } } ] } }
如要尋找政策名稱,請呼叫
accessPolicies.list
:GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
使用
setIamPolicy
方法設定新的policy.json
檔案。curl -i -H "Content-Type:application/json" \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:setIamPolicy \ -d @${JSON_NEW_POLICY}
權限詳細資料
必要權限會因使用者使用 IAP TCP 轉送功能的方式而有所不同:
情境 | 必要權限 | |
---|---|---|
全部 |
|
|
正在使用 gcloud compute [start-iap-tunnel, ssh, scp] |
|
|
正在使用 gcloud compute [ssh, scp] |
|
|
使用 OS 登入的 VM | 請參閱這篇文章的操作說明 | |
不使用 OS 登入 |
|
|
使用服務帳戶透過 SSH 連線至 VM |
|
|
在瀏覽器中建立安全殼層連線 | 請參閱這篇文章的操作說明 |
舉例來說,如果使用者想使用 gcloud compute ssh
連線至不使用 OS 登入功能,但使用服務帳戶的 VM,則需要下列權限:
iap.tunnelInstances.accessViaIAP
compute.instances.get
compute.instances.list
compute.projects.get
compute.instances.setMetadata
compute.projects.setCommonInstanceMetadata
compute.globalOperations.get
iam.serviceAccounts.actAs
建立 SSH 通道
您可以透過 IAP 建立 SSH 流量通道,連線至沒有外部 IP 位址的 Linux 執行個體。
使用 IAP 隧道時,IAP 代理會連線至 VM 上 nic0
的主要內部 IPv4 位址。
主控台
如要連線至執行個體,請使用Google Cloud 主控台中的 SSH 按鈕。執行個體的存取設定 (透過 IAM 權限定義) 必須允許透過 IAP 進行 TCP 隧道。
gcloud
如要連線至執行個體,請使用 gcloud compute ssh
指令。執行個體的存取設定 (透過 IAM 權限定義) 必須允許 TCP 透過 IAP 進行通訊。
gcloud compute ssh INSTANCE_NAME
將 INSTANCE_NAME 替換為要 SSH 前往的執行個體名稱。
如果執行個體沒有外部 IP 位址,連線會自動使用 IAP TCP 通道。如果執行個體有外部 IP 位址,連線會使用外部 IP 位址,而不是 IAP TCP 通道。
您可以使用 --tunnel-through-iap
標記,讓 gcloud compute ssh
一律使用 IAP TCP 隧道。
請使用 --internal-ip
標記,讓 gcloud compute ssh
永遠不會使用 IAP TCP 通道,而是直接連線至 VM 的內部 IP。這項操作對於與目標 VM 連線至相同虛擬私有雲網路的用戶端而言相當實用。
IAP Desktop
您可以使用 IAP Desktop,透過 SSH 和 IAP TCP 轉送連線至 VM 執行個體。
在應用程式中,依序選取「File」 >「Add Google Cloud project」。
輸入專案 ID 或名稱,然後按一下「確定」。
在「Project Explorer」視窗中,以滑鼠右鍵按一下要連線的 VM 執行個體,然後選取「Connect」。
如要進一步瞭解 IAP Desktop,請參閱 GitHub 專案頁面。
PuTTY 應用程式
您可以設定 PuTTY Windows 終端機模擬器應用程式,讓該應用程式使用 IAP TCP 轉送功能連線至 VM 執行個體。執行個體的存取設定 (透過 IAM 權限定義) 必須允許透過 IAP 建立 TCP 通道。
設定 PuTTY 應用程式前,請先使用 gcloud compute ssh
指令一次,確保本機電腦上有私密安全殼層 (SSH) 金鑰,且公開安全殼層 (SSH) 金鑰已發布至 Compute Engine:
開啟指令提示字元並執行下列指令,連線至 VM 執行個體:
gcloud compute ssh INSTANCE_NAME ` --tunnel-through-iap ` --project PROJECT_ID ` --zone ZONE
更改下列內容:
- INSTANCE_NAME:要連線的執行個體名稱
- PROJECT_ID:VM 執行個體所在專案的專案 ID
- ZONE:VM 執行個體所在區域
如有需要,請按下
Y
確認是否要產生安全殼層金鑰。請在 VM 上執行下列指令,判斷您的使用者名稱:
whoami
您稍後會需要這個使用者名稱。
您現在可以設定 PuTTY 應用程式,以便使用 IAP TCP 轉送功能:
- 開啟 PuTTY 應用程式,然後依序選取「Connection」 >「Proxy」。
設定下列 Proxy 設定:
- 在「Proxy type」(Proxy 類型) 中,選取「Local」(本機)。
在「Telnet 指令或本機 Proxy 指令」欄位中輸入以下內容:
gcloud.cmd compute start-iap-tunnel %host %port --listen-on-stdin --project PROJECT_ID --zone ZONE
更改下列內容:
- PROJECT_ID:VM 執行個體所在專案的專案 ID
- ZONE:VM 執行個體所在區域
針對「在終端機視窗中列印 Proxy 診斷資訊」,請選取「僅在工作階段開始前」。
依序選取「Connection」 >「SSH」 >「Auth」。
按一下「瀏覽」並貼上下列檔案名稱,然後點選「開啟」:
%USERPROFILE%\.ssh\google_compute_engine.ppk
選取「工作階段」類別。
設定下列 Proxy 設定:
在「主機名稱 (或 IP 位址)」欄位中輸入以下內容:
USERNAME@INSTANCE_NAME
更改下列內容:
- USERNAME:您先前指定的 Linux 使用者名稱
- INSTANCE_NAME:您要連線的 VM 執行個體名稱
已儲存的工作階段:輸入工作階段名稱。
按一下 [儲存]。
按一下「Open」,即可開始 SSH 工作階段。
ssh
您可以直接使用 ssh 指令,搭配使用 gcloud
啟動隧道的 ProxyCommand
選項。使用這個指令產生完整的 ssh
指令:
gcloud compute ssh INSTANCE_NAME --dry-run
建立 RDP 連線通道
您可以透過 IAP 建立遠端桌面通訊協定通道,連線至沒有外部 IP 位址的 Windows 執行個體:
IAP Desktop
您可以使用 IAP Desktop,透過 IAP TCP 轉送連線至一或多個 VM 執行個體的遠端桌面。
在應用程式中,依序選取「File」 >「Add Google Cloud project」。
輸入專案 ID 或名稱,然後按一下「確定」。
在「Project Explorer」視窗中,以滑鼠右鍵按一下要連線的 VM 執行個體,然後選取「Connect」。
如要進一步瞭解 IAP Desktop,請參閱 GitHub 專案頁面。
gcloud
如要連線至 VM 執行個體的遠端桌面,請先建立隧道。
使用
gcloud compute start-iap-tunnel
指令,為 VM 執行個體的 RDP 通訊埠建立加密通道。gcloud compute start-iap-tunnel INSTANCE_NAME 3389 \ --local-host-port=localhost:LOCAL_PORT \ --zone=ZONE
將 INSTANCE_NAME 替換為您要連線的 VM 執行個體名稱。將 LOCAL_PORT 替換為您要將 Proxy 繫結至的本機端口,或使用 0 讓系統自動選取未使用的端口。將 ZONE 替換為 VM 執行個體所在的區域。
gcloud
會對 VM 執行個體執行連線測試,然後開啟隧道並顯示連接埠號碼。Listening on port [LOCAL_PORT].
所有傳送至 localhost:LOCAL_PORT 的流量都會轉送至 VM 執行個體。只有在本機電腦上執行的應用程式才能存取此連接埠。
讓
gcloud
繼續執行,並開啟 Microsoft Windows 遠端桌面連線應用程式。輸入通道端點做為電腦名稱:
localhost:LOCAL_PORT
將 LOCAL_PORT 替換為
gcloud
開啟通道時顯示的通訊埠編號。按一下「連線」。
建立其他 TCP 連線的通道
您可以使用 gcloud compute start-iap-tunnel
指令來分配本機通訊埠,藉此將 IAP TCP 轉送用於其他以 TCP 為基礎的通訊協定。本機通訊埠可透過通道,以 HTTPS 串流的方式將資料流量從本機電腦傳送至遠端電腦,IAP 接著會接收這些資料、套用存取控制,並將已解開包裝的資料轉送至遠端通訊埠。反之,來自遠端通訊埠的資料會經過包裝,再傳送至本機通訊埠並解開包裝。
gcloud
建立 VM 執行個體通訊埠的加密通道:
gcloud compute start-iap-tunnel INSTANCE_NAME INSTANCE_PORT \ --local-host-port=localhost:LOCAL_PORT \ --zone=ZONE
將 INSTANCE_NAME 和 INSTANCE_PORT 替換為您要連線的 VM 執行個體名稱和通訊埠。將 LOCAL_PORT 替換為您要將 Proxy 繫結到的本機端口。將 ZONE 替換為 VM 執行個體所在的區域。
gcloud
會對 VM 執行個體執行連線測試,然後開啟隧道並顯示連接埠號碼。
Listening on port [LOCAL_PORT].
所有傳送至 localhost:LOCAL_PORT 的流量都會轉送至 VM 執行個體。只有在本機電腦上執行的應用程式才能存取這個通訊埠。
提高 IAP TCP 上傳頻寬
如要提高 IAP TCP 上傳頻寬,請考慮在安裝 gcloud CLI 的同一台機器上安裝 NumPy。
Linux
如要在 Unix 平台上使用 pip 安裝 NumPy,請在新的終端機例項中執行下列指令:
$(gcloud info --format="value(basic.python_location)") -m pip install numpy
如果安裝 NumPy 後仍持續顯示錯誤訊息,請完成下列步驟: 執行下列指令,允許 gcloud 存取外部套件:
export CLOUDSDK_PYTHON_SITEPACKAGES=1
Windows
如要在 Windows 平台上使用 pip 安裝 NumPy,請在新的 PowerShell 例項中執行下列指令:
start (gcloud info --format="value(basic.python_location)") "-m pip install numpy"
如果安裝 NumPy 後仍持續顯示這則訊息,則必須採取其他步驟。執行下列指令,允許 gcloud 存取外部套件:
$env:CLOUDSDK_PYTHON_SITEPACKAGES="1"
已知限制
頻寬:IAP 的 TCP 轉送功能不適用於大量轉移資料。IAP 保留限制使用者使用頻率上限以防其濫用這項服務的權利。
連線長度:IAP 會在閒置一小時後自動中斷工作階段。目前,如果通道中斷連線,gcloud compute start-iap-tunnel
會嘗試重新建立通道。
後續步驟
- 套用存取層級,設定更精細的情境規則。
- 啟用 Cloud 稽核記錄,即可查看存取要求。
- 進一步瞭解 IAP。