本頁說明如何透過 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) 服務 - 服務的「Cloud Run 檢視者」 (
roles/run.viewer) - 受 IAP 保護的通道使用者 (
roles/iap.tunnelResourceAccessor) 服務 - Cloud Run 開發人員 (
roles/run.developer) 服務 - 記錄檔檢視存取者 (
roles/logging.viewAccessor) 專案 - 瀏覽器 (
roles/browser) 專案 - 專案的服務使用情形消費者 (
roles/serviceusage.serviceUsageConsumer)
- 服務帳戶的服務帳戶使用者 (
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
限制
Cloud Run 的 SSH 具有下列限制:
- 僅支援 Cloud Run 服務和執行個體。
- 服務僅支援第二代執行環境。
- 不支援 Cloud Run 工作。
- 不支援工作站集區。
- 使用 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 \
--ssh
將 SERVICE_NAME 換成 Cloud Run 服務名稱。如要部署 Cloud Run 服務,請將 --ssh 新增至 gcloud beta run deploy。
授予專案中所有 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:專案的 ID Google Cloud
結束工作階段
如要結束 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_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 --region=LOCATION如果
gcloud安裝路徑不同,請更新ProxyCommand路徑中的前置字串。更改下列內容:
PROJECT_ID:您的 Google Cloud 專案 IDLOCATION: Google Cloud 區域SERVICE_NAME:服務名稱PROJECT_NUMBER:您的 Google Cloud 專案編號
使用 OpenSSH 連線至服務:
ssh cloud-run-ssh