保護 Cloud Run 輸入流量

1. 總覽

本研究室說明如何限制 Cloud Run 服務的存取權,並僅允許來自地端部署或專案虛擬私有雲中工作負載的要求。您可以使用兩種存取權控管層級:輸入設定和 Identity and Access Management (IAM) 政策。

5aed47d10595c878.png

輸入設定

透過輸入設定,您可以依據網路來源 (內部或外部) 篩選要求。根據預設,所有要求都能通過,包括來自公開網際網路的要求。

身分與存取權管理政策

IAM 政策可讓您依據傳送者的身分篩選要求,通常用於驗證服務對服務的要求。

在本研究室中,您將瞭解輸入設定的使用方式和使用時機。

地端部署主機透過虛擬私有雲連線

在本研究室中,我們將模擬地端部署工作負載。如要將地端部署主機連線至 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 未使用的字元字串。您可以隨時更新。
  • 所有 Google Cloud 專案的專案 ID 均不得重複,而且設定後即無法變更。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-enroll-service Directory 中,然後按 Enter 鍵接受預設值
  • 服務名稱 (partner-enroll-service):按下 Enter 鍵接受預設值
  • 要允許在未經驗證的情況下叫用 [合作夥伴註冊服務] (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 產品的要求視為內部要求,即使該項要求不屬於虛擬私有雲也一樣。這類產品包括 Pub/Sub 和 Workflows。

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

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

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

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

由於瀏覽器傳送要求是來自外部網路來源,而不是從「內部」來源傳送至 Google Cloud 專案,因此就是您預期的結果。您的服務現在更加安全了。

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

下一步是模擬透過 Cloud VPN 閘道從地端部署伺服器發出的要求,方法是在虛擬私有雲中建立 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 執行個體是「內部」來源,因此這項要求應會成功,因為 VM 執行個體是在專案的虛擬私有雲網路中執行。

export SERVICE_URL=https://

curl ${SERVICE_URL}

輸出內容應會顯示:

Partner registration service: RUNNING

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

本研究室會說明輸入設定的使用方式和使用時機。如要將地端部署工作負載連線至 Cloud Run,輸入設定是很好的開始步驟。

以 IAM 為基礎的存取權控管需要投注更多心力,特別是從內部部署主機呼叫時:

  • 如要使用 IAM 功能,您必須管理主機的長期服務帳戶憑證
  • IAM 必須變更程式碼,才能使用服務帳戶憑證簽署要求。

Google 建議您採取多層式存取權控管的做法,建議您一開始先透過輸入設定限制內部主機的存取權,但別忘了這麼做!

6. 恭喜!

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

下一步:

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

清除所用資源

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

刪除專案

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

實用參考資料

以下其他資源可協助您進一步瞭解 Cloud Run 的兩個存取權控管層。