保護 Cloud Run 輸入流量

1. 總覽

本實驗說明如何限制 Cloud Run 服務的存取權,只允許來自在本機或專案虛擬私有雲中執行的工作負載的要求。您可以透過兩個層級的存取權控管機制:連入設定和 Identity and Access Management (IAM) 政策。

5aed47d10595c878.png

輸入設定

您可以透過 Ingress 設定,根據要求的網路來源 (內部或外部) 進行篩選。根據預設,系統會允許所有要求通過,包括來自公用網際網路的要求。

IAM 政策

您可以使用 IAM 政策,根據傳送者的身分篩選要求,這類政策通常用於驗證服務對服務要求。

在本實驗室中,您將瞭解如何及何時使用 Ingress 設定。

地端主機透過 VPC 連線

在本實驗室中,我們將模擬內部部署工作負載。如要將內部部署主機連線至 Cloud Run,請設定 內部部署主機的私人 Google 存取權。包括在虛擬私有雲網路中設定 Cloud VPN 閘道,如下所示。

31611f6a2f12fd0c.png

使用虛擬私有雲中的跳板伺服器模擬地端工作負載

在本實驗室中,您將從虛擬私有雲的 Compute Engine 虛擬機器傳送要求,模擬從地端主機傳送要求,如下所示。

aebf22740c7a84f0.png

您將用來做為跳躍伺服器的 Compute Engine 虛擬機器,與 Cloud VPN 閘道具有相同的網路來源,因此您可以使用這項服務,模擬從地端部署工作負載傳送要求。

2. 設定和需求

自修實驗室環境設定

  1. 登入 Google Cloud 控制台,然後建立新專案或重複使用現有專案。如果沒有 Gmail 或 Google Workspace 帳戶,請先建立帳戶

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 專案名稱是這個專案參與者的顯示名稱。這是 Google API 未使用的字元字串。你隨時可以更新該位置資訊。
  • 專案 ID 在所有 Google Cloud 專案中都是不重複的,而且設定後即無法變更。Cloud 控制台會自動產生不重複的字串,通常您不需要在意這個字串。在大多數程式碼研究室中,您需要參照專案 ID (通常會標示為 PROJECT_ID)。如果您不喜歡產生的 ID,可以產生另一個隨機 ID。你也可以嘗試自訂名稱,看看是否可用。完成這個步驟後就無法變更,且專案期間都會維持這個設定。
  • 請注意,部分 API 會使用第三個值,也就是「專案編號」。如要進一步瞭解這三種值,請參閱說明文件
  1. 接著,您需要在 Cloud 控制台中啟用帳單,才能使用 Cloud 資源/API。完成本程式碼研究室的費用應該不高,甚至完全免費。如要關閉資源,避免產生本教學課程以外的費用,您可以刪除自己建立的資源,或刪除整個專案。Google Cloud 新使用者可參加價值$300 美元的免費試用計畫。

環境設定

  1. 設定專案 ID 的環境變數,以供後續指令使用:
export PROJECT_ID=$(gcloud config get-value project)
export REGION=us-central1
export ZONE=us-central1-a
  1. 啟用執行本實驗室所需的 API。
gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  compute.googleapis.com \
  artifactregistry.googleapis.com
  1. 複製範例應用程式存放區並前往目錄
git clone https://github.com/GoogleCloudPlatform/cymbal-eats.git

cd cymbal-eats/partner-registration-service
  1. 設定 Compute Engine 和 Cloud Run 的預設區域和可用區
gcloud config set compute/region ${REGION}
gcloud config set run/region ${REGION}
gcloud config set compute/zone ${ZONE}

3. 部署服務

您會先部署服務,並開放公開存取。確認可以從瀏覽器傳送要求後,我們會鎖定服務,只允許來自內部網路來源的要求。

執行下列指令時,請按照這些操作說明操作:

  • 原始碼位置 (...):確認您位於 partner-registration-service 目錄,然後按下 Enter 鍵接受預設值
  • 服務名稱 (partner-registration-service):按下 Enter 鍵接受預設值
  • Allow unauthenticated invocations to [partner-registration-service] (y/N)?
gcloud run deploy 

這項指令完成後,會列出 Cloud Run 服務的網址。輸出內容會與下列清單類似:

Service [partner-registration-service] revision [partner-registration-service-00001-haz] has been deployed and is serving 100 percent of traffic.
Service URL: https://partner-registration-service-ssssssssss-uc.a.run.app

在瀏覽器中開啟服務網址。您應該會看見以下輸出結果:

Partner registration service: RUNNING

將服務設為僅允許內部要求

現在,您將使用 Cloud Run 服務的輸入設定,只允許來自內部來源的要求。內部來源包括與 Cloud Run 服務位於相同專案 (或 VPC Service Controls 範圍) 的虛擬私有雲網路中的資源,非常適合我們的用途。

此外,即使其他 Google Cloud 產品的請求不屬於 VPC,系統仍會將其視為內部請求。例如 Pub/Sub 和 Workflows。

即使這些來源透過 run.app 網址存取您的服務,要求仍會留在 Google 網路內,且禁止公開存取。

更新服務,僅允許內部要求:

gcloud run services update partner-registration-service --ingress=internal

如果您再次開啟服務網址,系統會顯示「Error: Forbidden - Access is forbidden」(錯誤:已禁止 - 禁止存取)

由於瀏覽器是從外部網路來源傳送要求,而非從 Google Cloud 專案的內部來源傳送,因此這正是您預期會發生的情況。您的服務現在更加安全。

4. 建立做為跳板伺服器的 Compute Engine 虛擬機器

下一步是透過 Cloud VPN 閘道模擬來自地端伺服器的要求,方法是在 VPC 中建立 Compute Engine 執行個體,做為跳板伺服器:

gcloud compute instances create jump-server --scopes=https://www.googleapis.com/auth/cloud-platform

這個指令的輸出內容應如下所示:

NAME         ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
jump-server  us-central1-a  n1-standard-1               10.128.0.10  34.170.108.8  RUNNING

從 Compute Engine 執行個體傳送要求至服務

現在請在虛擬機器上開啟終端機,並直接從虛擬私有雲網路中的機器傳送要求。

如果下列指令提示您在 Cloud Shell 中設定 SSH,請按照指示操作:

gcloud compute ssh jump-server

使用下列指令取得 Cloud Run 服務的網址:

gcloud run services describe partner-registration-service --region us-central1

輸出內容的前幾行應如下所示:

✔ Service partner-registration-service in region us-central1

URL:     https://partner-registration-service-ssssssssss-uc.a.run.app
Ingress: internal

現在請複製網址,並使用 curl 從 Compute Engine 執行個體傳送要求。這項要求應該會成功,因為 VM 執行個體是在專案的虛擬私有雲網路中執行,屬於內部來源。

export SERVICE_URL=https://

curl ${SERVICE_URL}

輸出內容應如下所示:

Partner registration service: RUNNING

5. 以 IAM 為基礎的存取權控管呢?

本實驗室說明瞭如何以及何時使用 Ingress 設定。如果您要將地端工作負載連線至 Cloud Run,建議先設定 Ingress。

以 IAM 為基礎的存取權控管機制需要更多心力才能實作,如果您是從內部部署主機呼叫,更是如此:

  • IAM 要求您在主機上管理長期有效的服務帳戶憑證
  • IAM 需要變更程式碼,才能使用服務帳戶憑證簽署要求。

Google 建議採用多層式存取控管機制。使用輸入設定將存取權限制為僅限內部主機,是很好的第一步,但請不要就此止步!

6. 恭喜!

恭喜,您已完成本程式碼研究室!

後續步驟:

探索其他 Cymbal Eats 程式碼研究室:

清除所用資源

如要避免系統向您的 Google Cloud 帳戶收取本教學課程所用資源的費用,請刪除含有相關資源的專案,或者保留專案但刪除個別資源。

刪除專案

如要避免付費,最簡單的方法就是刪除您為了本教學課程所建立的專案。

實用參考資料

以下提供其他資源,協助您進一步瞭解 Cloud Run 的兩層存取權控管機制。