設定 VPC Service Controls (第 1 代)

VPC Service Controls 是 Google Cloud 可讓您設定安全範圍,以防範資料外洩的功能。本指南說明如何搭配使用 VPC Service Controls 和 Cloud Run 函式,為函式增添額外安全性。

如要瞭解這項整合功能的限制,請參閱 VPC Service Controls 說明文件

機構層級設定

如要搭配 Cloud Run 函式使用 VPC Service Controls,您可以在機構層級設定服務範圍。只要設定適當的機構政策,即可確保在使用 Cloud Run 函式時強制執行 VPC Service Controls 檢查,並讓開發人員只能部署符合 VPC Service Controls 的服務。設定機構政策時,請進一步瞭解繼承違規

設定 VPC Service Controls 範圍

如要設定服務範圍,您必須具備「組織檢視者」(roles/resourcemanager.organizationViewer) 和「Access Context Manager 編輯者」(roles/accesscontextmanager.policyEditor) 角色。

請按照 VPC Service Controls 快速入門的步驟操作:

  1. 建立服務範圍。

  2. 將一或多個專案新增至範圍。

  3. 限制 Cloud Functions API。

設定服務範圍後,系統會檢查所有對受限制 API 的呼叫,確保這些呼叫來自相同範圍。

選用:為開發機器啟用邊界存取權

由於 Cloud Functions API 會強制執行 VPC Service Controls 檢查,因此除非 Cloud Functions API 呼叫來自服務範圍內,否則會失敗。因此,如要使用 Cloud Functions API、 Google Cloud 控制台中的 Cloud Run 函式 UI 或 Google Cloud CLI 管理函式,請選擇下列任一選項:

  • 使用位於 VPC Service Controls 範圍內的機器。舉例來說,您可以使用 Compute Engine VM 或內部部署機器,透過 VPN 連線至 VPC 網路。

  • 授予函式開發人員邊界存取權。舉例來說,您可以建立存取層級,根據 IP 位址或使用者身分啟用邊界存取權。詳情請參閱「允許服務範圍外的受保護資源存取要求」。

設定機構政策

如要管理機構政策,您必須具備機構政策管理員 (roles/orgpolicy.policyAdmin) 角色。

為遵守 VPC Service Controls 規定並防範資料外洩,請設定下列機構政策,控管服務範圍內 Cloud Run 函式的網路設定

限制允許的輸入設定

cloudfunctions.allowedIngressSettings 機構政策會控管開發人員可用於 Cloud Run 函式的入口設定。設定這項組織政策,要求開發人員使用 ALLOW_INTERNAL_ONLY 值:

主控台

  1. 前往Google Cloud 控制台的「Allowed ingress settings」政策頁面:

    前往機構政策

  2. 按一下「管理政策」

  3. 在「Edit policy」(編輯政策) 頁面中,選取「Customize」(自訂)

  4. 在「政策強制執行」下方,選取「取代」

  5. 在「Policy values」(政策值) 底下,選取 [Custom] (自訂)。

  6. 在「政策類型」下方,選取「允許」

  7. 在「自訂值」下方輸入 ALLOW_INTERNAL_ONLY

  8. 按一下「設定政策」

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 函式只能接受來自服務範圍內虛擬私有雲網路的流量。指定其他值的函式部署作業會失敗。

必須具備虛擬私有雲連接器

cloudfunctions.requireVPCConnector 機構組織政策會控管函式是否需要無伺服器虛擬私有雲存取連接器。設定這項機構政策,以便強制執行這項限制:

主控台

  1. 前往Google Cloud 控制台的「Require VPC Connector」政策頁面:

    前往機構政策

  2. 按一下「管理政策」

  3. 在「Edit policy」(編輯政策) 頁面中,選取「Customize」(自訂)

  4. 在「Enforcement」(強制執行) 下方,選取 [On] (開啟)。

  5. 按一下「設定政策」

gcloud

使用 gcloud resource-manager org-policies enable-enforce 指令:

gcloud resource-manager org-policies enable-enforce \
  cloudfunctions.requireVPCConnector \
  --organization ORGANIZATION_ID

其中,ORGANIZATION_ID 是您的機構 ID。

這項機構政策生效後,所有函式都必須使用無伺服器虛擬私有雲存取連接器。未指定連接器的函式部署作業會失敗。

限制允許的虛擬私有雲連接器輸出設定

cloudfunctions.allowedVpcConnectorEgressSettings 機構政策會控管開發人員可用於 Cloud Run 函式的傳出設定。將這項機構政策設為只允許 ALL_TRAFFIC 值:

主控台

  1. 前往Google Cloud 主控台的「允許的虛擬私有雲連接器輸出設定」政策頁面:

    前往機構政策

  2. 按一下「管理政策」

  3. 在「Edit policy」(編輯政策) 頁面中,選取「Customize」(自訂)

  4. 在「政策強制執行」下方,選取「取代」

  5. 在「Policy values」(政策值) 底下,選取 [Custom] (自訂)。

  6. 在「政策類型」下方,選取「允許」

  7. 在「自訂值」下方輸入 ALL_TRAFFIC

  8. 按一下「設定政策」

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。

設定虛擬私人雲端網路

如要存取 Google API 和服務,同時降低資料外洩風險,請將要求傳送至受限制的虛擬 IP (VIP) 範圍 199.36.153.4/30 (restricted.googleapis.com)。

針對專案中的每個虛擬私有雲網路,請按照下列步驟封鎖傳出流量,但傳送至受限制 VIP 範圍的流量除外:

  1. 設定防火牆規則,防止資料離開虛擬私有雲網路:

    • 建立拒絕輸出規則,封鎖所有傳出流量。

    • 建立輸出規則,允許 TCP 通訊埠 443 上的流量傳送至 199.36.153.4/30。請確認其優先順序在您剛建立的拒絕傳出規則的前面,這樣才能只允許傳出至受限制的 VIP 範圍。

  2. 設定 DNS 將 *.googleapis.com 解析為 restricted.googleapis.com

  3. 使用 A 記錄將 *.cloudfunctions.net 對應至 199.36.153.4/30 IP 範圍,設定 DNS。您可以透過 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
    
  4. 為 VPC 連接器的子網路啟用私人 Google 存取權

此時,來自虛擬私有雲網路內的要求:

  • 無法離開虛擬私有雲網路,因此無法輸出服務範圍外。
  • 只能存取檢查 VPC Service Controls 的 Google API 和服務,避免透過 Google API 竊取資料。

授予 Cloud Build 服務帳戶對 VPC Service Controls 範圍的存取權

Cloud Run 函式會使用 Cloud Build 將原始碼建構為可執行的容器。如要使用含有 VPC 服務控管的 Cloud Run 函式,您必須設定 Cloud Build 服務帳戶,讓該帳戶能夠存取服務範圍:

找出服務帳戶名稱

  1. 使用 Google Cloud 控制台的「IAM」頁面找出 Cloud Build 服務帳戶。

    開啟 IAM

  2. 確認專案下拉式選單中顯示的專案正確無誤。

  3. 搜尋 cloudbuild.gserviceaccount.comPROJECT_NUMBER@cloudbuild.gserviceaccount.com 表單中的電子郵件地址是服務帳戶名稱。

授予服務帳戶服務範圍的存取權

取得服務帳戶名稱後,請按照「按使用者或服務帳戶限制存取權」中的指南,為服務帳戶建立存取層級。接著,請按照「為現有範圍新增存取層級」中的步驟,為服務範圍新增存取層級。

部署符合 VPC Service Controls 的函式

為 Cloud Run 函式設定 VPC Service Controls 後,您必須確保在服務範圍內部署的所有函式都遵循指定的機構政策。也就是說:

  • 所有函式都必須使用無伺服器虛擬私有雲存取連接器。詳情請參閱「連線至虛擬私有雲網路」。
  • 所有函式都必須只允許來自內部來源的流量。詳情請參閱Ingress 設定
  • 所有函式都必須將所有傳出流量透過 VPC 網路轉送。詳情請參閱傳出設定

不符合這些條件的函式部署作業會失敗。

稽核現有函式,確保符合 VPC Service Controls 規定

設定 VPC Service Controls 後,系統會自動檢查服務範圍內專案中建立的新函式是否符合規定。不過,為避免中斷現有工作負載,現有的函式會繼續運作,且可能不遵守機構政策。

建議您稽核現有函式,並視需要更新或重新部署函式。為簡化這項程序,您可以建立指令碼,使用 Cloud Functions API 列出函式,並醒目顯示未指定正確網路設定的函式。

在範圍外使用 VPC Service Controls 的函式

上述各節適用於在 VPC Service Controls 服務範圍內部署 Cloud Run 函式的情況。

如果您需要在服務範圍外部署函式,但函式需要存取範圍內的資源,請使用下列設定:

  1. 授予 Cloud Build 服務帳戶對 VPC Service Controls 範圍的存取權
  2. 將週邊的存取權授予函式的執行階段服務帳戶。方法是建立存取層級,然後將存取層級新增至服務範圍,或是在範圍中建立 ingress 政策
  3. 將函式連線至虛擬私有雲網路
  4. 將函式傳出的所有流量,透過虛擬私有雲網路轉送。詳情請參閱傳出設定

完成這項設定後,函式就能存取受邊界保護的資源。