設定 VPC Service Controls (第 1 代)
VPC Service Controls 是一項 Google Cloud 功能,可用來設定安全 perimeter 以防範資料遭竊。本指南說明如何搭配 Cloud Run functions 使用 VPC Service Controls,以加強保障函式安全。
有關這項整合的限制條件,請參閱 VPC Service Controls 說明文件。
組織層級設定
如要搭配 Cloud Run functions 使用 VPC Service Controls,請設定組織層級的 service perimeter。設定適當的組織政策,可確保系統在使用 Cloud Run functions 時強制執行 VPC Service Controls 檢查,且開發人員只能部署符合 VPC Service Controls 規範的服務。進一步瞭解設定組織政策的沿用及違規相關資訊。
設定 VPC Service Controls perimeter
如要設定 service perimeter,您必須有組織檢視者 (roles/resourcemanager.organizationViewer) 和 Access Context Manager 編輯者 (roles/accesscontextmanager.policyEditor) 角色。
按照 VPC Service Controls 快速入門導覽課程完成下列步驟:
建立 service perimeter。
將一或多個專案新增至 perimeter。
限制 Cloud Functions API。
設定 service perimeter 後,系統會檢查所有對受限制 API 的呼叫,確保這些呼叫來自同一個 perimeter。
選擇性步驟:為開發機器啟用 perimeter 存取權限
由於系統會對 Cloud Functions API 強制執行 VPC Service Controls 檢查,因此除非呼叫來自 service perimeter 內,否則對 Cloud Functions API 的呼叫會失敗。因此,如要使用 Cloud Functions API、 Google Cloud 控制台的 Cloud Run functions 使用者介面或 Google Cloud CLI 來管理函式,請選擇下列選項之一:
使用 VPC Service Controls perimeter 內的機器。例如使用 Compute Engine VM,或任何透過 VPN 連線到虛擬私有雲網路的地端部署機器。
為函式開發人員授予 perimeter 存取權限。例如建立存取層級,根據 IP 位址或使用者身分啟用 perimeter 存取權限。詳情請參閱「允許存取 service perimeter 外的受保護資源」。
設定組織政策
如要管理組織政策,您必須有組織政策管理員 (roles/orgpolicy.policyAdmin) 角色。
為遵守 VPC Service Controls 並防範資料遭竊,請設定下列組織政策,據以控管 service perimeter 內 Cloud Run functions 經允許的網路設定。
限制允許的輸入設定
cloudfunctions.allowedIngressSettings 組織政策控管開發人員可用於 Cloud Run functions 的輸入設定。請設定這項組織政策以強制開發人員使用 ALLOW_INTERNAL_ONLY 值:
控制台
前往Google Cloud 控制台的「Allowed ingress settings」(經允許的輸入設定) 政策頁面:
按一下「Manage Policy」(管理政策)。
在「Edit」(編輯) 頁面選取 [Customize] (自訂)。
在「Policy enforcement」(政策強制執行) 下方,選取「Replace」(取代)。
在「Policy values」(政策值) 底下,選取「Custom」(自訂)。
在「Perimeter type」(Perimeter 類型),選取「Allow」(允許)。
在「Custom values」(自訂值)下方輸入
ALLOW_INTERNAL_ONLY。按一下「Set Policy」(設定政策)。
gcloud
使用 gcloud resource-manager org-policies allow 指令:
gcloud resource-manager org-policies allow \ cloudfunctions.allowedIngressSettings ALLOW_INTERNAL_ONLY \ --organization ORGANIZATION_ID
其中的 ORGANIZATION_ID 是您的組織 ID。
這項組織政策生效後,所有函式的輸入設定都必須使用 ALLOW_INTERNAL_ONLY 值,這表示 HTTP 函式只能接收來自 service perimeter 內虛擬私有雲網路的流量。如果指定不同的值,函式部署作業就會失敗。
需要 VPC 連接器
cloudfunctions.requireVPCConnector 組織政策控管函式是否需要無伺服器 VPC 存取連接器。請設定這項組織政策以強制執行此限制:
控制台
前往「Require VPC Connector」(需要 VPC 連接器) 政策頁面:Google Cloud
按一下「Manage Policy」(管理政策)。
在「Edit」(編輯) 頁面選取 [Customize] (自訂)。
在「Enforcement」(強制執行) 下方,選取「On」 (開啟)。
按一下「Set Policy」(設定政策)。
gcloud
使用 gcloud resource-manager org-policies enable-enforce 指令:
gcloud resource-manager org-policies enable-enforce \ cloudfunctions.requireVPCConnector \ --organization ORGANIZATION_ID
其中的 ORGANIZATION_ID 是您的組織 ID。
這項組織政策生效後,所有函式都必須使用無伺服器 VPC 存取連接器。如果未指定連接器,函式部署作業就會失敗。
限制經允許的 VPC 連接器輸出設定
cloudfunctions.allowedVpcConnectorEgressSettings 組織政策控管開發人員可用於 Cloud Run functions 的輸出設定。請將此組織政策設定為僅允許 ALL_TRAFFIC 值:
控制台
前往Google Cloud 控制台的「Allowed VPC Connector egress settings」(經允許的 VPC 連接器輸出設定) 政策頁面:
按一下「Manage Policy」(管理政策)。
在「Edit」(編輯) 頁面選取 [Customize] (自訂)。
在「Policy enforcement」(政策強制執行) 下方,選取「Replace」(取代)。
在「Policy values」(政策值) 底下,選取「Custom」(自訂)。
在「Perimeter type」(Perimeter 類型),選取「Allow」(允許)。
在「Custom values」(自訂值)下方輸入
ALL_TRAFFIC。按一下「Set Policy」(設定政策)。
gcloud
使用 gcloud resource-manager org-policies allow 指令:
gcloud resource-manager org-policies allow \ cloudfunctions.allowedVpcConnectorEgressSettings ALL_TRAFFIC \ --organization ORGANIZATION_ID
其中的 ORGANIZATION_ID 是您的組織 ID。
這項組織政策生效後,所有函式的輸出設定都必須使用 ALL_TRAFFIC 值,這表示函式必須透過虛擬私有雲網路轉送所有輸出流量。如果指定不同的值,函式部署作業就會失敗。
若再搭配cloudfunctions.requireVPCConnector組織政策使用,則可強制所有輸出流量透過虛擬私有雲網路傳輸,並受制於該網路所設定的防火牆和轉送規則。
專案層級設定
使用 VPC Service Controls 前,必須針對 service perimeter 內的個別專案另作設定。
設定虛擬私人雲端網路
為降低存取 Google API 和服務時的資料竊取風險,請將要求傳送至受限制虛擬 IP (VIP) 範圍 199.36.153.4/30 (restricted.googleapis.com)。
對於專案中的每個虛擬私有雲網路,請依下列步驟封鎖輸出流量 (傳送至受限制 VIP 範圍的流量除外):
設定防火牆規則,防止資料離開虛擬私有雲網路:
建立拒絕輸出規則,封鎖所有傳出流量。
建立允許輸出規則,准許流量前往
199.36.153.4/30的 TCP 通訊埠 443。其優先順序必須在您剛建立的拒絕輸出規則之前,確保輸出流量只流向受限制的 VIP 範圍。
使用 A 記錄將
*.cloudfunctions.net對應至199.36.153.4/30IP 範圍,建議的方法是使用 Cloud DNS:gcloud dns managed-zones create ZONE_NAME \ --visibility=private \ --networks=https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/VPC_NAME \ --description=none \ --dns-name=cloudfunctions.net gcloud dns record-sets transaction start --zone=ZONE_NAME gcloud dns record-sets transaction add --name=*.cloudfunctions.net. \ --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \ --zone=ZONE_NAME \ --ttl=300 gcloud dns record-sets transaction execute --zone=ZONE_NAME
為 VPC 連接器的子網路啟用 Private Google Access。
此時,來自虛擬私有雲網路的要求將受到下列限制:
- 無法離開虛擬私有雲網路,以防止輸出至 service perimeter 外部。
- 只能連線至會檢查 VPC Service Controls 的 Google API 和服務,防止資料經由 Google API 遭竊。
授予 Cloud Build 服務帳戶存取 VPC Service Controls perimeter 的權限
Cloud Run functions 會使用 Cloud Build 將原始碼建構為可執行的容器。如要搭配使用 Cloud Run functions 與 VPC Service Controls,請務必設定 Cloud Build 服務帳戶,讓該帳戶有權存取 service perimeter:
找出服務帳戶名稱
請使用 Google Cloud 控制台的「IAM」頁面找出 Cloud Build 服務帳戶。
確認專案下拉式選單中顯示的專案正確無誤。
搜尋
cloudbuild.gserviceaccount.com。表單PROJECT_NUMBER@cloudbuild.gserviceaccount.com顯示的電子郵件地址即為服務帳戶名稱。
授予服務帳戶存取 service perimeter 的權限
取得服務帳戶名稱後,請按照這篇文章的指示,為服務帳戶建立存取層級。然後按照「為現有 perimeter 新增存取層級」一節的說明,在 service perimeter 中新增存取層級。
部署符合 VPC Service Controls 規範的函式
為 Cloud Run functions 設定 VPC Service Controls 後,請務必確保service perimeter 內部署的所有函式都符合指定的組織政策。這表示:
- 所有函式都必須使用無伺服器 VPC 存取連接器。詳情請參閱「連線至虛擬私有雲網路」。
- 所有函式都只能允許內部來源傳出的流量。詳情請參閱「輸入設定」。
- 所有函式都必須透過虛擬私有雲網路轉送所有輸出流量。詳情請參閱「輸出設定」。
如果不符合這些條件,函式部署作業就會失敗。
稽核現有函式以確保符合 VPC Service Controls 規範
設定 VPC Service Controls 後,系統會自動檢查 service perimeter 內專案中建立的新函式是否符合規範。不過,為避免現有工作負載中斷,既有函式仍會繼續運作,但不一定符合組織政策。
建議您稽核現有函式,並視需要加以更新或重新部署。為簡化程序,您可以建立指令碼,使用 Cloud Functions API 列出函式,並醒目顯示其中未指定適當網路設定的項目。
VPC Service Controls 與 perimeter 外部函式搭配使用
上述各節適用於 VPC Service Controls service perimeter 內部署 Cloud Run functions 的情境。
如要在 service perimeter 外部署函式,但該函式需要存取 perimeter 內的資源,請使用下列設定:
- 授予 Cloud Build 服務帳戶存取 VPC Service Controls perimeter 的權限。
- 授予函式執行階段服務帳戶存取 perimeter 的權限,建議的方式是建立存取層級,然後將存取層級新增至 service perimeter,或是針對該 perimeter 建立輸入政策。
- 將函式連線至虛擬私有雲網路。
- 透過虛擬私有雲網路,轉送函式的所有輸出流量。詳情請參閱「輸出設定」。
完成這項設定後,函式就能連線到 perimeter 所保護的資源。