本頁面說明如何透過 Identity-Aware Proxy (IAP) TCP 轉送,使用 SSH 連線至 Cloud Run 服務。
使用 IAP 保護 SSH 連線,即可在安全環境中對個別容器執行個體進行偵錯。
事前準備
- 請確認 Cloud Run 服務是在第二代執行環境中運作,且包含連線後執行指令所需的偵錯工具。詳情請參閱「執行環境」。
為確保您使用的是最新版本 Google Cloud CLI,請執行下列指令:
gcloud components update在專案中啟用 Cloud Run、Cloud Resource Manager API、Cloud OS 登入 API 和 Identity-Aware Proxy API。
如要啟用 API,請執行下列指令:
gcloud services enable \ cloudresourcemanager.googleapis.com \ oslogin.googleapis.com \ iap.googleapis.com \ run.googleapis.com
必要的角色
如要取得設定政策及連線至工作負載所需的權限,請要求管理員授予您下列 IAM 角色:
-
設定政策:
- 專案的 IAP 政策管理員 (
roles/iap.admin) - 專案的 Cloud Run 管理員 (
roles/run.admin)
- 專案的 IAP 政策管理員 (
-
連線至工作負載:
- 服務帳戶的服務帳戶使用者 (
roles/iam.serviceAccountUser) - 服務的 Cloud Run SSH 超級使用者存取權 (
roles/run.sshRoot) - 服務的受 IAP 保護通道使用者 (
roles/iap.tunnelResourceAccessor) - 服務的 Cloud Run 開發人員 (
roles/run.developer) - 專案的記錄檔檢視存取者 (
roles/logging.viewAccessor) - 瀏覽器 (
roles/browser) 專案 - 專案的服務使用情形消費者 (
roles/serviceusage.serviceUsageConsumer)
- 服務帳戶的服務帳戶使用者 (
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
限制
Cloud Run 的 SSH 有下列限制:
- 僅支援 Cloud Run 服務和執行個體。
- 服務僅支援第二代執行環境。
- 不支援 Cloud Run 工作。
- 不支援 worker 集區。
- 使用 SSH 時,系統會覆寫映像檔中的主機金鑰。SSH 工作階段結束後,金鑰仍會保持覆寫狀態,直到服務重新啟動為止。
- Windows:不支援 PuTTY。使用 OpenSSH 用戶端。
設定 IAP 授權政策
您可以使用 gcloud CLI 或 IAP REST API,在專案、區域或服務層級管理 Cloud Run 資源的存取權。
您可以為下列 Cloud Identity API ID 設定政策:
- Cloud Identity:例如
user:EMAIL@example.com - 員工身分聯盟:例如:
principal://iam.googleapis.com/locations/global/workforcePools/<var>POOL_ID</var>/subject/<var>SUBJECT_ATTRIBUTE_VALUE</var>
如需主體類型的詳細資訊和範例,請參閱主體 ID 清單。
更新現有的 Cloud Run 服務
如要更新服務以啟用 SSH,請執行下列指令:
gcloud beta run services update \
SERVICE_NAME \
--region=LOCATION \
--ssh
更改下列內容:
SERVICE_NAME:Cloud Run 服務的名稱。LOCATION:部署服務的 Google Cloud 區域 (例如us-central1)。
您也可以將 --ssh 新增至 gcloud beta run deploy,藉此部署 Cloud Run 服務。
授予專案中所有 Cloud Run 資源的存取權
如要管理專案中所有資源的存取權,請在專案層級套用 IAM 政策繫結。
gcloud
執行下列指令:
gcloud beta iap tcp add-iam-policy-binding \
--member='USER' \
--role='roles/iap.tunnelResourceAccessor' \
--resource-type=cloud-run
將 USER 替換為使用者的主體 ID,例如 user:user@example.com 或員工身分聯盟主體。
REST API
向專案政策端點傳送 POST 要求:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"policy": {
"bindings": [
{
"role": "roles/iap.tunnelResourceAccessor",
"members": ["USER"]
}
]
}
}' \
"https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun:setIamPolicy"
更改下列內容:
USER:使用者的主體 ID。PROJECT_NUMBER:託管資源的 Google Cloud專案編號。
授予特定位置所有 Cloud Run 資源的存取權
如要限制特定區域 (例如 us-central1) 內所有資源的存取權,請在位置層級套用政策繫結。
gcloud
執行下列指令:
gcloud beta iap tcp add-iam-policy-binding \
--member='USER' \
--role='roles/iap.tunnelResourceAccessor' \
--resource-type=cloud-run \
--region=LOCATION
更改下列內容:
USER:使用者的主體 ID。LOCATION:部署資源的 Google Cloud 區域 (例如us-central1)。
REST API
向位置政策端點傳送 POST 要求:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"policy": {
"bindings": [
{
"role": "roles/iap.tunnelResourceAccessor",
"members": ["USER"]
}
]
}
}' \
"https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun/locations/\
LOCATION:setIamPolicy"
更改下列內容:
USER:使用者的主體 IDPROJECT_NUMBER: Google Cloud 專案編號LOCATION: Google Cloud 區域
授予特定 Cloud Run 服務的存取權
如要限制專案中單一指定服務的存取權,請在服務層級套用政策繫結。
gcloud
執行下列指令:
gcloud beta iap tcp add-iam-policy-binding \
--member='USER' \
--role='roles/iap.tunnelResourceAccessor' \
--resource-type=cloud-run \
--service=SERVICE_NAME \
--region=LOCATION
更改下列內容:
USER:使用者的主體 IDSERVICE_NAME:要連線的服務邏輯名稱LOCATION:部署服務的 Google Cloud 區域
REST API
向服務政策端點傳送 POST 要求:
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{
"policy": {
"bindings": [
{
"role": "roles/iap.tunnelResourceAccessor",
"members": ["USER"]
}
]
}
}' \
"https://iap.googleapis.com/v1/projects/\
PROJECT_NUMBER/iap_tunnel/cloudRun/locations/\
LOCATION/services/\
SERVICE_NAME:setIamPolicy"
更改下列內容:
USER:使用者的主體 IDPROJECT_NUMBER: Google Cloud 專案編號LOCATION: Google Cloud 區域SERVICE_NAME:服務名稱
使用 SSH 連線
如要建立連至 Cloud Run 資源的 SSH 通道,必須使用 gcloud CLI。
連線至服務
執行下列指令:
gcloud beta run services ssh SERVICE_NAME \
--region=LOCATION \
--project=PROJECT_ID
更改下列內容:
SERVICE_NAME:要連線的服務名稱LOCATION:服務所在的 Google Cloud 區域PROJECT_ID: Google Cloud專案的 ID
退出工作階段
如要結束 SSH 工作階段,請輸入 exit。
您對容器所做的任何修改,都只會在容器保持運作期間保留。退出工作階段不會自動停止或重新啟動容器。
使用本機 OpenSSH 用戶端
如要使用本機 OpenSSH 用戶端連線,請按照下列步驟操作:
如要啟動 SSH 通道並產生必要憑證,請執行下列指令:
gcloud beta run services ssh SERVICE_NAME \ --region=LOCATION \ --project=PROJECT_ID更改下列內容:
SERVICE_NAME:服務名稱LOCATION: Google Cloud 區域PROJECT_ID:您的 Google Cloud 專案 ID
將下列設定程式碼新增至本機
~/.ssh/config檔案:Host cloud-run-ssh HostName cloud-run-default User root IdentityFile ~/.ssh/google_compute_engine CertificateFile ~/.ssh/google_compute_engine_cert/PROJECT_ID_LOCATION_service_SERVICE_NAME-cert.pub CheckHostIP no HashKnownHosts no HostKeyAlias cloud-run-default IdentitiesOnly yes StrictHostKeyChecking no UserKnownHostsFile /dev/null ProxyUseFdpass no ProxyCommand /usr/local/bin/python3 -S ~/google-cloud-sdk/lib/gcloud.py beta run start-iap-tunnel --project_number=PROJECT_NUMBER --project_id=PROJECT_ID --workload_type=service --deployment_name=SERVICE_NAME/revisions/REVISION --region=LOCATION --iap-tunnel-url-override=wss://LOCATION.ssh.run.app/v4如果
gcloud安裝路徑不同,請更新ProxyCommand路徑中的前置字元。更改下列內容:
PROJECT_ID:您的 Google Cloud 專案 IDLOCATION: Google Cloud 區域SERVICE_NAME:服務名稱REVISION:修訂版本名稱PROJECT_NUMBER:您的 Google Cloud 專案編號
使用 OpenSSH 連線至服務:
ssh cloud-run-ssh