SSH 可讓您與執行中的容器執行個體建立安全、互動式的殼層連線。這項功能可讓您直接存取容器的檔案系統和執行階段環境,以便檢查系統資源、驗證設定及排解問題。
Cloud Run 的 SSH 會使用下列服務來保護連線:
- Identity-Aware Proxy TCP 轉送會代理 SSH 連線,因此要求必須通過驗證和授權檢查,才能到達容器。您可以使用情境感知存取權擴充 IAP 存取權政策,根據 IP 位址和使用者裝置等屬性限制存取權。
- OS 登入會使用 SSH 憑證驗證來驗證使用者。連線時,gcloud CLI 會為您產生短期 SSH 憑證,效期為五分鐘。憑證會在容器內驗證。每次嘗試登入時,Google 都會檢查 IAM 權限。
Cloud Run 的 SSH 會自動將必要的 Google 代管二進位檔 (包括 sshd 和驗證憑證的二進位檔) 新增至容器的檔案系統。這些二進位檔只能在 SSH 工作階段期間存取,並會在工作階段結束後移除。Cloud Run SSH 會忽略現有的 SSH 設定 (包括 /etc/passwd 項目),並優先採用 Google 代管的設定。
建立 SSH 工作階段時,Google 代管 SSH 依附元件的第三方開放原始碼著作權聲明會掛接在容器內,路徑如下:/usr/share/licenses/google_ssh/THIRD_PARTY_NOTICES。
SSH 工作階段和服務執行個體
使用 SSH 連線至服務時,請注意下列事項:
- 如果沒有執行中的服務執行個體,Cloud Run 會為 SSH 工作階段啟動新的執行個體。
- Cloud Run 會盡可能在 SSH 工作階段期間,讓服務執行個體保持運作。執行個體處於啟用狀態時,系統會照常向您收取費用。
限制
SSH 適用下列限制:
- SSH 工作階段最長可持續 24 小時。24 小時後,工作階段會中斷連線,您必須重新連線。
- 如果 SSH 工作階段閒置一小時,IAP 就會中斷連線。詳情請參閱「IAP TCP 轉送已知限制」。
- SSH 僅適用於在 Cloud Run 第二代環境和 Cloud Run 執行個體上執行的服務。
- 使用 SSH 時,系統會覆寫映像檔中的主機金鑰。SSH 工作階段結束後,金鑰仍會保持覆寫狀態,直到服務執行個體重新啟動為止。
- Windows:不支援 PuTTY。使用 OpenSSH 用戶端。
- 使用 SSH 時,請務必格外小心,確保容器安全。請考量安全性最佳做法,例如以非超級使用者身分執行應用程式程式碼。
- 當 SSH 連線冷啟動具有容器啟動順序 (
container-dependencies) 的多容器服務時,系統會在容器環境準備就緒前轉送要求。Cloud Run 會傳回 HTTP500錯誤,並立即停止新的執行個體。如果使用 Google Cloud CLI 連線,指令會失敗。如要解決這個問題,請只在執行個體已執行時,才使用 SSH 連線。例如,先向服務傳送要求以啟動執行個體,或設定執行個體數量下限。
事前準備
- 登入 Google Cloud 帳戶。如果您未曾使用過 Google Cloud,歡迎 建立帳戶,親自體驗實際使用我們產品的成效。新客戶還能獲得價值 $300 美元的免費抵免額,用於執行、測試及部署工作負載。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
啟用 Cloud Run Admin API、Cloud Resource Manager API、Identity-Aware Proxy API 和 Cloud OS 登入 API:
gcloud services enable run.googleapis.com \ cloudresourcemanager.googleapis.com \ iap.googleapis.com \ oslogin.googleapis.com
- 安裝並初始化 gcloud CLI。
-
更新元件:
gcloud components update
-
Windows:確認已安裝 OpenSSH 用戶端。
Windows 10 以上版本通常預設會安裝 OpenSSH 用戶端。如果尚未安裝,請在 PowerShell 中以管理員身分執行下列指令,即可安裝:
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
詳情請參閱「安裝 OpenSSH」。
- 查看 Cloud Run 定價頁面。您可以使用 Pricing Calculator,根據預測用量估算費用。SSH 會依據網路輸出位元組數計費。此外,在 SSH 工作階段期間,執行個體會保持啟用狀態,並照常計費。
-
如果專案使用 VPC Service Controls (VPC-SC),請注意,建立通道程序會檢查
iaptunnel.googleapis.com做為服務名稱,而非run.googleapis.com。
必要的角色
如要取得完成這些步驟所需的權限,請要求管理員授予您下列 IAM 角色:
- 服務帳戶的服務帳戶使用者 (
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) - 專案的 IAP 政策管理員 (
roles/iap.admin),負責 IAP 管理作業
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
如果您不屬於專案所在的組織,Cloud Run 會封鎖 SSH 存取權。如要取得 SSH 存取權,請新增 roles/compute.osLoginExternalUser 角色,或使用具備 compute.oslogin.updateExternalUser 權限的自訂角色。
您可以在專案層級授予「受 IAP 保護的通道使用者」角色,如要將這個角色限制在特定 Cloud Run 服務或執行個體,請執行下列指令:
特定服務
gcloud beta iap tcp add-iam-policy-binding \
--resource-type=cloud-run \
--service=SERVICE \
--region=REGION \
--member=MEMBER \
--role=roles/iap.tunnelResourceAccessor
更改下列內容:
SERVICE:服務名稱。REGION:部署服務的區域。MEMBER:要授予存取權的身分。
如果是特定執行個體
gcloud beta iap tcp add-iam-policy-binding \
--resource-type=cloud-run \
--instance=INSTANCE \
--region=REGION \
--member=MEMBER \
--role=roles/iap.tunnelResourceAccessor
更改下列內容:
INSTANCE:執行個體名稱。REGION:部署服務的區域。MEMBER:要授予存取權的身分。
如要在專案和區域層級授予 roles/iap.tunnelResourceAccessor,請參閱「設定 IAP 存取權政策」。
搭配使用 SSH 與 Cloud Run 服務
設定服務層級 SSH 存取權,並使用 SSH 連線至服務。
設定服務層級 SSH 存取權
您可以使用 gcloud CLI 或 YAML,允許特定服務的檢查存取權:
gcloud
如要啟用現有服務的存取權,請使用下列指令:
gcloud beta run services update SERVICE --ssh
您也可以在部署服務時,使用 --ssh 旗標允許檢查服務。
YAML
如果您要建立新服務,請略過這個步驟。如要更新現有服務,請下載其 YAML 設定:
gcloud run services describe SERVICE --format export > service.yaml
以下範例包含 YAML 設定:
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE labels: cloud.googleapis.com/location: REGION annotations: run.googleapis.com/ssh-enabled: "true" run.googleapis.com/launch-stage: BETA spec: template: spec: containers: image: IMAGE_URL更改下列內容:
SERVICE:Cloud Run 服務的名稱。REGION: Google Cloud 區域,例如us-central1。IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。如果使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
使用下列指令建立或更新服務:
gcloud run services replace service.yaml
gcloud run services replace指令預設會使用service.yaml檔案 (如有)。
您可以使用 gcloud CLI 或 YAML,依服務停用 SSH 存取權:
gcloud
如要停用服務存取權,請使用下列指令:
gcloud beta run services update SERVICE --no-ssh
YAML
如果您要建立新服務,請略過這個步驟。如要更新現有服務,請下載其 YAML 設定:
gcloud run services describe SERVICE --format export > service.yaml
以下範例包含 YAML 設定:
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: SERVICE labels: cloud.googleapis.com/location: REGION annotations: run.googleapis.com/ssh-enabled: "false" run.googleapis.com/launch-stage: BETA spec: template: spec: containers: image: IMAGE_URL更改下列內容:
SERVICE:Cloud Run 服務的名稱。REGION: Google Cloud 區域,例如us-central1。IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。如果使用 Artifact Registry,則必須先建立存放區 REPO_NAME。網址格式為LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
使用下列指令建立或更新服務:
gcloud run services replace service.yaml
gcloud run services replace指令預設會使用service.yaml檔案 (如有)。
透過 SSH 連線至服務
如要使用 SSH 連線至服務,請使用 gcloud CLI:
控制台
前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:
按一下服務,開啟「Service details」(服務詳細資料) 頁面。
選取「SSH」SSH。Cloud Shell 隨即開啟,並顯示 gcloud SSH 指令。
按下 Enter 鍵。
如果系統提示您輸入安全殼層金鑰的通關密語,可以留空。不過,如果您輸入密碼詞組,請務必在同一工作區的後續 SSH 工作階段中使用相同的密碼詞組。
SSH 工作階段成功完成後,Cloud Run 會顯示下列訊息:
Project: PROJECT_ID Region:REGIONService: SERVICE Revision: REVISION Instance: INSTANCE_ID Container: CONTAINER Image: IMAGE如要結束 SSH 工作階段,請輸入
exit。只要容器保持運作,您對容器所做的任何變更都會保留。退出工作階段不會重新啟動或終止容器。
gcloud
如要使用 SSH 連線至服務,請執行下列 Google Cloud CLI 指令:
gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID
更改下列內容:
SERVICE:服務名稱。REGION:部署服務的區域。PROJECT_ID: Google Cloud 專案 ID。
如果系統提示您輸入安全殼層金鑰的通關密語,可以留空。不過,如果輸入密碼詞組,請務必在同一個工作區的後續 SSH 工作階段中使用相同的密碼詞組。
SSH 工作階段成功完成後,Cloud Run 會顯示下列訊息:
Project: PROJECT_ID
Region: REGION
Service: SERVICE
Revision: REVISION
Instance: INSTANCE_ID
Container: CONTAINER
Image: IMAGE
如要結束 SSH 工作階段,請輸入 exit。只要容器保持運作,您對容器所做的任何變更都會保留。退出工作階段不會重新啟動或終止容器。
指定服務執行個體
如要使用 SSH 連線至特定服務執行個體,請使用 Google Cloud CLI。
控制台
前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:
按一下您感興趣的服務,開啟「Service details」(服務詳細資料) 頁面。
選取「記錄」。
按一下服務執行個體的記錄項目,展開該項目。
選取「透過 SSH 連線至這個執行個體」。Cloud Shell 隨即開啟,並顯示 gcloud SSH 指令。
按下 Enter 鍵。
gcloud
如要使用 SSH 連線至 Cloud Run 服務執行個體,請執行下列 Google Cloud CLI 指令:
gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID \
--revision=REVISION \
--instance=INSTANCE_ID
更改下列內容:
SERVICE:服務名稱。REGION:部署服務的區域。PROJECT_ID: Google Cloud 專案 ID。REVISION:修訂版本的名稱。INSTANCE_ID:執行個體 ID。如要找出服務執行個體 ID,請前往「觀測能力」部分的「記錄」頁面。執行個體 ID 位於記錄項目的labels欄位中。如果您在連線前終止特定執行個體,就無法找到執行個體 ID。
指定修訂版本
如要使用 SSH 連線至特定修訂版本,請使用 Google Cloud CLI。
控制台
前往 Google Cloud 控制台的 Cloud Run「Services」(服務) 頁面:
按一下您感興趣的服務,開啟「Service details」(服務詳細資料) 頁面。
選取「修訂版本記錄」。
找出要透過 SSH 存取的修訂版本,然後按一下右側的三點圖示。
選取「透過 SSH 連線至修訂版本」。Cloud Shell 隨即開啟,並顯示 gcloud SSH 指令。
按下 Enter 鍵。
gcloud
如要使用 SSH 連線至 Cloud Run 服務修訂版本,請使用下列 Google Cloud CLI 指令:
gcloud beta run services ssh SERVICE --region=REGION --project=PROJECT_ID --revision=REVISION
更改下列內容:
SERVICE:服務名稱。REGION:部署服務的區域。PROJECT_ID: Google Cloud 專案 ID。REVISION:修訂版本的名稱。
搭配使用 SSH 與 Cloud Run 執行個體
設定執行個體層級的 SSH 存取權,並使用 SSH 連線至執行個體。
設定執行個體層級 SSH 存取權
執行個體預設會啟用 SSH。
您可以使用 gcloud CLI 或 YAML,停用個別執行個體的 SSH 存取權:
gcloud
如要停用執行個體的存取權,請使用下列指令:
gcloud beta run instances update INSTANCE --no-ssh
YAML
如果您要建立新的執行個體,請略過這個步驟。如要更新現有執行個體,請下載其 YAML 設定:
gcloud beta run instances describe INSTANCE --format export > instance.yaml
以下範例包含 YAML 設定:
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE labels: cloud.googleapis.com/location: REGION annotations: run.googleapis.com/ssh-enabled: "false" run.googleapis.com/launch-stage: BETA spec: containers: image: IMAGE_URL更改下列內容:
INSTANCE:Cloud Run 執行個體的名稱。REGION: Google Cloud 區域,例如us-central1。IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。
使用下列指令建立或更新執行個體:
gcloud beta run instances replace instance.yaml
您可以使用 gcloud CLI 或 YAML,允許特定執行個體的檢查存取權。
gcloud
如要在現有執行個體上啟用存取權,請使用下列指令:
gcloud beta run instances update INSTANCE --ssh
您也可以在部署執行個體時,使用 --ssh 旗標,允許對執行個體進行檢查。
YAML
如果您要建立新的執行個體,請略過這個步驟。如要更新現有執行個體,請下載其 YAML 設定:
gcloud beta run instances describe INSTANCE --format export > instance.yaml
以下範例包含 YAML 設定:
apiVersion: run.googleapis.com/v1 kind: Instance metadata: name: INSTANCE labels: cloud.googleapis.com/location: REGION annotations: run.googleapis.com/ssh-enabled: "true" run.googleapis.com/launch-stage: BETA spec: containers: image: IMAGE_URL更改下列內容:
INSTANCE:Cloud Run 執行個體的名稱。REGION: Google Cloud 區域,例如us-central1。IMAGE_URL:容器映像檔的參照,例如us-docker.pkg.dev/cloudrun/container/hello:latest。
使用下列指令建立或更新執行個體:
gcloud beta run instances replace instance.yaml
透過 SSH 連線至執行個體
如要使用 SSH 連線至執行個體,請使用下列 Google Cloud CLI 指令:
gcloud beta run instances ssh INSTANCE --region=REGION --project=PROJECT_ID
更改下列內容:
INSTANCE:執行個體名稱。REGION:部署服務的區域。PROJECT_ID: Google Cloud 專案 ID。
如果系統提示您輸入安全殼層金鑰的通關密語,可以留空。不過,如果輸入密碼詞組,請務必在同一個工作區的後續 SSH 工作階段中使用相同的密碼詞組。
SSH 工作階段成功完成後,Cloud Run 會顯示下列訊息:
Project: PROJECT_ID
Region: REGION
Instance: INSTANCE
Revision: REVISION
Container: CONTAINER
Image: IMAGE
如要結束 SSH 工作階段,請輸入 exit。
使用 OpenSSH 用戶端連線
如要使用 OpenSSH 用戶端連線,請按照下列步驟操作:
- 在目標服務上執行
gcloud beta run services ssh指令。這會啟動 SSH 通道並產生憑證。 在 SSH 設定中新增下列內容:
Host cloud-run-ssh HostName cloud-run-default User root IdentityFile /Users/USER/.ssh/google_compute_engine CertificateFile /Users/USER/.ssh/google_compute_engine_cert/PROJECT_ID_REGION_SERVICE-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 /Users/USER/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 --region=REGION更改下列內容:
USER:本機電腦上的使用者名稱。PROJECT_ID: Google Cloud 專案 ID。PROJECT_NUMBER: Google Cloud 專案編號。REGION:服務部署所在的區域。SERVICE:服務名稱。
如果 gcloud CLI 安裝在其他資料夾,您可能需要更新最後一行的位置。
執行下列指令:
ssh cloud-run-ssh
SSH 憑證會在五分鐘後失效。如果嘗試在五分鐘後與服務建立 SSH 連線,則必須重新執行 gcloud beta run services ssh,重新產生憑證。
SSH 存取記錄
如要擷取安全殼層金鑰管理的稽核記錄,您必須啟用 Cloud OS Login API 的稽核記錄。請參閱「查看 OS 登入稽核記錄」。如要存取 Cloud Run 資源的 SSH 記錄,您必須具備該專案的 Cloud 稽核記錄存取權。
下列範例會查詢過去一天的所有 Cloud Run 服務:
gcloud logging read '
logName="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access" AND
protoPayload.serviceName="oslogin.googleapis.com" AND
protoPayload.request.instance:"run.googleapis.com"
' --project=PROJECT_ID \
--freshness=1d \
--format="table(timestamp, protoPayload.authenticationInfo.principalSubject:label=USER, protoPayload.request.instance:label=CLOUD_RUN_SERVICE)"
保護及控管 SSH 存取權
您可以控管誰能使用 SSH,以及如何限制環境中的 SSH。
使用組織政策停用 SSH 存取權
如要設定組織政策來停用 SSH,請使用自訂限制,禁止在 Cloud Run 服務上啟用 SSH 偵錯存取權。
後續步驟
- 進一步瞭解如何排解 Cloud Run 問題。
- 進一步瞭解如何排解 Cloud Run 服務問題。
- 瞭解 Cloud Run 的已知問題。