使用 Cloud Run 的 SSH

本頁面說明如何透過 Identity-Aware Proxy (IAP) TCP 轉送,使用 SSH 連線至 Cloud Run 服務。

使用 IAP 保護 SSH 連線,即可在安全環境中對個別容器執行個體進行偵錯。

事前準備

  1. 請確認 Cloud Run 服務是在第二代執行環境中運作,且包含連線後執行指令所需的偵錯工具。詳情請參閱「執行環境」。
  2. 為確保您使用的是最新版本 Google Cloud CLI,請執行下列指令:

    gcloud components update
    
  3. 在專案中啟用 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 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

限制

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:使用者的主體 ID
  • PROJECT_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:使用者的主體 ID
  • SERVICE_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:使用者的主體 ID
  • PROJECT_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 用戶端連線,請按照下列步驟操作:

  1. 如要啟動 SSH 通道並產生必要憑證,請執行下列指令:

    gcloud beta run services ssh SERVICE_NAME \
        --region=LOCATION \
        --project=PROJECT_ID
    

    更改下列內容:

    • SERVICE_NAME:服務名稱
    • LOCATION: Google Cloud 區域
    • PROJECT_ID:您的 Google Cloud 專案 ID
  2. 將下列設定程式碼新增至本機 ~/.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 專案 ID
    • LOCATION: Google Cloud 區域
    • SERVICE_NAME:服務名稱
    • REVISION:修訂版本名稱
    • PROJECT_NUMBER:您的 Google Cloud 專案編號
  3. 使用 OpenSSH 連線至服務:

    ssh cloud-run-ssh