使用 VPC Service Controls

VPC Service Controls 是一項 Google Cloud 功能,可讓您設定安全 perimeter,防範資料遭竊。本頁說明如何搭配 Cloud Build 私人集區使用 VPC Service Controls,為建構作業增添額外安全性。

事前準備

  • 如要使用本指南提供的指令列範例,請安裝及設定 Google Cloud CLI

  • 在虛擬私有雲網路與私人集區所在的虛擬私有雲網路之間,設定私人連線。如需操作說明,請參閱設定環境來建立私人集區

  • 在服務範圍內執行的建構作業,無法將建構記錄檔儲存在預設的 Cloud Storage 記錄檔 bucket。執行建構作業前,請使用下列其中一個選項設定建構設定檔:

  • 如果建構作業會將映像檔和構件推送至其他 Google Cloud 專案的 Artifact Registry 或 Cloud Storage,請將該專案新增至與建構作業來源專案相同的服務範圍。

  • 選用:熟悉機型設定和區域可用性。詳情請參閱私人集區設定檔結構定義說明文件中的workerconfig

為確保 具備設定服務安全防護所需的權限,請要求管理員在您的服務帳戶中,授予 下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

管理員或許也能透過自訂角色或其他預先定義的角色,授予必要權限。

在 VPC Service Controls 範圍內設定私人集區

如要搭配 Cloud Build 使用 VPC Service Controls,您必須先建立及設定服務範圍,這項作業是在組織層級完成。這項設定可確保使用 Cloud Build 時強制執行 VPC Service Controls 檢查,且開發人員只能執行符合 VPC Service Controls 的建構作業。

建立 VPC Service Controls perimeter

按照 VPC Service Controls 快速入門導覽課程操作,完成下列步驟:

  1. 建立 service perimeter。
  2. 將您打算建立私人集區的專案新增至範圍。

  3. 限制 Cloud Build API。

設定服務安全防護範圍後,系統會檢查所有對 Cloud Build API 的呼叫,確保呼叫來自同一個安全防護範圍內。

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

在下列情況下,您必須授予舊版 Cloud Build 或 Compute Engine 服務帳戶 VPC Service Controls perimeter 的存取權,建構作業才能存取 perimeter 內的資源:

  • 如果您使用舊版 Cloud Build 或 Compute Engine 服務帳戶,透過建構觸發條件Cloud Build API 或指令列啟動建構作業。

  • 如果您使用使用者指定的服務帳戶,透過建構觸發程序啟動建構作業。

如果您使用使用者指定的服務帳戶,透過 Cloud Build API 或指令列啟動建構作業,則不需要授予舊版 Cloud Build 或 Compute Engine 服務帳戶 VPC Service Controls perimeter 的存取權。

請按照下列步驟,授予舊版 Cloud Build 或 Compute Engine 服務帳戶 VPC Service Controls perimeter 的存取權:

  1. 記下舊版服務帳戶的電子郵件地址:

    1. 開啟「IAM」頁面:

      開啟 IAM 頁面

    2. 選取您新增至服務範圍的專案。

    3. 在權限表格中,找出與舊版 Cloud Build 服務帳戶對應的電子郵件地址。

  2. 更新服務範圍的輸入政策,允許服務帳戶呼叫 Cloud Build API。這項輸入規則可讓服務帳戶發出 CreateBuild API 呼叫。如要進一步瞭解如何設定 VPC Service Controls 輸入政策,請參閱「設定輸入和輸出政策」和「輸入和輸出規則」。

    - ingressFrom:
        identities:
        - serviceAccount:SERVICE_ACCOUNT_EMAIL
        sources:
        - accessLevel: '*'
      ingressTo:
        operations:
        - serviceName: 'cloudbuild.googleapis.com'
          methodSelectors:
          - method: '*'
        resources:
        - 'projects/PROJECT_NUMBER'
    
  3. 執行下列指令,並將變數替換成適當的值,即可更新 perimeter 政策:

    gcloud beta access-context-manager perimeters update PERIMETER_NAME \
        --set-ingress-policies=INGRESS-FILENAME \
        --policy=POLICY_ID
    

其中:

  • SERVICE_ACCOUNT_EMAIL:服務帳戶的電子郵件地址。
  • PROJECT_NUMBER:您新增至 VPC Service Controls 服務範圍的Google Cloud 專案專案編號。
  • PERIMETER_NAME:VPC Service Controls 範圍的名稱。
  • INGRESS-FILENAME:輸入政策檔案的名稱。
  • POLICY_ID:存取權政策的 ID。

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

由於系統會對 Cloud Build API 強制執行 VPC Service Controls 檢查,因此除非呼叫來自 service perimeter 內,否則會失敗。因此,如要透過 Cloud Build API、 Google Cloud 控制台中的 Cloud Build 使用者介面或 Google Cloud CLI 管理建構作業,請選擇下列其中一個選項:

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

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

設定機構政策限制

如要確保系統正確強制執行 VPC Service Controls 檢查,並限制 Google Cloud 組織中的建構作業只能使用指定的私人集區,請設定constraints/cloudbuild.allowedWorkerPools組織政策限制。您可以將機構政策套用至整個機構,或機構中的專案或資料夾。舉例來說,機構政策可以指定:

  • 機構中的所有建構作業都會使用指定的私人集區。
  • 資料夾中的所有建構作業都會使用指定的私人集區。
  • 專案中的所有建構作業都會使用指定的私人集區。

IAM 權限:如要管理組織政策,您需要組織政策管理員 (roles/orgpolicy.policyAdmin) 角色。如需授予角色的操作說明,請參閱設定 Cloud Build 資源的存取權

gcloud resource-manager org-policies allow 指令 會設定機構政策,要求機構中的建構作業只能使用指定的私人集區:

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools \
     projects/PRIVATEPOOL_PROJECT_ID/locations/LOCATION/workerPools/PRIVATEPOOL_ID \
     --organization ORGANIZATION_ID

其中:

  • PRIVATEPOOL_ID:執行建構作業的私人集區 ID。

  • PRIVATEPOOL_PROJECT_ID:包含私人集區的 Google Cloud 專案 ID。

  • LOCATION:包含私人集區的區域。

  • ORGANIZATION_ID:您執行建構作業的機構 ID。

這項指令支援 under:is 前置字串。

如要設定機構政策,規定機構中的所有建構作業都必須使用該機構下的任何私人集區,請執行下列步驟:

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools under:organizations/ORGANIZATION_ID \
     --organization ORGANIZATION_ID

其中 ORGANIZATION_ID 是包含私人集區的機構 ID。

如要設定機構政策,規定資料夾下專案中的所有建構都必須使用指定專案中的任何私有集區,請按照下列步驟操作:

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools under:projects/PROJECT_ID \
     --folder FOLDER_ID

其中 PROJECT_ID 是含有私人集區的專案 ID,FOLDER_ID 則是您執行建構作業的專案。

如要設定機構政策,規定專案中的所有建構作業都必須使用指定專案中的任何私人集區,請按照下列步驟操作:

 gcloud resource-manager org-policies allow \
     cloudbuild.allowedWorkerPools under:projects/PRIVATEPOOL_PROJECT_ID \
     --project BUILD_PROJECT_ID

其中 PRIVATEPOOL_PROJECT_ID 是含有私人集區的專案 ID,BUILD_PROJECT_ID 則是您執行建構作業的專案 ID。

強制執行 constraints/cloudbuild.allowedWorkerPools 機構政策限制時,請注意下列事項:

  • 如果將這項組織政策限制套用至 Google Cloud 專案,請確保專案中的所有建構作業都使用私人集區;嘗試使用預設共用集區的建構作業會失敗。

  • 如果貴機構包含 App Engine 或 Cloud Run 函式等隱含使用 Cloud Build 的服務,強制執行這項機構政策限制可能會導致這些服務無法正常運作。 Google Cloud

在服務範圍中建立私人集區

Google Cloud 控制台

  1. 在 Google Cloud 控制台中開啟「Worker Pool」(工作站集區) 頁面:

    開啟 Cloud Build 工作站集區頁面

  2. 按一下「建立私人集區」

    系統隨即會顯示「Create private pool」(建立私人集區) 頁面。

    輸入下列資訊來建立私人集區:

  3. 名稱:輸入私人集區的名稱。這個值只能包含英數字元 /[a-z][0-9]/ 或破折號 -。私人集區名稱長度必須介於 1 至 63 個字元之間。

  4. 地區:選取要建立私人集區的地區。

  5. 「機器設定」:設定下列項目:

    1. 系列:選擇機器系列。

    2. 機器類型:這項設定會根據您選取的機器系列,顯示工作站集區可使用的機器類型。可用的機器類型因地區而異。

    3. 磁碟大小:輸入私人集區的磁碟大小。 請指定大於或等於 100 且小於或等於 4000 的值。如未提供值,Cloud Build 會使用 100 的磁碟大小。

    4. 巢狀虛擬化:如果您選取 C3 系列機器,可以啟用巢狀虛擬化。 有了這項功能,您就能在其他虛擬機器 (VM) 中執行 VM 執行個體,自行建立虛擬化環境。

  6. 在「網路類型」下方,選取「私人網路」,然後選取下列項目:

    1. 「Project」(專案):選取 Google Cloud 專案 ID。

    2. 網路:從下拉式選單中選取網路。如果尚未建立網路,請參閱「建立及管理虛擬私有雲網路」,瞭解如何建立網路。

    3. IP 範圍:輸入 Cloud Build 生產者網路可使用的內部 IP 範圍,以便分配給與私人存放區維持連線的 VM。

      您可以使用無類別跨網域路由 (CIDR) 路由標記法指定範圍,格式為 STARTING_IP_ADDRESS/SUBNET_PREFIX_SIZE。舉例來說,192.0.2.0/24 的前置碼長度為 24。IP 範圍的前 24 個位元會做為子網路遮罩 (192.0.2.0),而可能的主機位址範圍則從 192.0.2.0192.0.2.255

      前置字串長度值不得超過 /29。如未指定範圍值,系統會自動指派預設值 /24。如果未指定前置字元長度,系統會自動在對等互連的虛擬私有雲網路中指派 IP 位址。如果未指定 IP 位址的值,系統會自動在對等互連的 VPC 網路中指派 IP 位址範圍。

    4. 清除「指派外部 IP」,限制對私人網路的存取權。

  7. 按一下「建立」即可建立私人集區。

gcloud

  1. 以 YAML 或 JSON 格式建立私人集區設定檔,並將 egressOption 旗標設為 NO_PUBLIC_EGRESS

    privatePoolV1Config:
      networkConfig:
        egressOption: NO_PUBLIC_EGRESS
        peeredNetwork: PEERED_NETWORK
      workerConfig:
        diskSizeGb: 'PRIVATE_POOL_DISK_SIZE'
        machineType: PRIVATE_POOL_MACHINE_TYPE
    

    其中:

    • PEERED_NETWORK 是與服務供應商網路對等互連的網路資源網址。PEERED_NETWORK 必須採用 projects/NETWORK_PROJECT_ID/global/networks/NETWORK_NAME 格式,其中 NETWORK_PROJECT_ID 是保存虛擬私有雲網路的 Google Cloud 專案 ID,NETWORK_NAME 則是虛擬私有雲網路的名稱。
    • PRIVATE_POOL_MACHINE_TYPE 是私人集區執行個體的 Compute Engine 機器類型。如要瞭解支援的機器類型,請參閱私人集區設定檔結構定義
    • PRIVATE_POOL_DISK_SIZE 是私有集區執行個體的磁碟大小,單位為 GB。請指定大於或等於 100 且小於或等於 1000 的值。如果您指定 0,Cloud Build 會使用預設值 100。
    • egressOption 是為私人集區啟用 VPC Service Controls 範圍的旗標。將此值設為 NO_PUBLIC_EGRESS,在 VPC Service Controls 範圍內建立私人集區。
  2. 執行下列 gcloud 指令,其中 PRIVATEPOOL_ID 是私人集區的不重複 ID,PRIVATEPOOL_CONFIG_FILE 是私人集區設定檔的名稱,REGION 則是您要建立私人集區的區域

    gcloud builds worker-pools create PRIVATEPOOL_ID --config-from-file PRIVATEPOOL_CONFIG_FILE --region REGION
    

選用:在 VPC 網路上啟用公開網際網路呼叫

如要讓虛擬私有雲網路允許網路連線至存放區的代管位置 (例如 github.com),請設定下列兩項設定:

限制

  • VPC Service Controls 保護機制僅適用於在私人集區中執行的建構作業,無法用於在預設集區中執行的建構作業。

  • 使用 VPC Service Controls 時,系統不支援 Cloud Build Pub/Sub 觸發條件。

後續步驟