使用 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 工作。
  • 不支援工作站集區。
  • 使用 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:使用者的主體 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:專案的 ID Google Cloud

結束工作階段

如要結束 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_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 專案 ID
    • LOCATION: Google Cloud 區域
    • SERVICE_NAME:服務名稱
    • PROJECT_NUMBER:您的 Google Cloud 專案編號
  3. 使用 OpenSSH 連線至服務:

    ssh cloud-run-ssh