本頁面說明如何使用 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」並輸入
3389,22
,以允許 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 Login 角色。
下表列出您需要授予信任管理員的預先定義角色,才能進行 TCP 轉送和相關工作:
工作 | 角色 | 更多資訊 |
---|---|---|
TCP 轉送 |
受 IAP 保護的通道使用者 (roles/iap.tunnelResourceAccessor )
|
請參閱「將存取權授予專案中的所有 VM 執行個體」或「將存取權授予特定 VM」。 |
SSH 存取 |
Compute 執行個體管理員 (v1) (roles/compute.instanceAdmin.v1 )
|
|
使用服務帳戶 | 服務帳戶使用者 (roles/iam.serviceAccountUser ) |
請參閱 serviceAccountUser 角色。 |
如要建立自訂角色,並只授予這項工作所需的特定權限,請參閱權限詳細資料。
視授予必要角色的方式而定,您可以將專案中的所有 VM 執行個體存取權,或特定 VM 的存取權授予使用者或群組。
不支援標記
目前不支援使用 tag 授予 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 管理存取政策,請參閱「管理受 IAP 保護資源的存取權」一文。
匯出下列變數。
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 執行個體管理員群組,讓他們存取受 IAP 保護的通道資源。 已新增 IAM 條件,只有 VM 執行個體管理員群組中的主體,才能透過10.0.0.1
私人 IP 位址和22
連接埠存取資源。這項條件使用destination.ip
和destination.port
IAM 條件。 也必須符合ACCESS_LEVEL_NAME存取層級的要求。請注意,如果主體具有擁有者角色,就有權使用 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 Proxy 會連線至 VM 上 nic0
的主要內部 IPv4 位址。
主控台
如要連線至執行個體,請使用Google Cloud 控制台中的「SSH」按鈕。執行個體的存取權設定 (透過 IAM 權限定義) 必須允許透過 IAP 進行 TCP 通道連線。
gcloud
如要連線至執行個體,請使用 gcloud compute ssh
指令。執行個體的存取權設定 (透過 IAM 權限定義) 必須允許透過 IAP 進行 TCP 通道連線。
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
指令,確認本機電腦上有私密安全殼層金鑰,且公開安全殼層金鑰已發布至 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 command, or local proxy command」欄位中,輸入下列內容:
gcloud.cmd compute start-iap-tunnel %host %port --listen-on-stdin --project PROJECT_ID --zone ZONE
更改下列內容:
- PROJECT_ID:VM 執行個體所在的專案 ID
- ZONE:VM 執行個體所在的可用區
如要在終端機視窗中列印 Proxy 診斷資訊,請選取「Only until session starts」(僅在工作階段開始前)。
依序選取「Connection」 >「SSH」 >「Auth」。
按一下「瀏覽」並貼上下列檔案名稱,然後按一下「開啟」:
%USERPROFILE%\.ssh\google_compute_engine.ppk
選取「工作階段」類別。
設定下列 Proxy 設定:
在「主機名稱 (或 IP 位址)」欄位中輸入下列內容:
USERNAME@INSTANCE_NAME
更改下列內容:
- USERNAME:您先前決定的 Linux 使用者名稱
- INSTANCE_NAME:要連線的 VM 執行個體名稱
已儲存的工作階段:輸入工作階段名稱。
按一下 [儲存]。
按一下「開啟」即可啟動 SSH 工作階段。
ssh
您可以直接使用 ssh 指令搭配 ProxyCommand
選項,透過 gcloud
啟動通道。使用這個指令產生完整的 ssh
指令:
gcloud compute ssh INSTANCE_NAME --dry-run
建立 RDP 連線通道
您可以透過 IAP 建立 RDP 流量通道,連線至沒有外部 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 稽核記錄,即可查看存取要求。
設定 VPC Service Controls,透過 IAP for TCP 保護專案。