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

Last reviewed 2023-03-10 UTC

本文上次更新於 2023 年 3 月,內容反映截至撰文時的情況。我們會持續改善客戶資料的保護機制,因此 Google 的安全性政策和系統未來可能會有所變動。

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

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

  • 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 網路中執行無伺服器應用程式。

無伺服器藍圖的架構。

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

  • 外部應用程式負載平衡器會從網際網路接收無伺服器應用程式所需的資料,並轉送至 Cloud Run。外部應用程式負載平衡器是第 7 層負載平衡器。
  • Google Cloud Armor 可做為網頁應用程式防火牆,協助保護無伺服器應用程式,防範阻斷服務 (DoS) 和網路攻擊。
  • Cloud Run 可讓您在容器中執行應用程式程式碼,並代您管理基礎架構。在這個藍圖中,內部和 Cloud Load Balancing 入口設定會限制 Cloud Run 的存取權,讓 Cloud Run 只接受來自外部應用程式負載平衡器的要求。
  • 無伺服器虛擬私有雲存取連接器會使用無伺服器虛擬私有雲存取,將無伺服器應用程式連線至虛擬私人雲端網路。無伺服器虛擬私有雲端存取可確保無伺服器應用程式向 VPC 網路傳送的要求不會暴露於網路。有了無伺服器虛擬私有雲存取,Cloud Run 就能與支援 VPC Service Controls的其他服務、儲存系統和資源通訊。

    根據預設,您會在服務專案中建立無伺服器虛擬私有雲存取連接器。您可以在執行 Secure Cloud Run Network 模組時,為 connector_on_host_project 輸入變數指定 true,即可在主機專案中建立無伺服器虛擬私有雲存取連接器。詳情請參閱「設定方法比較」。

  • 虛擬私有雲 (VPC) 防火牆規則可控管資料流入代管資源的子網路,例如在 Compute Engine 上代管的公司伺服器,或是儲存在 Cloud Storage 中的公司資料。

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

  • 共用虛擬私人雲端可讓您將服務專案中的無伺服器虛擬私有雲存取連接器連結至主專案。

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

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

替代架構:不使用共用 VPC 網路的 Cloud Run

如果您未使用共用虛擬私有雲網路,可以在不使用共用虛擬私有雲網路的情況下,在 VPC 服務控管範圍內部署 Cloud Run 和無伺服器應用程式。如果您使用樞紐和輻條拓樸,可以實作這個替代架構。

下圖顯示如何在不使用共用 VPC 的情況下,執行無伺服器應用程式。

無伺服器藍圖的替代架構。

在上圖所示架構中,Google Cloud 服務和功能的組合與前面「建議架構:搭配共用虛擬私有雲的 Cloud Run」一節所述的類似。

機構架構

您可以將資源分組,以便管理這些資源,並將開發和測試環境與實際工作環境區隔開來。Resource Manager 可讓您按照邏輯將資源分組為專案、資料夾和機構。

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

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

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

資料夾

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

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

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

專案

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

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

套用 Terraform 程式碼時,您會指定這個專案的名稱,而藍圖會部署服務。
服務專案 這個專案包含無伺服器應用程式、Cloud Run 和無伺服器虛擬私有雲存取連接器。您可以附加服務專案至主專案,讓服務專案能夠加入共用虛擬私有雲網路。

套用 Terraform 程式碼時,您必須指定這個專案的名稱。藍圖會部署 Cloud Run、Google Cloud Armor、無伺服器虛擬私有雲端存取連接器和負載平衡器。
安全性專案 這個專案包含特定安全性服務,例如 Cloud KMS 和 Secret Manager。

套用 Terraform 程式碼時,您會指定這個專案的名稱,而藍圖會部署 Cloud KMS。如果您使用 Secure Cloud Run Harness 模組,也會部署 Artifact Registry。

如果您在部署安全性基礎架構設計藍圖後部署此設計藍圖,這個專案就是由企業基礎架構設計藍圖建立的機密專案。如要進一步瞭解企業基礎架構藍圖專案,請參閱「專案」一文。

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

將角色和群組對應至專案

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

群組 專案 角色
無伺服器管理員

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,因此您可以使用自己的加密金鑰加密存放區。

安全資料傳輸層 (SSL) 流量

如要支援無伺服器應用程式的 HTTPS 流量,請為外部應用程式負載平衡器設定 SSL 憑證。根據預設,您會使用自行簽署的憑證,您可以在套用 Terraform 程式碼後,將其變更為受管理的憑證。如要進一步瞭解如何安裝及使用代管憑證,請參閱「使用 Google 代管的 SSL 憑證」。

網路和防火牆規則

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

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

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

周邊控制

建議架構圖表所示,您應將無伺服器應用程式的資源放在獨立的範圍中。這個範圍有助於保護無伺服器應用程式,避免遭到意外存取和資料外洩。

存取政策

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

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

Identity and Access Proxy

如果環境中已包含 Identity and Access Proxy (IAP),您可以設定外部應用程式負載平衡器,以便使用 IAP 授權無伺服器應用程式的流量。透過 IAP,您可以為無伺服器應用程式建立中央授權層,因此可以使用應用程式層級的存取權控管機制,而非依賴網路層級防火牆。

如要為應用程式啟用 IAP,請在 loadbalancer.tf 檔案中將 iap_config.enable 設為 true

如要進一步瞭解 IAP,請參閱「Identity-Aware Proxy 總覽」。

服務帳戶和存取權控管

服務帳戶是可供 Google Cloud 用於代表您執行 API 要求的身分,為實施職責分離,您可以建立具有不同角色的服務帳戶,用於特定用途。服務帳戶如下:

  • 具備下列角色的 Cloud Run 服務帳戶 (cloud_run_sa):

    • roles/run.invoker
    • roles/secretmanager.secretAccessor

    詳情請參閱「允許 Cloud Run 存取密鑰」一文。

  • 具有 roles/compute.networkUser 角色的無伺服器虛擬私有雲存取連接器帳戶 (gcp_sa_vpcaccess)。

  • 具備 roles/compute.networkUser 角色的第二個無伺服器虛擬私有雲存取連接器帳戶 (cloud_services)。

    無伺服器虛擬私有雲存取連接器需要這些服務帳戶,才能在主機專案中建立防火牆輸入和輸出規則。詳情請參閱「為服務專案中的服務帳戶授予權限」。

  • 具有 roles/vpcaccess.user 角色,可執行 Cloud Run (run_identity_services) 的服務身分。

  • 具有 roles/editor 角色的 Google API 服務代理人 (cloud_services_sa)。這個服務帳戶可讓 Cloud Run 與無伺服器虛擬私有雲存取連接器通訊。

  • 具有 roles/artifactregistry.reader 角色的 Cloud Run (serverless_sa) 服務身分。這個服務帳戶可提供存取 Artifact Registry 和 CMEK 加密金鑰和解密金鑰的權限。

金鑰管理

您可以使用 CMEK 金鑰保護 Artifact Registry 和 Cloud Run 中的資料。您會使用下列加密金鑰:

  • Artifact Registry 的軟體金鑰,用於認證無伺服器應用程式的程式碼。
  • 加密金鑰,用於加密 Cloud Run 部署的容器映像檔。

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

密鑰管理

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

使用企業版基礎架構藍圖部署此藍圖時,您必須先將密碼新增至密碼專案,再套用 Terraform 程式碼。藍圖會將 Secret Manager 密鑰存取權角色授予 Cloud Run 服務帳戶。詳情請參閱「使用密鑰」。

機構政策

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

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

政策限制 說明 建議值
constraints/run.allowedIngress 僅允許來自內部服務或外部應用程式負載平衡器的輸入流量。 internal-and-cloud-load-balancing
constraints/run.allowedVPCEgress 要求 Cloud Run 服務的修訂版本使用無伺服器虛擬私有雲存取連接器,並確保修訂版本的虛擬私有雲輸出設定設為僅允許私人範圍。 private-ranges-only

作業控管

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

  • 監控哪些人可以存取您的資料。
  • 確保已實施適當的稽核機制。
  • 支援事件管理和作業團隊因應可能發生的問題。

記錄

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

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

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

監控和快訊

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

Cloud Run Monitoring 資訊主頁是範例資訊主頁程式庫的一部分,可提供以下資訊:

  • 要求數量
  • 要求延遲時間
  • 計費執行個體時間
  • 容器 CPU 分配時間
  • 容器記憶體分配時間
  • 容器 CPU 使用率
  • 容器記憶體使用率

如需資訊主頁匯入操作說明,請參閱「安裝範例資訊主頁」。如要匯出快訊,請參閱下列文件:

偵錯和疑難排解

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

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

偵測性控制

本節將說明範本中包含的偵測控制項。

Google Cloud Armor 和 WAF

您使用外部應用程式負載平衡器和 Google Cloud Armor,為無伺服器應用程式提供分散式阻斷服務 (DDoS) 防護。Google Cloud Armor 是Google Cloud隨附的網頁應用程式防火牆 (WAF)。

您可以設定下表所述的 Google Cloud Armor 規則,協助保護無伺服器應用程式。這些規則旨在協助減輕 OWASP 前十大風險

Google Cloud Armor 規則名稱 ModSecurity 規則名稱
遠端程式碼執行 rce-v33-stable
本機檔案包含 lfi-v33-stable
通訊協定攻擊 protocolattack-v33-stable
遠端檔案包含 rfi-v33-stable
掃描器偵測 scannerdetection-v33-stable
工作階段固定攻擊 sessionfixation-v33-stable
SQL 插入 sqli-v33-stable
跨網站指令碼攻擊 xss-v33-stable

啟用這些規則後,Google Cloud Armor 會自動拒絕任何符合規則的流量。

如要進一步瞭解這些規則,請參閱「調整 Google Cloud Armor 預先設定的 WAF 規則」。

在 Cloud Run 中偵測安全性問題

您可以使用 Recommender 偵測 Cloud Run 中的潛在安全性問題。Recommender 可偵測下列安全性問題:

  • API 金鑰或密碼儲存在環境變數中,而非儲存在 Secret Manager 中。
  • 容器包含硬式編碼憑證,而非使用服務身分

在您部署 Cloud Run 後約一天,Recommender 就會開始提供發現結果和建議。建議工具會在 Cloud Run 服務清單建議中心中顯示所得出結論和建議的修正動作。

Terraform 部署模式

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

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

這個選項會在企業基礎架構藍圖使用的相同 VPC Service Controls 範圍中,部署此藍圖的資源。詳情請參閱「如何為安全無伺服器部署作業自訂 Foundation v2.3.1」。

這個選項也會使用您在部署企業基礎架構藍圖時建立的機密專案。
使用下列 Terraform 模組:
安裝此藍圖時,不必安裝企業基礎藍圖。

您必須建立 VPC Service Controls 範圍,才能使用這個選項。
使用下列 Terraform 模組:

整合所有資訊

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

  1. 請詳閱藍圖的README,確認您已符合所有先決條件。
  2. 建立用於外部應用程式負載平衡器SSL 憑證
    如果您未完成這個步驟,藍圖會使用自行簽署的憑證部署負載平衡器,而當您嘗試存取無伺服器應用程式時,瀏覽器會顯示有關不安全連線的警告。
  3. 在測試環境中部署安全的 Cloud Run 範例,查看藍圖的實際運作情形。在測試程序中,請考慮執行下列操作:
    1. 使用 Security Command Center 掃描專案,以符合常見的法規遵循要求
    2. 將範例應用程式替換為實際應用程式,並執行一般部署情境。
    3. 請與貴企業的應用程式工程團隊和營運團隊合作,測試他們對專案的存取權,並確認他們是否能按照預期的方式與解決方案互動。
  4. 將藍圖部署至環境。

法規遵循對應

為協助您定義與無伺服器應用程式相關的重要安全控制項,Cloud Security Alliance (CSA) 發布了無伺服器應用程式的 12 大重大風險。本藍圖中使用的安全控管措施可協助您解決上述大部分的風險,如下表所述。

風險 藍圖緩解措施 您的責任
1. 功能事件資料插入 Google Cloud Armor 和外部應用程式負載平衡器可協助防範 OWASP 前 10 名,如「OWASP 前 10 名 2021 年緩解選項 Google Cloud」所述 安全程式碼編寫做法,例如例外狀況處理,請參閱 OWASP 安全程式碼編寫做法軟體構件供應鏈級別 (SLSA)
2. 驗證機制故障 使用 IAP 和 Identity Platform 驗證服務的使用者
3. 不安全的無伺服器部署設定 搭配 Cloud KMS 使用的 CMEK
管理自己的加密金鑰
4. 非必要權限的函式權限和角色
  • 用於服務驗證的自訂服務帳戶 (非預設的 Compute Engine 服務帳戶)
  • Cloud Run 服務帳戶上嚴格範圍的 IAM 角色
  • 使用 VPC Service Controls 限制 Google Cloud API 存取權的範圍 (使用 Google Cloud 企業基礎架構藍圖提供)
5. 監控及記錄功能不足 Cloud Logging Cloud Monitoring 資訊主頁和快訊結構
6. 不安全的第三方依附元件 使用程式碼掃描和部署前分析功能保護 CI/CD 管道
7. 不安全的應用程式密鑰儲存空間 Secret Manager 應用程式程式碼中的密鑰管理
8. 阻斷服務和耗盡財務資源
  • Google Cloud Armor
  • Cloud Run 服務逾時 (預設為 120 秒)
9. 無伺服器商業邏輯操控 使用 VPC Service Controls 限制 Google Cloud API 存取範圍 (使用企業基礎架構藍圖提供)
10. 不當的例外狀況處理和冗長的錯誤訊息 安全程式設計最佳做法
11. 已淘汰的函式、雲端資源和事件觸發條件 使用修訂版本,盡量減少攻擊面。修訂版有助於降低意外啟用服務舊版 (已淘汰的版本) 的可能性。修訂版本也能協助您使用A/B 測試和監控及記錄工具,測試新修訂版本的安全性。
  • 使用基礎架構即程式碼 (IaC) 管理雲端資源
  • 使用 Security Command Center 監控雲端資源
  • Cloud Billing 監控
  • 清除未使用的雲端資源,盡可能減少攻擊面
12. 跨執行作業資料的持續性

後續步驟