保護 Cloud Run 輸入流量

保護 Cloud Run 輸入流量

程式碼研究室簡介

subject上次更新時間:1月 24, 2023
account_circle作者:Wietse Venema

1. 總覽

本實驗室將說明如何限制 Cloud Run 服務的存取權,並只允許來自在內部或專案虛擬私有雲中執行的工作負載的要求。您可以使用兩層存取權控管:入口設定和身分與存取權管理 (IAM) 政策。

5aed47d10595c878.png

輸入設定

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

身分與存取權管理政策

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

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

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

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

31611f6a2f12fd0c.png

使用虛擬私有雲中的跳躍伺服器模擬內部部署工作負載

在本研究室中,您將模擬從內部主機傳送要求,方法是從 VPC 中的 Compute Engine 虛擬機器傳送要求,如下所示。

aebf22740c7a84f0.png

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

2. 設定和需求

自學環境設定

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • 「Project name」是這個專案參與者的顯示名稱。這是 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 鍵即可接受預設值
  • 允許未經驗證的叫用 [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 和工作流程。

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

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

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

如果再次開啟服務網址,會顯示「Error: Forbidden - Access is forbidden」

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

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

接下來,我們會在 VPC 中建立 Compute Engine 執行個體,做為跳板伺服器,藉此模擬來自內部部署伺服器的 Cloud VPN 閘道要求:

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 為基礎的存取權控管又是如何?

本研究室說明瞭如何使用入口設定,以及使用時機。如果您要將內部工作負載連線至 Cloud Run,Ingress 設定是絕佳的起點。

以 IAM 為基礎的存取權控管機制需要更多努力才能導入,尤其是如果您是從內部主機進行呼叫:

  • IAM 要求您在主機上管理長期服務帳戶憑證
  • IAM 要求程式碼變更,以便使用服務帳戶憑證簽署要求。

Google 建議採用多層式存取權控管機制。使用入口設定限制存取權,只允許存取內部主機,是邁向成功的第一步,但別忘了還有其他方法!

6. 恭喜!

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

下一步:

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

清除所用資源

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

刪除專案

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

實用參考資料

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