本文上次更新於 2023 年 3 月,內容反映截至撰文時的情況。我們會持續改善保護客戶的方式,因此 Google 的安全性政策和系統未來可能會改變。
無伺服器架構可讓您開發軟體和服務,不必佈建或維護伺服器。您可以運用無伺服器架構,為各種服務建構應用程式。
本文提供明確的指引,協助開發運作工程師、安全架構師和應用程式開發人員,瞭解如何保護使用 Cloud Run 的無伺服器應用程式。本文件是安全藍圖的一部分,該藍圖包含下列內容:
- GitHub 存放區,內含一組 Terraform 設定和指令碼。
- 本藍圖 (即這份文件) 實作的架構、設計和安全控管指南。
雖然您可以部署這個藍圖,不必先部署Google Cloud 企業基礎藍圖,但本文假設您已按照 Google Cloud 企業基礎藍圖所述,設定一組基礎安全控制項。本文所述的架構可協助您在基礎架構上疊加額外的控制項,進一步保護無伺服器應用程式。
為協助定義與無伺服器應用程式相關的重要安全控制項,雲端安全聯盟 (CSA) 發布了無伺服器應用程式的 12 大重大風險。本藍圖採用的安全控管措施旨在因應本文所述各種用途的相關風險。
無伺服器用途
藍圖支援下列用途:
- 使用 Cloud Run 部署無伺服器架構 (本文)
- 使用 Cloud Run 函式部署無伺服器架構
Cloud Run 函式與 Cloud Run 的差異包括:
- Cloud Run 函式是由事件觸發,例如資料庫中的資料變更,或是收到來自 Pub/Sub 等訊息傳遞系統的訊息。Cloud Run 會由要求 (例如 HTTP 要求) 觸發。
- Cloud Run 函式僅支援特定執行階段。您可以使用任何程式設計語言搭配 Cloud Run。
- Cloud Run functions 會管理容器和基礎架構,控制網頁伺服器或語言執行階段,讓您專心處理程式碼。Cloud Run 可讓您彈性地自行執行這些服務,以便控管容器設定。
如要進一步瞭解 Cloud Run 和 Cloud Run 函式之間的差異,請參閱選擇運算選項 Google Cloud 。
架構
這個藍圖可讓您透過共用 VPC,在 Cloud Run 上執行無伺服器應用程式。建議您使用共用 VPC,因為這樣可以集中管理所有網路資源的網路政策和控制項。此外,共用虛擬私有雲會部署在企業基礎藍圖中。
建議架構:使用共用虛擬私有雲網路的 Cloud Run
下圖顯示如何在共用 VPC 網路中執行無伺服器應用程式。
上圖所示架構結合了下列 Google Cloud 服務和功能:
- 外部應用程式負載平衡器會從網際網路接收無伺服器應用程式所需的資料,並將資料轉送至 Cloud Run。外部應用程式負載平衡器是第 7 層負載平衡器。
- Google Cloud Armor 可做為網頁應用程式防火牆,協助保護無伺服器應用程式,防範阻斷服務 (DoS) 和網路攻擊。
- Cloud Run 可讓您在容器中執行應用程式程式碼,並代您管理基礎架構。在本藍圖中,內部和 Cloud Load Balancing Ingress 設定會限制 Cloud Run 的存取權,因此 Cloud Run 只會接受來自外部應用程式負載平衡器的要求。
無伺服器虛擬私有雲存取連接器會使用無伺服器虛擬私有雲存取,將無伺服器應用程式連線至虛擬私有雲網路。無伺服器虛擬私有雲存取可確保無伺服器應用程式傳送至虛擬私有雲網路的要求不會暴露在網路上。有了無伺服器虛擬私有雲存取,Cloud Run 就能與支援 VPC Service Controls 的其他服務、儲存系統和資源通訊。
根據預設,您會在服務專案中建立無伺服器虛擬私有雲存取連接器。執行「Secure Cloud Run Network」模組時,您可以指定
true
做為connector_on_host_project
輸入變數,在主專案中建立無伺服器虛擬私有雲存取連接器。詳情請參閱「設定方法比較」。虛擬私有雲 (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
如果未使用共用虛擬私有雲網路,您可以在虛擬私有雲服務控制範圍內部署 Cloud Run 和無伺服器應用程式,不必使用共用虛擬私有雲網路。如果您使用中樞輻射拓撲,可以實作這個替代架構。
下圖顯示如何在沒有共用 VPC 的情況下執行無伺服器應用程式。
上圖所示架構結合了Google Cloud 服務和功能,與上一節「建議架構:使用共用虛擬私有雲的 Cloud Run」中說明的架構類似。
機構架構
您可以將資源分組,以便管理資源,並將開發和測試環境與實際工作環境分開。Resource Manager 可依專案、資料夾和機構,將資源分組。
下圖顯示資源階層,其中包含代表不同環境的資料夾,例如啟動程序、通用、實際工作、非實際工作 (或測試) 和開發。這個資源階層是以企業基礎藍圖中說明的階層為基礎。您會將藍圖指定的專案部署到下列資料夾:Common
、Production
、Non-production
和 Dev
。
下列各節將詳細說明這張圖表。
資料夾
您可以使用資料夾,將實際工作環境和控管服務與非實際工作環境和測試環境隔離。下表說明這個藍圖使用的企業基礎藍圖資料夾。
資料夾 | 說明 |
---|---|
Bootstrap
|
包含部署企業基礎藍圖所需的資源。 |
Common
|
包含機構的集中式服務,例如安全專案。 |
Production
|
內含已測試完畢,可供客戶使用的雲端資源專案。在這個藍圖中,Production 資料夾包含服務專案和主專案。 |
Non-production
|
包含目前正在測試及準備發布的雲端資源專案。在這個藍圖中,Non-production 資料夾包含服務專案和主專案。 |
Dev
|
包含目前正在開發雲端資源的專案。在這個藍圖中,Dev 資料夾包含服務專案和主專案。 |
您可以變更這些資料夾的名稱,與貴機構的資料夾結構保持一致,但我們建議您維持類似的結構。詳情請參閱機構架構。如需其他資料夾結構,請參閱「為 Google Cloud 登陸區決定資源階層」。
專案
您可以使用專案,在環境中隔離資源。下表說明機構內需要的專案。您可以變更這些專案的名稱,但建議維持類似的專案結構。
專案 | 說明 |
---|---|
主專案 | 這個專案包含防火牆輸入規則,以及具有內部 IP 位址的任何資源 (如「連線至虛擬私有雲網路」一文所述)。使用共用虛擬私有雲時,您必須先將其中一項專案指派為「主專案」,然後再另外附加一或多項「服務專案」。 套用 Terraform 程式碼時,請指定這個專案的名稱,藍圖就會部署服務。 |
服務專案 | 這個專案包含無伺服器應用程式、Cloud Run 和無伺服器虛擬私有雲存取連接器。您需要將服務專案附加至主專案,服務專案才能加入共用虛擬私有雲網路。 套用 Terraform 程式碼時,請指定這個專案的名稱。藍圖會部署 Cloud Run、Cloud Armor、無伺服器虛擬私有雲存取連接器和負載平衡器。 |
安全專案 | 這個專案包含安全防護專屬服務,例如 Cloud KMS 和 Secret Manager。 套用 Terraform 程式碼時,請指定這個專案的名稱,藍圖就會部署 Cloud KMS。如果您使用「Secure Cloud Run Harness」模組,系統也會部署 Artifact Registry。 如果您在部署安全基礎藍圖後部署此藍圖,這個專案就是企業基礎藍圖建立的密鑰專案。如要進一步瞭解企業基礎藍圖專案,請參閱「專案」一文。 如果您部署這個藍圖的多個執行個體,但未部署企業基礎藍圖,每個執行個體都會有自己的安全防護專案。 |
將角色和群組對應至專案
您必須授予機構中不同使用者群組權限,讓他們存取構成無伺服器架構的專案。下表說明您建立專案時,使用者群組和角色指派的藍圖建議。您可以自訂群組,配合貴機構現有的結構,但建議您維持類似的職責和角色指派區隔。
群組 | 專案 | 角色 |
---|---|---|
無伺服器管理員 grp-gcp-serverless-admin@example.com |
服務專案 | |
無伺服器安全管理員 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 機構啟用存取權政策。詳情請參閱「存取層級屬性」。
身分與存取權 Proxy
如果環境中已包含 Identity-Aware Proxy (IAP),您可以設定外部應用程式負載平衡器,使用 IAP 授權無伺服器應用程式的流量。無伺服器應用程式可經由 IAP 建立中央授權層,因此,您可以使用應用程式層級的存取權控管機制,而非依賴網路層級的防火牆。
如要為應用程式啟用 IAP,請在 loadbalancer.tf
檔案中將 iap_config.enable
設為 true
。
如要進一步瞭解 IAP,請參閱「Identity-Aware Proxy 總覽」。
服務帳戶和存取權控管
服務帳戶是可供用於代表您執行 API 要求的身分, Google Cloud 如要實作職責分離,請建立具有不同角色的服務帳戶,以供特定用途使用。服務帳戶如下:
Cloud Run 服務帳戶 (
cloud_run_sa
),具備下列角色:roles/run.invoker
roles/secretmanager.secretAccessor
詳情請參閱「允許 Cloud Run 存取密鑰」。
具有
roles/compute.networkUser
角色的無伺服器虛擬私有雲存取連接器帳戶 (gcp_sa_vpcaccess
)。第二個無伺服器虛擬私有雲存取連接器帳戶 (
cloud_services
),且具有roles/compute.networkUser
角色。無伺服器虛擬私有雲存取連接器需要這些服務帳戶,才能在主專案中建立防火牆輸入和輸出規則。詳情請參閱「在服務專案中授予服務帳戶權限」。
執行 Cloud Run 的服務身分 (
run_identity_services
),且具有roles/vpcaccess.user
角色。具有
roles/editor
角色的 Google API 服務代理人 (cloud_services_sa
)。這個服務帳戶可讓 Cloud Run 與無伺服器虛擬私有雲存取連接器通訊。Cloud Run 的服務身分 (
serverless_sa
) 具有roles/artifactregistry.reader
角色。這個服務帳戶可存取 Artifact Registry,以及 CMEK 加密和解密金鑰。
金鑰管理
您可以使用 CMEK 金鑰,協助保護 Artifact Registry 和 Cloud Run 中的資料。您會使用下列加密金鑰:
- Artifact Registry 的軟體金鑰,可證明無伺服器應用程式的程式碼。
- 用於加密 Cloud Run 部署的容器映像檔的加密金鑰。
套用 Terraform 設定時,請指定 CMEK 位置,這會決定金鑰的儲存地理位置。請務必確認 CMEK 金鑰與資源位於相同區域。根據預設,CMEK 金鑰每 30 天會輪替一次。
密鑰管理
Cloud Run 支援 Secret Manager,可儲存無伺服器應用程式可能需要的密鑰。這些密碼可能包括 API 金鑰,以及資料庫使用者名稱和密碼。如要將密碼公開為已掛接的磁碟區,請在主要模組中使用 volume_mounts
和 volumes
變數。
使用企業基礎藍圖部署這個藍圖時,您必須先將密鑰新增至密鑰專案,再套用 Terraform 程式碼。藍圖會將 Secret Manager 密鑰存取者角色授予 Cloud Run 服務帳戶。詳情請參閱「使用密鑰」。
機構政策
這個藍圖會將限制新增至機構政策限制。如要進一步瞭解企業基礎藍圖使用的限制,請參閱機構政策限制。
下表說明藍圖的「Secure Cloud Run Security」(安全 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。請先在專案中部署 Cloud Logging,再套用 Terraform 程式碼,確保藍圖可以為防火牆、負載平衡器和虛擬私有雲網路設定記錄。
部署藍圖後,建議您設定下列項目:
- 在所有專案中建立匯總記錄接收器。
- 選取適當的記錄儲存區域。
- 將 CMEK 金鑰新增至記錄接收器。
請確保專案中所有服務的記錄都包含資料讀取和寫入的相關資訊,以及管理員存取的內容。如要進一步瞭解記錄最佳做法,請參閱「偵測控制項」。
監控和快訊
部署藍圖後,您可以設定快訊,在可能發生安全性事件時通知安全營運中心 (SOC)。舉例來說,您可以使用快訊,在 IAM 角色中的權限變更時通知安全分析師。如要進一步瞭解如何設定 Security Command Center 快訊,請參閱「設定發現項目通知」。
Cloud Run 監控資訊主頁是範例資訊主頁程式庫的一部分,可提供下列資訊:
- 要求數量
- 要求延遲時間
- 計費執行個體時間
- 容器 CPU 分配時間
- 容器記憶體分配時間
- 容器 CPU 使用率
- 容器記憶體使用率
如需匯入資訊主頁的操作說明,請參閱「安裝範例資訊主頁」。如要匯出快訊,請參閱下列文件:
偵錯和疑難排解
您可以執行連線測試,協助偵錯 Cloud Run 與子網路內資源之間的網路設定問題。連線能力測試會模擬封包的預期路徑,並提供連線詳細資料,包括資源對資源的連線分析。
Connectivity Tests 不會透過 Terraform 程式碼啟用,您必須另外設定。詳情請參閱「建立及執行連線測試」。
偵測性控制
本節說明藍圖中包含的偵測控制項。
Cloud Armor 和 WAF
您使用外部應用程式負載平衡器和 Cloud Armor,為無伺服器應用程式提供分散式阻斷服務 (DDoS) 防護。Cloud Armor 是Google Cloud隨附的網頁應用程式防火牆 (WAF)。
您會設定下表所述的 Cloud Armor 規則,協助保護無伺服器應用程式。這些規則旨在防範 OWASP 前十大風險。
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
|
啟用這些規則後,Cloud Armor 會自動拒絕任何符合規則的流量。
如要進一步瞭解這些規則,請參閱調整 Google Cloud Armor 預先設定的 WAF 規則。
偵測 Cloud Run 中的安全性問題
您可以使用 Recommender 偵測 Cloud Run 中的潛在安全性問題。最佳化建議工具可偵測下列安全性問題:
- 儲存在環境變數而非 Secret Manager 中的 API 金鑰或密碼。
- 容器包含硬式編碼憑證,而非使用服務身分。
部署 Cloud Run 大約一天後,Recommender 就會開始提供評估結果和建議。建議工具會在 Cloud Run 服務清單或建議中心中,顯示調查結果和建議的修正措施。
Terraform 部署模式
下表說明部署此藍圖的方法,以及適用於各部署模式的 Terraform 模組。
部署模式 | Terraform 模組 |
---|---|
部署企業基礎藍圖後,再部署這個藍圖 (建議)。 這個選項會在企業基礎藍圖使用的相同 VPC Service Controls 服務範圍中,部署這個藍圖的資源。詳情請參閱「如何為安全無伺服器部署作業自訂 Foundation v2.3.1」。 這個選項也會使用您部署企業基礎藍圖時建立的密鑰專案。 |
使用下列 Terraform 模組: |
安裝這個藍圖時,不必安裝企業基礎藍圖。 如要使用這個選項,必須建立 VPC Service Controls 範圍。 |
使用下列 Terraform 模組: |
整合所有內容
如要實作本文所述的架構,請按照下列步驟操作:
- 請詳閱藍圖的 README,並確認您符合所有必要條件。
- 建立 SSL 憑證,以搭配外部應用程式負載平衡器使用。
如果您未完成這個步驟,藍圖會使用自行簽署的憑證部署負載平衡器,且當您嘗試存取無伺服器應用程式時,瀏覽器會顯示不安全連線的警告。 - 在測試環境中部署安全 Cloud Run 範例,即可查看藍圖的實際運作情形。在測試過程中,請考慮執行下列操作:
- 使用 Security Command Center 掃描專案,確認是否符合常見的法規遵循規定。
- 將範例應用程式換成實際應用程式,並執行典型的部署情境。
- 與企業中的應用程式工程和營運團隊合作,測試他們對專案的存取權,並驗證他們是否能以預期方式與解決方案互動。
- 將藍圖部署至環境。
法規遵循對應
為協助定義與無伺服器應用程式相關的重要安全控制項,雲端安全聯盟 (CSA) 發布了無伺服器應用程式的 12 大重大風險。如以下表格所示,這個藍圖採用的安全控管措施有助於因應大部分風險。
風險 | 藍圖緩解 | 您的責任 |
---|---|---|
1. 函式事件資料注入 | 如「Google Cloud 2021 年的 OWASP 前 10 名緩解選項 Google Cloud」一文所述,Cloud Armor 和外部應用程式負載平衡器有助於防範 OWASP 前 10 名。 | 安全編碼做法,例如例外狀況處理,如 OWASP 安全編碼做法和軟體構件供應鏈級別 (SLSA) 所述 |
2. 驗證機制失效 | 無 | 使用 IAP 和 Identity Platform 向服務驗證使用者 |
3. 不安全的無伺服器部署設定 | 搭配 Cloud KMS 的 CMEK |
管理自己的加密金鑰 |
4. 非必要函式權限和角色 |
|
無 |
5. 函式監控和記錄不足 | Cloud Logging | Cloud Monitoring 資訊主頁和快訊結構 |
6. 不安全的第三方依附元件 | 無 | 使用程式碼掃描和部署前分析功能,保護 CI/CD 管道 |
7. 應用程式密鑰儲存方式不安全 | Secret Manager | 在應用程式程式碼中管理密鑰 |
8. 阻斷服務和耗盡財務資源 |
|
無 |
9. 無伺服器商業邏輯操作 | VPC Service Controls,可限制 Google Cloud API 存取範圍 (使用企業基礎藍圖提供) | 無 |
10. 不當的例外狀況處理和詳細的錯誤訊息 | 無 | 安全程式設計最佳做法 |
11. 已淘汰的函式、雲端資源和事件觸發條件 | 使用修訂版本,盡量縮小攻擊面。修訂版本有助於降低意外啟用先前過時服務疊代的可能性。您也可以使用A/B 測試,搭配監控和記錄工具,測試新修訂版本的安全性狀態。 |
|
12. 跨執行作業的資料持續性 | 無 | 無 |
後續步驟
- 如要瞭解安全環境的基準,請參閱Google Cloud 企業基礎藍圖。
- 如要查看本文所述藍圖的詳細資料,請參閱 Terraform 設定 README 檔案。
如要瞭解安全性和法規遵循最佳做法,請參閱Google Cloud 架構完善的架構:安全性、隱私權和法規遵循。
如要瞭解更多最佳做法和藍圖,請參閱安全性最佳做法中心。