無伺服器架構可讓您開發軟體和服務,不必佈建或維護伺服器。您可以運用無伺服器架構,為各種服務建構應用程式。
本文提供明確的指引,協助開發運作工程師、安全架構師和應用程式開發人員瞭解如何保護使用 Cloud Run 函式 (第 2 代) 的無伺服器應用程式。本文件是安全藍圖的一部分,該藍圖包含下列內容:
- GitHub 存放區,內含一組 Terraform 設定和指令碼。
- 本藍圖 (即這份文件) 實作的架構、設計和安全控管指南。
雖然您可以部署這個藍圖,不必先部署Google Cloud 企業基礎藍圖,但本文假設您已按照企業基礎藍圖的說明,設定一組基礎安全控制項。 Google Cloud 本文所述的架構可協助您在基礎架構上疊加額外的控制項,進一步保護無伺服器應用程式。
為協助定義與無伺服器應用程式相關的重要安全控制項,Cloud Security Alliance (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 。
架構
本藍圖採用共用虛擬私有雲架構,其中 Cloud Run 函式部署在服務專案中,可存取其他 VPC 網路中的資源。
下圖顯示高階架構,後續的範例架構會進一步說明。
上圖所示架構結合了下列 Google Cloud 服務和功能:
- Cloud Run functions 可讓您以服務形式執行函式,並代您管理基礎架構。根據預設,這個架構會部署只有內部 IP 位址的 Cloud Run 函式,且無法存取公開網際網路。
- 觸發事件是指觸發 Cloud Run 函式的事件。如範例架構中進一步所述,這可以是 Cloud Storage 事件、排定的間隔,或是 BigQuery 中的變更。
- Artifact Registry 會儲存 Cloud Run functions 應用程式的來源容器。
- 共用虛擬私有雲可讓您將服務專案中的無伺服器虛擬私有雲存取連接器連線至主專案。您為每個環境 (實際工作環境、非實際工作環境和開發環境) 部署個別的共用虛擬私有雲網路。這個網路設計可在不同環境之間提供網路隔離。共用 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 functions 的建構階段,使用 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 functions 的密鑰。藍圖會將密鑰掛接為磁碟區,與將密鑰做為環境變數傳遞相比,安全等級更高。
Identity and Access Management (IAM) 和 Resource Manager 可協助限制存取權及隔離資源。存取控制和資源階層遵循最低權限原則。
Cloud Logging 會收集 Google Cloud 服務的所有記錄,供分析和調查工具儲存及擷取。
Cloud Monitoring 會收集及儲存Google Cloud 服務的效能資訊和指標。
使用 Cloud Storage 的無伺服器應用程式架構範例
下圖說明如何在 Cloud Storage 中發生特定事件時,執行可存取內部伺服器的無伺服器應用程式。
除了「架構」一節所述的服務外,這個範例架構還會搭配使用下列 Google Cloud服務和功能:
- 當任何雲端資源、應用程式或使用者在值區中建立網頁物件時,Cloud Storage 會發出事件。
- Eventarc 會轉送來自不同資源的事件。Eventarc 會加密傳輸中和靜態的事件。
- Pub/Sub 會將事件排入佇列,做為 Cloud Run 函式的輸入內容和觸發條件。
- 虛擬私有雲 (VPC) 防火牆規則可控管資料流入代管資源 (例如內部伺服器) 的子網路。
- 內部伺服器會在 Compute Engine 或 Google Kubernetes Engine 上執行,並代管內部應用程式。如果您部署「Secure Cloud Run functions with Internal Server Example」,系統會部署含有「Hello World」 HTML 網頁的 Apache 伺服器。這個範例會模擬存取執行 VM 或容器的內部應用程式。
使用 Cloud SQL 的架構範例
下圖顯示如何執行無伺服器應用程式,以存取 Cloud Scheduler 中定義的固定間隔時間,存取 Cloud SQL 託管服務。您可以在必須收集記錄、彙整資料等情況下使用這個架構。
除了「架構」一節所述的服務外,這個範例架構還會搭配使用下列 Google Cloud服務和功能:
- Cloud Scheduler 會定期發出事件。
- Pub/Sub 會將事件排入佇列,做為 Cloud Run 函式的輸入內容和觸發條件。
- 虛擬私有雲 (VPC) 防火牆規則可控管資料流入代管資源的子網路,例如儲存在 Cloud SQL 中的公司資料。
- Cloud SQL 驗證 Proxy 可控管 Cloud SQL 的存取權。
- Cloud SQL 會代管與虛擬私有雲網路對等互連的服務,無伺服器應用程式可以存取該服務。如果您部署使用 Cloud SQL 範例保護 Cloud Run 函式,就會部署 MySQL 資料庫和範例資料庫。
採用 BigQuery 資料倉儲的架構範例
下圖顯示如何執行無伺服器應用程式,在 BigQuery 中發生事件時 (例如新增資料或建立資料表) 觸發應用程式。
除了「架構」一節所述的服務外,這個範例架構還會搭配使用下列 Google Cloud服務和功能:
- BigQuery 負責代管資料倉儲。如果您部署由 BigQuery 觸發的 Cloud Run 函式安全範例,就會部署範例 BigQuery 資料集和資料表。
- 當 BigQuery 發生特定事件時,Eventarc 會觸發 Cloud Run 函式。
機構架構
Resource Manager 可讓您依專案、資料夾和機構,以邏輯方式將資源分組。
下圖顯示資源階層,其中包含代表不同環境的資料夾,例如啟動程序、通用、實際工作、非實際工作 (或測試) 和開發。這個資源階層是以企業基礎藍圖中說明的階層為基礎。您會將藍圖指定的專案部署到下列資料夾:Common
、Production
、Non-production
和 Dev
。
下列各節將詳細說明這張圖表。
資料夾
您可以使用資料夾,將實際工作環境和控管服務與非實際工作環境和測試環境隔離。下表說明這個藍圖使用的企業基礎藍圖資料夾。
資料夾 | 說明 |
---|---|
Bootstrap
|
包含部署企業基礎藍圖所需的資源。 |
Common
|
包含機構的集中式服務,例如安全專案。 |
Production
|
內含已測試完畢的雲端資源,可供客戶使用。在這個藍圖中,Production 資料夾包含服務專案和主專案。 |
Non-production
|
包含目前正在測試及準備發布的雲端資源所屬專案。在本藍圖中,Non-production 資料夾包含服務專案和主專案。 |
Development
|
包含目前正在開發雲端資源的專案。在這個藍圖中,Development 資料夾包含服務專案和主專案。 |
您可以變更這些資料夾的名稱,與貴機構的資料夾結構保持一致,但我們建議您維持類似的結構。詳情請參閱機構架構。如需其他資料夾結構,請參閱「為 Google Cloud 登陸區決定資源階層」。
專案
您可以使用專案,在環境中隔離資源。下表說明機構內需要的專案。您可以變更這些專案的名稱,但建議維持類似的專案結構。
專案 | 說明 |
---|---|
共用虛擬私有雲主專案 | 這個專案包含防火牆輸入規則,以及任何具有內部 IP 位址的資源 (如「連線至虛擬私有雲網路」一文所述)。使用共用虛擬私有雲時,您必須先將其中一項專案指派為「主專案」,然後再另外附加一或多項「服務專案」。 套用 Terraform 程式碼時,您會指定這個專案的名稱,藍圖則會部署無伺服器虛擬私有雲存取連接器、Cloud NAT 和 Cloud Secure Web Proxy。 |
共用虛擬私有雲服務專案 | 這個專案包含無伺服器應用程式、Cloud Run 函式和無伺服器虛擬私有雲存取連接器。您要將服務專案附加至主專案,服務專案才能加入共用虛擬私有雲網路。 套用 Terraform 程式碼時,請指定這個專案的名稱。藍圖會部署用例所需的 Cloud Run 函式和服務,例如 Cloud SQL、Cloud Scheduler、Cloud Storage 或 BigQuery。 套用 Terraform 程式碼時,您會指定這個專案的名稱,藍圖也會部署 Cloud KMS。如果您在 Cloud Run functions 的無伺服器藍圖中使用「Secure Serverless Harness」模組,系統也會部署 Artifact Registry。 |
安全專案 | 這個專案包含安全防護專屬服務,例如 Cloud KMS 和 Secret Manager。
安全專案的預設名稱為 如果您部署這個藍圖的多個執行個體,但未部署企業基礎藍圖,每個執行個體都會有自己的安全防護專案。 |
將角色和群組對應至專案
您必須授予機構中不同使用者群組權限,讓他們存取構成無伺服器架構的專案。下表說明您建立專案時,使用者群組和角色指派的藍圖建議。您可以自訂群組,配合貴機構現有的結構,但建議您維持類似的職責劃分和角色指派方式。
群組 | 專案 | 角色 |
---|---|---|
無伺服器管理員 grp-gcp-serverless-admin@example.com |
服務專案 | |
無伺服器安全管理員 grp-gcp-serverless-security-admin@example.com |
安全專案 |
|
Cloud Run functions 開發人員 grp-gcp-secure-cloud-run-developer@example.com |
安全專案 | |
Cloud Run functions user 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 存取權」。
perimeter 控制項
如「架構」一節所示,您會將無伺服器應用程式的資源放在獨立的 VPC Service Controls 安全範圍中。這個邊界有助於減少系統或服務遭入侵所造成的廣泛影響。不過,當 Cloud Build 自動將程式碼建構為容器映像檔,並將該映像檔推送至 Artifact Registry 時,這個安全防護範圍不適用於 Cloud Run 函式建構程序。在此情境中,請在服務安全防護範圍內,為 Cloud Build 服務帳戶建立連入規則。
存取政策
為確保只有特定主體 (使用者或服務) 可以存取資源和資料,請啟用 IAM 群組和角色。
如要確保只有特定資源能夠存取您的專案,請為 Google 機構啟用存取權政策。詳情請參閱存取層級屬性。
服務帳戶和存取權控管
服務帳戶是應用程式或運算工作負載的帳戶,而非個別使用者的帳戶。如要實作最低權限原則和權責劃分原則,請建立具有細微權限的服務帳戶,並限制資源存取權。服務帳戶如下:
Cloud Run 函式服務帳戶 (
cloudfunction_sa
),具備下列角色:- Compute 網路檢視者 (
roles/compute.networkViewer
) - Eventarc 事件接收器 (
roles/eventarc.eventReceiver
) - Cloud Run Invoker (
roles/run.invoker
) - Secret Manager Secret Assessor (
roles/secretmanager.secretAccessor
)
詳情請參閱「允許 Cloud Run 函式存取密鑰」。
Cloud Run 函式會使用這個服務帳戶,僅授權存取特定 Pub/Sub 主題,並限制 Eventarc 事件系統存取 Cloud Run 函式運算資源,如使用 Cloud Storage 的無伺服器應用程式範例架構和BigQuery 資料倉儲範例架構。
- Compute 網路檢視者 (
具有「Compute 網路使用者」(
roles/compute.networkUser
)角色的無伺服器虛擬私有雲存取連接器帳戶 (gcp_sa_vpcaccess
)。第二個無伺服器虛擬私有雲存取連接器帳戶 (
cloud_services
),具有 Compute 網路使用者 (roles/compute.networkUser
) 角色。無伺服器虛擬私有雲存取連接器需要這些服務帳戶,才能在主專案中建立防火牆輸入和輸出規則。詳情請參閱「在服務專案中授予服務帳戶權限」。
用來執行 Cloud Run 函式的服務身分 (
cloudfunction_sa
),必須具備 [無伺服器 VPC 存取權使用者 (roles/vpcaccess.user)](/iam/docs/understanding-roles#vpcaccess.user)
) 和服務帳戶使用者 (roles/iam.serviceAccountUser
) 角色。Google API 服務帳戶 (
cloud_services_sa
),具備 Compute Network User (roles/compute.networkUser
) 角色,可代表您執行內部 Google 處理程序。Cloud Run 函式 (
cloud_serverless_sa
) 的服務身分,且具有 Artifact Registry 讀取者 (roles/artifactregistry.reader
) 角色。這個服務帳戶可存取 Artifact Registry 和 CMEK。Eventarc 的服務身分 (
eventarc_sa
),具有 Cloud KMS CryptoKey 解密者 (roles/cloudkms.cryptoKeyDecrypter) 和 Cloud KMS CryptoKey 加密者 (roles/cloudkms.cryptoKeyEncrypter
) 角色。Artifact Registry 的服務身分 (
artifact_sa
),具備 CryptoKey 解密者 (roles/cloudkms.cryptoKeyDecrypter
) 和 Cloud KMS CryptoKey 加密者 (roles/cloudkms.cryptoKeyEncrypter
) 角色。
金鑰管理
如要驗證完整性及保護靜態資料,請搭配使用 CMEK 與 Artifact Registry、Cloud Run 函式、Cloud Storage 和 Eventarc。CMEK 可讓您進一步控管加密金鑰。使用下列 CMEK:
- Artifact Registry 的軟體金鑰,可驗證無伺服器應用程式的程式碼。
- 用於加密 Cloud Run 函式部署的容器映像檔的「加密金鑰」。
- Eventarc 事件的加密金鑰,可加密待處理的訊息管道。
- 加密金鑰,可協助保護 Cloud Storage 中的資料。
套用 Terraform 設定時,請指定 CMEK 位置,這會決定金鑰的儲存地理位置。請務必確認 CMEK 與資源位於相同區域。根據預設,CMEK 每 30 天會輪替一次。
密鑰管理
Cloud Run functions 支援 Secret Manager,可儲存無伺服器應用程式可能需要的密鑰。這些密碼可能包括 API 金鑰,以及資料庫使用者名稱和密碼。如要將密鑰公開為已掛接的磁碟區,請在主要模組中使用 service_configs
物件變數。
使用企業基礎藍圖部署這個藍圖時,您必須先將密碼新增至密碼專案,再套用 Terraform 程式碼。藍圖會將 Secret Manager 密鑰評估者 (roles/secretmanager.secretAccessor
) 角色授予 Cloud Run 函式服務帳戶。詳情請參閱「使用密鑰」。
機構政策
這個藍圖會將限制新增至企業基礎藍圖使用的機構政策限制。如要進一步瞭解企業基礎藍圖使用的限制,請參閱機構政策限制。
下表說明本藍圖「Secure Cloud Run functions Security」(安全 Cloud Run 函式安全性) 模組中定義的其他機構政策限制。
政策限制 | 說明 | 建議值 |
---|---|---|
允許的輸入設定 (Cloud Run functions)
constraints/cloudfunctions.allowedIngressSettings |
只允許來自內部服務或外部 HTTP(S) 負載平衡器的連入流量。
預設為 |
ALLOW_INTERNAL_ONLY
|
必須指定虛擬私有雲連接器 (Cloud Run functions)
constraints/cloudfunctions.requireVPCConnector |
部署函式時,必須指定無伺服器虛擬私有雲存取連接器。如果強制執行這項限制,函式就必須指定無伺服器虛擬私有雲存取連接器。
預設為 |
true
|
允許的虛擬私有雲連接器輸出設定
(Cloud Run functions)
cloudfunctions.allowedVpcConnectorEgressSettings |
要求 Cloud Run 函式的所有輸出流量都使用無伺服器虛擬私有雲存取連接器。
預設值為 |
ALL_TRAFFIC
|
作業控管
您可以啟用記錄和Security Command Center Premium 級功能,例如安全狀態分析和威脅偵測。這些控制選項可協助您執行下列操作:
- 監控資料存取權。
- 確保已進行適當的稽核。
- 支援貴機構的資安作業和事件管理功能。
記錄
為協助您符合稽核規定並深入瞭解專案,請使用要追蹤的服務資料記錄,設定 Google Cloud Observability。請先在專案中部署 Cloud Logging,再套用 Terraform 程式碼,確保藍圖可以為防火牆、負載平衡器和虛擬私有雲網路設定記錄。
部署藍圖後,建議您設定下列項目:
- 在所有專案中建立匯總記錄接收器。
- 將 CMEK 新增至記錄接收器。
請確保專案中所有服務的記錄都包含資料寫入和管理存取權的相關資訊。如要進一步瞭解記錄最佳做法,請參閱「偵測控制項」。
監控與快訊
部署藍圖後,您可以設定快訊,在發生安全性事件時通知安全營運中心 (SOC)。舉例來說,您可以使用快訊,在 IAM 角色的權限變更時通知安全分析師。如要進一步瞭解如何設定 Security Command Center 快訊,請參閱「設定發現項目通知」。
Cloud Run Functions 監控資訊主頁可協助您監控 Cloud Run Functions 的效能和健康狀態。並提供多種指標和記錄,可用於找出及排解問題。資訊主頁也提供多項功能,例如設定快訊和配額,有助於提升函式效能。
詳情請參閱監控 Cloud Run 函式。
如要匯出快訊,請參閱下列文件:
偵錯和疑難排解
您可以執行連線能力測試,協助偵錯 Cloud Run 函式與子網路內資源之間的網路設定問題。連線能力測試會模擬封包的預期路徑,並提供連線詳細資料,包括資源對資源連線分析。
Terraform 程式碼不會啟用 Connectivity Tests,您必須另外設定。詳情請參閱「建立及執行連線測試」。
Terraform 部署模式
下表說明部署此藍圖的方法,以及各部署模式適用的 Terraform 模組。
部署模式 | Terraform 模組 |
---|---|
建議您先部署企業基礎藍圖,再部署這個藍圖。 這個選項會將藍圖的資源部署在企業基礎藍圖使用的相同 VPC Service Controls 服務範圍內。詳情請參閱「如何為安全 Cloud Run 函式部署作業自訂 Foundation v3.0.0」。 這個選項也會使用您部署企業基礎藍圖時建立的密鑰專案。 |
請使用下列 Terraform 模組: |
您可以安裝這個藍圖,不必安裝安全性基礎藍圖。 如要使用這個選項,必須建立 VPC Service Controls 範圍。 |
請使用下列 Terraform 模組:
|
整合所有內容
如要實作本文所述的架構,請按照下列步驟操作:
- 請參閱藍圖的 README,確保您符合所有必要條件。
- 在測試環境中,如要查看藍圖的實際運作情形,請部署其中一個範例。這些範例與「架構」一文所述的架構範例相符。在測試過程中,請考慮執行下列操作:
- 使用 Security Command Center 掃描專案,確認是否符合常見的法規遵循規定。
- 將範例應用程式換成實際應用程式 (例如 1),並執行典型的部署情境。
- 與企業中的應用程式工程和營運團隊合作,測試他們對專案的存取權,並驗證他們是否能以預期方式與解決方案互動。
- 將藍圖部署至環境。
後續步驟
- 請參閱Google Cloud 企業基礎藍圖,瞭解安全環境的基準。
- 如要查看藍圖詳細資料,請參閱 Terraform 設定 README。
- 如要使用 Cloud Run 部署無伺服器應用程式,請參閱「使用 Cloud Run 部署安全的無伺服器架構」。