使用 Cloud Run 函式部署安全的無伺服器架構

Last reviewed 2023-08-06 UTC

無伺服器架構可讓您開發軟體和服務,而無須佈建或維護伺服器。您可以使用無伺服器架構,為各種服務建構應用程式。

本文件提供開發運作工程師、安全架構師和應用程式開發人員的專業指引,協助他們瞭解如何保護使用 Cloud Run 函式 (第 2 代) 的無伺服器應用程式。這份文件是安全藍圖的一部分,安全藍圖包含以下內容:

  • GitHub 存放區,其中包含一組 Terraform 設定和指令碼。
  • 本指南說明您透過藍圖 (本文件) 實作的架構、設計和安全控管機制。

雖然您可以先部署此藍圖,而不必先部署Google Cloud 企業基礎架構藍圖,但本文件假設您已按照 Google Cloud 企業基礎架構藍圖所述,設定基礎安全控制項。本文所述的架構可協助您在基礎層級加入額外控管機制,以便保護無伺服器應用程式。

為協助您定義與無伺服器應用程式相關的重要安全控制項,Cloud Security Alliance (CSA) 發布了無伺服器應用程式的 12 大重大風險。本藍圖中使用的安全控制項,旨在解決本文所述各種用途相關的風險。

無伺服器用途

此藍圖支援下列用途:

Cloud Run 函式和 Cloud Run 的差異包括:

  • Cloud Run 函式會由事件觸發,例如資料庫中的資料變更,或是從 Pub/Sub 等訊息傳遞系統收到訊息。Cloud Run 會由要求 (例如 HTTP 要求) 觸發。
  • Cloud Run 函式僅限於一組支援的執行階段。您可以使用任何程式設計語言搭配 Cloud Run。
  • Cloud Run 函式會管理容器和控制網頁伺服器或語言執行階段的基礎架構,讓您能專注於程式碼。Cloud Run 可讓您自行靈活執行這些服務,以便控管容器設定。

如要進一步瞭解 Cloud Run 和 Cloud Run 函式之間的差異,請參閱「選擇運算選項 Google Cloud 」一文。

架構

這個範本使用共用虛擬私有雲架構,在服務專案中部署 Cloud Run 函式,並可存取位於其他 VPC 網路中的資源。

下圖顯示概略架構,後續的架構範例會進一步說明。

使用 Cloud Run 函式的無伺服器設計藍圖架構。

上圖所示架構結合了下列 Google Cloud 服務和功能:

  • Cloud Run 函式可讓您以服務形式執行函式,並代為管理基礎架構。根據預設,這個架構會部署僅有內部 IP 位址的 Cloud Run 函式,且無法存取公開網際網路。
  • 觸發事件是觸發 Cloud Run 函式的事件。如範例架構中進一步說明的,這可以是 Cloud Storage 事件、排程間隔或 BigQuery 中的變更。
  • Artifact Registry 會儲存 Cloud Run 函式應用程式的來源容器。
  • 共用虛擬私人雲端可讓您將服務專案中的無伺服器虛擬私有雲存取連接器連結至主專案。您可以為每個環境 (正式、非正式和開發) 部署不同的共用虛擬私有雲網路。這個網路設計可在不同環境之間提供網路隔離功能。共用虛擬私有雲網路可讓您集中管理通用網路中的網路資源,同時委派服務專案的管理職責。
  • 無伺服器虛擬私有雲端存取連接器會使用 無伺服器虛擬私有雲端存取,將無伺服器應用程式連線至虛擬私人雲端網路。無伺服器虛擬私有雲端存取可確保無伺服器應用程式向 VPC 網路傳送的要求不會公開於網際網路。有了無伺服器虛擬私有雲存取,Cloud Run 函式就能與支援 VPC Service Controls的其他服務、儲存系統和資源通訊。

    您可以在共用虛擬私有雲主機專案或服務專案中設定無伺服器虛擬私有雲存取。根據預設,這個藍圖會在共用虛擬私有雲主機專案中部署無伺服器虛擬私有雲存取,以符合集中網路設定資源的共用虛擬私有雲模式。詳情請參閱「設定方法比較」。

  • VPC Service Controls 會設定授權、存取控制項和安全資料交換,藉此建立安全範圍,將 Cloud Run 函式服務和資源隔離開來。這個邊界旨在透過設定其他存取權控制項和監控機制,隔離應用程式和受管理的服務,並將 Google Cloud 的治理作業與應用程式分開。您的治理措施包括金鑰管理和記錄。

  • 消費者服務是指 Cloud Run 函式會對其採取動作的應用程式。消費者服務可以是內部伺服器,或是其他 Google Cloud 服務,例如 Cloud SQL。視用途而定,這項服務可能會位於 Cloud Next Generation Firewall 後方、其他子網路、與 Cloud Run 函式位於相同的服務專案,或其他服務專案中。

  • Secure Web Proxy 可在必要時保護輸出網路流量。這項服務可讓您根據雲端身分和網路應用程式,建立靈活且精細的政策。這個藍圖會在 Cloud Run 函式的建構階段,使用 Secure Web Proxy 來套用精細的存取權政策,以便輸出網路流量。藍圖會將許可網址清單加入閘道安全性政策規則

  • Cloud NAT 可視需要提供連出網際網路的連線。Cloud NAT 支援來源網路位址轉譯 (SNAT),可用於沒有公開 IP 位址的運算資源。傳入回應封包會使用目的地網路位址轉譯 (DNAT)。如果 Cloud Run 函式不需要存取網際網路,您可以停用 Cloud NAT。Cloud NAT 會實作附加至 Secure Web Proxy 的輸出網路政策。

  • Cloud Key Management Service (Cloud KMS) 會儲存此藍圖中服務使用的客戶代管加密金鑰 (CMEK),包括無伺服器應用程式、Artifact Registry 和 Cloud Run 函式。

  • Secret Manager 會儲存 Cloud Run 函式密鑰。藍圖會將機密資料掛接為磁碟區,提供比將機密資料傳遞為環境變數更高層級的安全防護。

  • Identity and Access Management (IAM)Resource Manager 可協助限制存取權和隔離資源。存取控制和資源階層遵循最小權限原則。

  • Cloud Logging 會收集來自 Google Cloud 服務的所有記錄,供分析和調查工具儲存及擷取。

  • Cloud Monitoring 會收集並儲存Google Cloud 服務的效能資訊和指標。

使用 Cloud Storage 的無伺服器應用程式架構範例

下圖顯示如何執行無伺服器應用程式,在 Cloud Storage 發生特定事件時存取內部伺服器。

採用 Cloud Storage 的無伺服器架構範例。

除了「架構」一文中所述的服務外,這個範例架構還結合了下列 Google Cloud服務和功能:

  • 當任何雲端資源、應用程式或使用者在值區中建立網頁物件時,Cloud Storage 就會發出事件。
  • Eventarc 會將來自不同資源的事件轉送。Eventarc 會加密傳輸中和靜態事件。
  • Pub/Sub 會將用於 Cloud Run 函式的輸入內容和觸發事件排入佇列。
  • 虛擬私有雲 (VPC) 防火牆規則可控管資料流入代管資源 (例如內部伺服器) 的子網路。
  • 內部伺服器會在 Compute Engine 或 Google Kubernetes Engine 上執行,並代管您的內部應用程式。如果您部署內部伺服器範例的安全 Cloud Run 函式,就會部署內含 Hello World HTML 頁面的 Apache 伺服器。這個範例模擬了對執行 VM 或容器的內部應用程式存取權。

使用 Cloud SQL 的架構範例

下圖顯示如何執行無伺服器應用程式,以便在 Cloud Scheduler 中定義的規則間隔內存取 Cloud SQL 託管服務。當您必須收集記錄檔、匯總資料等時,可以使用這個架構。

使用 Cloud SQL 的無伺服器架構範例。

除了「架構」一文中所述的服務外,這個範例架構還結合了下列 Google Cloud服務和功能:

採用 BigQuery 資料倉儲的架構示例

下圖說明如何執行無伺服器應用程式,並在 BigQuery 發生事件 (例如新增資料或建立資料表) 時觸發。

使用 BigQuery 的無伺服器架構範例。

除了「架構」一文中所述的服務外,這個範例架構還結合了下列 Google Cloud服務和功能:

機構架構

Resource Manager 可讓您按照邏輯將資源分組為專案、資料夾和機構。

下圖顯示資源階層,其中包含代表不同環境的資料夾,例如 Bootstrap、一般、實際工作、非正式環境 (或測試) 和開發。這個資源階層是根據企業基礎藍圖所述的階層。您可以將藍圖指定的專案部署至下列資料夾:CommonProductionNon-productionDev

無伺服器藍圖的組織架構。

下列各節將進一步說明這張圖表。

資料夾

您可以使用資料夾,將實際工作環境和管理服務與非實際工作環境和測試環境區隔開來。下表說明這個藍圖所使用的企業基礎架構藍圖資料夾。

資料夾 說明
Bootstrap 包含部署企業基礎架構藍圖所需的資源。
Common 包含機構的集中式服務,例如安全性專案。
Production 包含已測試過的雲端資源專案,並可供客戶使用。在這個藍圖中,Production 資料夾包含服務專案和主機專案。
Non-production 包含含有雲端資源的專案,這些資源目前正在測試中,並已進入發布階段。在這個藍圖中,Non-production 資料夾包含服務專案和主機專案。
Development 包含含有目前正在開發的雲端資源專案。在這個藍圖中,Development 資料夾包含服務專案和主機專案。

您可以變更這些資料夾的名稱,以符合貴機構的資料夾結構,但我們建議您維持類似的結構。詳情請參閱「機構架構」一文。如需其他資料夾結構,請參閱「決定 Google Cloud 目標網頁的資源階層」。

專案

您可以使用專案隔離環境中的資源。下表說明組織內需要的專案。您可以變更這些專案的名稱,但建議您維持類似的專案結構。

專案 說明
共用虛擬私有雲主專案

這個專案包含防火牆輸入規則和任何具有內部 IP 位址的資源 (如「連線至虛擬私有雲網路」一文所述)。使用共用虛擬私有雲時,您必須先將其中一項專案指派為「主專案」,然後再另外附加一或多項「服務專案」。

套用 Terraform 程式碼時,您會指定這個專案的名稱,而藍圖會部署無伺服器 VPC 存取連接器、Cloud NAT 和 Cloud Secure Web Proxy。

共用虛擬私有雲服務專案

這個專案包含無伺服器應用程式、Cloud Run 函式和無伺服器虛擬私有雲端存取連接器。您可以附加服務專案至主專案,讓服務專案能夠加入共用虛擬私有雲網路。

套用 Terraform 程式碼時,您會指定這個專案的名稱。藍圖會部署您用途所需的 Cloud Run 函式和服務,例如 Cloud SQL、Cloud Scheduler、Cloud Storage 或 BigQuery。

套用 Terraform 程式碼時,您會指定這個專案的名稱,而藍圖會部署 Cloud KMS。如果您在 Cloud Run 函式的無伺服器設計範本中使用安全無伺服器輔助工具模組,也會部署 Artifact Registry。

安全性專案

這個專案包含特定安全性服務,例如 Cloud KMS 和 Secret Manager。

安全性專案的預設名稱為 prj-bu1-p-sec。如果您在部署安全性基礎藍圖後部署這個藍圖,系統會建立安全性專案專案,並附加企業基礎藍圖的祕密專案 (prj-bu1-p-env-secrets)。如要進一步瞭解企業基礎藍圖專案,請參閱「專案」。

如果您在沒有企業基礎架構藍圖的情況下部署多個此藍圖的執行個體,每個執行個體都會有專屬的安全性專案。

將角色和群組對應至專案

您必須將組成無伺服器架構的專案存取權授予機構中的不同使用者群組。下表說明您在建立專案時,使用者群組和角色指派的藍圖建議。您可以自訂群組,讓群組符合貴機構現有的結構,但建議您維持類似的職責和角色指派。

群組 專案 角色
無伺服器管理員
grp-gcp-serverless-admin@example.com
服務專案
Serverless 安全管理員
grp-gcp-serverless-security-admin@example.com
安全性專案
Cloud Run 函式開發人員
grp-gcp-secure-cloud-run-developer@example.com
安全性專案
Cloud Run 函式使用者
grp-gcp-secure-cloud-run-user@example.com
共用虛擬私有雲服務專案

安全性控管

本節將說明您可用於保護無伺服器架構的 Google Cloud 安全控管機制。以下是需要考量的關鍵安全性原則:

  • 根據最小權限原則確保存取權,只授予實體執行工作所需的權限。
  • 透過信任界線設計 (包括網路區隔、機構政策和防火牆政策) 保護網路連線。
  • 每項服務的安全設定。
  • 找出代管無伺服器工作負載的基礎架構,並指派風險等級,以便符合法規遵循或法規要求。
  • 設定足夠的監控和記錄功能,以支援安全性作業和事件管理的稽核追蹤記錄。

建構系統控制項

部署無伺服器應用程式時,您會使用 Artifact Registry 儲存容器映像檔和二進位檔。Artifact Registry 支援 CMEK,因此您可以使用自己的加密金鑰加密存放區。

網路和防火牆規則

虛擬私有雲 (VPC) 防火牆規則可控管進入邊界的資料流量。您建立的防火牆規則會拒絕所有輸出連線,但從 restricted.googleapis.com 特殊網域名稱傳送的特定 TCP 通訊埠 443 連線除外。使用 restricted.googleapis.com 網域有以下優點:

  • 當工作負載與 Google API 和服務通訊時,使用私人 Google 存取權可協助減少網路攻擊面。
  • 這可確保您只使用支援 VPC Service Controls 的服務。

此外,您還需要建立 DNS 記錄,將 *.googleapis.com 解析為 restricted.googleapis.com

詳情請參閱「設定私人 Google 存取權」。

周邊控制

如「架構」一節所示,您可以將無伺服器應用程式的資源放在單獨的 VPC Service Controls 安全範圍中。這有助於降低系統或服務遭入侵所造成的廣泛影響。不過,當 Cloud Build 自動將程式碼建構至容器映像檔,並將該映像檔推送至 Artifact Registry 時,這個安全邊界就不適用於 Cloud Run 函式建構程序。在這種情況下,請為服務範圍內的 Cloud Build 服務帳戶建立入站規則

存取政策

為確保只有特定主體 (使用者或服務) 能存取資源和資料,您可以啟用 IAM 群組和角色。

為確保只有特定資源可以存取您的專案,您可以為 Google 機構啟用存取權政策。詳情請參閱「存取層級屬性」。

服務帳戶和存取權控管

服務帳戶是應用程式或運算工作負載的帳戶,而非個別使用者的帳戶。為實施最低權限原則和權責劃分原則,您可以建立服務帳戶,並為其設定精細的權限和有限的資源存取權。服務帳戶如下:

金鑰管理

如要驗證完整性並保護靜態資料,請搭配使用 CMEK、Artifact Registry、Cloud Run 函式、Cloud Storage 和 Eventarc。CMEK 可讓您進一步控管加密金鑰。使用以下 CMEK:

  • Artifact Registry 的軟體金鑰,用於認證無伺服器應用程式的程式碼。
  • 加密金鑰:用於加密 Cloud Run 函式部署的容器映像檔。
  • 用於加密訊息管道的 Eventarc 事件的加密金鑰
  • 加密金鑰,可協助保護 Cloud Storage 中的資料。

套用 Terraform 設定時,您會指定 CMEK 位置,這會決定金鑰的儲存地理位置。您必須確保 CMEK 與資源位於相同的區域。根據預設,CMEK 會每 30 天輪替一次。

密鑰管理

Cloud Run 函式支援 Secret Manager,可用於儲存無伺服器應用程式可能需要的密鑰。這些 Secret 可能包含 API 金鑰和資料庫使用者名稱和密碼。如要將機密資料公開為已掛載的磁碟區,請在主模組中使用 service_configs 物件變數。

當您使用企業基礎架構藍圖部署此藍圖時,必須先將密碼新增至密碼專案,才能套用 Terraform 程式碼。範本會將 Secret Manager 密鑰評估員 (roles/secretmanager.secretAccessor) 角色授予 Cloud Run 函式服務帳戶。詳情請參閱「使用密鑰」一文。

機構政策

這個藍圖會在企業基礎架構藍圖使用的機構政策限制中加入限制。如要進一步瞭解企業基礎架構藍圖使用的限制,請參閱「機構政策限制」。

下表說明這個範本的安全 Cloud Run 函式安全性模組中定義的其他機構政策限制。

政策限制 說明 建議值
允許的輸入設定 (Cloud Run 函式) constraints/cloudfunctions.allowedIngressSettings

僅允許來自內部服務或外部 HTTP(S) 負載平衡器的入站流量。

預設為 ALLOW_ALL

ALLOW_INTERNAL_ONLY
必須指定虛擬私有雲連接器 (Cloud Run 函式) constraints/cloudfunctions.requireVPCConnector

要求在部署函式時指定無伺服器虛擬私有雲存取連接器。如果強制執行這項限制,函式就必須指定無伺服器虛擬私人雲端存取連接器。

預設為 false

true
允許的虛擬私有雲連接器輸出設定 (Cloud Run 函式) cloudfunctions.allowedVpcConnectorEgressSettings

要求 Cloud Run 函式的所有輸出流量都使用無伺服器虛擬私有雲存取連接器。

預設為 PRIVATE_RANGES_ONLY

ALL_TRAFFIC

作業控管

您可以啟用記錄功能和 Security Command Center Premium 級別功能,例如安全狀態分析和威脅偵測。這些控制項可協助您執行下列操作:

  • 監控資料存取權。
  • 確保已實施適當的稽核機制。
  • 支援貴機構的安全性作業和事件管理功能。

記錄

為協助您滿足稽核規定並深入瞭解專案,您可以為要追蹤的服務設定 Google Cloud Observability 資料記錄。在套用 Terraform 程式碼前,請先在專案中部署 Cloud Logging,以確保範本能為防火牆、負載平衡器和虛擬私有雲網路設定記錄。

部署藍圖後,建議您設定下列項目:

針對專案中的所有服務,請確保記錄包含資料寫入和管理存取權的相關資訊。如要進一步瞭解記錄最佳做法,請參閱「偵測控制項」。

監控和快訊

部署範本後,您可以設定快訊,通知安全作業中心 (SOC) 發生安全性事件。舉例來說,您可以使用快訊,讓安全分析師知道 IAM 角色的權限何時有所變更。如要進一步瞭解如何設定 Security Command Center 快訊,請參閱「設定發現項目通知」。

Cloud Run functions Monitoring 資訊主頁可協助您監控 Cloud Run functions 的效能和健康狀態。提供各種指標和記錄檔,可用於找出問題並進行疑難排解。資訊主頁也提供多項功能,可協助您改善函式效能,例如設定快訊和配額的功能。

詳情請參閱「監控 Cloud Run 函式」。

如要匯出快訊,請參閱下列文件:

偵錯和疑難排解

您可以執行連線能力測試,協助您在 Cloud Run 函式與子網路內的資源之間偵錯網路設定問題。連線能力測試會模擬封包的預期路徑,並提供連線詳細資料,包括資源與資源之間的連線分析。

Connectivity Tests 並未由 Terraform 程式碼啟用,您必須另外設定。詳情請參閱「建立及執行連線測試」。

Terraform 部署模式

下表說明部署此藍圖的方式,以及各部署模式適用的 Terraform 模組。

部署模式 Terraform 模組

建議您在部署企業基礎藍圖後再部署這個藍圖。

這個選項會在企業基礎架構藍圖使用的相同 VPC Service Controls 範圍中,部署此藍圖的資源。詳情請參閱「如何為安全的 Cloud Run 函式部署作業自訂 Foundation 3.0.0 版」。

這個選項也會使用您在部署企業基礎架構藍圖時建立的密鑰專案。

使用下列 Terraform 模組:

安裝此藍圖時,不必安裝安全性基礎藍圖。

您必須建立 VPC Service Controls 範圍,才能使用這個選項。

使用下列 Terraform 模組:

整合所有資訊

如要實作本文件所述的架構,請按照下列步驟操作:

  1. 請查看藍圖的 README,確認您已符合所有必要條件。
  2. 如要在測試環境中查看藍圖的運作情形,請部署其中一個範例。這些範例與「架構」一文中所述的架構範例相符。在測試程序中,請考慮執行下列操作:
    1. 使用 Security Command Center 掃描專案,以符合常見的法規遵循要求
    2. 將範例應用程式替換為實際應用程式 (例如 1),並執行一般部署情境。
    3. 請與貴企業的應用程式工程團隊和營運團隊合作,測試他們對專案的存取權,並確認他們是否能按照預期的方式與解決方案互動。
  3. 將藍圖部署至環境。

後續步驟