使用 VPC Service Controls (VPC SC)

VPC Service Controls 是一項 Google Cloud 功能,可用來設定安全 perimeter 以防範資料竊取。預設 run.app URL 和自訂網域都受 VPC Service Controls 限制。本指南說明如何搭配 Cloud Run 使用 VPC Service Controls,以加強保障服務安全。

限制和注意事項

  • 如果是 Artifact Registry 或 Container Registry:

    • 儲存容器的登錄檔必須與您要部署的專案位於相同的 VPC Service Controls 服務範圍。
    • 建構中的程式碼必須與要推送容器的登錄檔位於相同 perimeter。
  • 如果專案位於 VPC Service Controls 範圍內,就無法使用持續部署功能。

  • 叫用 Cloud Run 服務時,VPC Service Controls 政策強制執行作業不會使用用戶端的 IAM 驗證資訊。這類要求有以下限制:

    • VPC Service Controls 不支援使用 IAM 主體的輸入政策規則。僅支援 ANY_IDENTITY 身分類型。
    • 不支援使用 IAM 主體的 VPC Service Controls 範圍存取層級。

設定機構以支援 VPC Service Controls

如要搭配 Cloud Run 使用 VPC Service Controls,請設定組織層級的服務範圍。設定適當的組織政策,可確保系統在使用 Cloud Run 時強制執行 VPC Service Controls 檢查,且開發人員只能部署符合 VPC Service Controls 規範的服務。進一步瞭解設定組織政策的沿用違規相關資訊。

如果您使用 gcloud functions 部署 Cloud Run 函式,您或系統管理員必須授予 Cloud Build 服務帳戶 VPC Service Controls perimeter 的存取權。詳情請參閱建構程序總覽

設定 VPC Service Controls perimeter

下列步驟說明如何設定 VPC Service Controls perimeter

  1. 確認您具備管理 VPC Service Controls 的必要角色

  2. 前往 Google Cloud 控制台的「VPC Service Controls」頁面。

    前往「VPC Service Controls」頁面

  3. 如果系統提示您選取「機構」,請依提示選取。

  4. 按一下「管理存取政策」。選取存取權政策或建立存取權政策。存取權政策必須包含您要新增至 perimeter 的所有專案。

  5. 按一下「New Perimeter」(新增範圍)。輸入範圍名稱。

  6. 選取要在 perimeter 內保護的專案。

    1. 按一下「專案」

    2. 在「Add Projects」(新增專案) 視窗中,選取要新增的專案。

      如果您使用Shared VPC,請務必新增主專案和服務專案。

    3. 按一下 [Add Projects] (新增專案) 按鈕。

  7. 選取要保護的 Cloud Run 服務。

    1. 按一下「受限制的服務」

    2. 按一下「新增服務」。

    3. 搜尋「Cloud Run」。然後選取「Cloud Run Admin API」。(如果您使用 gcloud functions,請選取「Cloud Functions V2 API」)。

    4. 點按「新增 Cloud Run Admin API」 (或「Cloud Functions V2 API」,如果您使用 gcloud functions)。

  8. 啟用開發人員存取權。

    為 Cloud Run 啟用 VPC Service Controls 後,系統會禁止從 perimeter 外部進行所有存取作業,包括從不在 perimeter 內的機器 (例如公司筆電) 查看及部署服務。如要讓開發人員和應用程式運算子查看及部署 perimeter 內的資源,請設定 perimeter 輸入政策

    1. 按一下「輸入政策」

    2. 指定「來源」、「身分」、「專案」和「服務」

    3. 按一下 [新增規則]。

    如果貴機構使用 Access Context Manager,您也可以設定存取層級,為開發人員啟用存取權。

  9. 按一下「建立範圍」

完成這些步驟後,系統會檢查所有對 Cloud Run Admin API 的呼叫,確保這些呼叫來自同一個 perimeter。

設定組織政策

如要管理組織政策,您必須有組織政策管理員 (roles/orgpolicy.policyAdmin) 角色。

為遵守 VPC Service Controls 並防範資料竊取,請設定下列組織政策,據以控管 service perimeter 內 Cloud Run 經允許的連入連出設定。

限制允許的輸入設定

run.allowedIngress 組織政策控管開發人員可用於 Cloud Run 的輸入設定。如要只允許內部要求,請設定這項組織政策,強制開發人員使用 internal 值;如要允許透過外部應用程式負載平衡器提出要求,並由 Cloud Load Balancing 管理存取控管,請使用 internal-and-cloud-load-balancing 值。

如要進一步瞭解這些設定,請參閱「限制 Cloud Run 的輸入流量

控制台

  1. 前往Google Cloud 控制台的「Allowed ingress settings (Cloud Run)」(允許的輸入設定 (Cloud Run)) 政策頁面:

    前往組織政策

  2. 按一下 [編輯]

  3. 在「Edit」(編輯) 頁面選取 [Customize] (自訂)

  4. 在「Policy enforcement」(政策強制執行) 下方,選取「Replace」(取代)

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

  6. 在「Perimeter type」(Perimeter 類型),選取「Allow」(允許)

  7. 在「Custom values」(自訂值)下方輸入 internal。如要允許 Cloud Load Balancing 流量,請按一下「New policy value」(新增政策值),然後輸入 internal-and-cloud-load-balancing

  8. 按一下 [儲存]

gcloud

使用 gcloud resource-manager org-policies allow 指令:

gcloud resource-manager org-policies allow \
  run.allowedIngress internal \
  --organization ORGANIZATION_ID

其中的 ORGANIZATION_ID 是您的機構 ID。如要同時允許 Cloud Load Balancing 流量,請將 run.allowedIngress internal 替換為 run.allowedIngress internal-and-cloud-load-balancing

這項組織政策生效後,所有服務的輸入設定都必須使用允許值,這表示 Cloud Run 服務只能接收來自 service perimeter 內虛擬私有雲網路的流量。嘗試將輸入設定為其他值時,機構政策會封鎖這類要求。

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

run.allowedVPCEgress 組織政策控管開發人員可用於 Cloud Run 的輸出設定。請將此組織政策設定為僅允許 all-traffic 值:

控制台

  1. 前往Google Cloud 控制台的「Allowed VPC egress settings (Cloud Run)」(允許的虛擬私有雲輸出設定 (Cloud Run)) 政策頁面:

    前往組織政策

  2. 按一下 [編輯]

  3. 在「Edit」(編輯) 頁面選取 [Customize] (自訂)

  4. 在「Policy enforcement」(政策強制執行) 下方,選取「Replace」(取代)

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

  6. 在「Perimeter type」(Perimeter 類型),選取「Allow」(允許)

  7. 在「Custom values」(自訂值)下方輸入 all-traffic

  8. 按一下 [儲存]

gcloud

使用 gcloud resource-manager org-policies allow 指令:

gcloud resource-manager org-policies allow \
  run.allowedVPCEgress all-traffic \
  --organization ORGANIZATION_ID

其中的 ORGANIZATION_ID 是您的組織 ID。

設定機構政策後的行為

這項組織政策生效後,所有新修訂版本都必須使用直接虛擬私有雲輸出或無伺服器 VPC 存取連接器,且輸出設定必須使用 all-traffic 值。這樣一來,這些修訂版本的所有輸出流量都會透過虛擬私有雲網路轉送,並受制於虛擬私有雲網路的防火牆規則和其他設定。如果新修訂版本部署作業指定不同的值,機構政策就會封鎖該作業。

機構政策和流量遷移

如果服務是在設定組織政策前建立,只要提供流量的所有修訂版本都符合規定,您就能繼續將流量遷移至不符規定的修訂版本。

您可以藉此測試並逐步推出符合政策的新修訂版本。所有提供流量的修訂版本都符合政策規定後,任何將流量移至不符規定的修訂版本的嘗試,都會遭到機構政策封鎖。

設定專案以支援 VPC Service Controls

使用 VPC Service Controls 前,必須針對 service perimeter 內的個別專案另作設定。

設定虛擬私人雲端網路

本節說明如何設定虛擬私有雲網路,讓傳送至一般 googleapis.com 網域的要求,自動路由至受限制的虛擬 IP (VIP) 範圍 199.36.153.4/30 (restricted.googleapis.com),也就是 Cloud Run 服務的服務位置。不需要變更任何程式碼。

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

  1. 在代管虛擬私有雲網路資源的子網路上啟用Private Google Access

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

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

    • 建立允許輸出規則,准許流量前往 199.36.153.4/30 的 TCP 通訊埠 443。其優先順序必須在您剛建立的拒絕輸出規則之前,確保輸出流量只流向受限制的 VIP 範圍。

  3. 建立 Cloud DNS 回應政策

    gcloud dns response-policies create RESPONSE_POLICY \
    --networks=NETWORK \
    --description=DESCRIPTION
    

    更改下列內容:

    • RESPONSE_POLICY:回應政策的名稱。
    • NETWORK:要與這項政策建立關聯的網路名稱。如要指定多個網路,請以半形逗號分隔每個網路的名稱,例如:network1,network2
    • DESCRIPTION:回應政策的說明,例如 Cloud Run VPC Service Controls response policy
  4. 在回應政策中新增規則,將 *.googleapis.com 解析為 restricted.googleapis.comrestricted.googleapis.com 的 IP 位址範圍為 199.36.153.4/30

    gcloud dns response-policies rules create RESPONSE_POLICY_RULE \
    --response-policy=RESPONSE_POLICY \
    --dns-name="*.googleapis.com." \
    --local-data=name="restricted.googleapis.com.",type="A",ttl=300,rrdatas="199.36.153.4|199.36.153.5|199.36.153.6|199.36.153.7"
    

    更改下列內容:

    • RESPONSE_POLICY_RULE:回應政策規則的名稱。
    • RESPONSE_POLICY:您在上一個步驟中建立的回應政策名稱,請加上引號。
  5. 在回應政策中新增規則,將 *.run.app (或 gcloud functions deploy 建立函式時的 *.cloudfunctions.net) 解析為 restricted.googleapis.comrestricted.googleapis.com 的 IP 位址範圍為 199.36.153.4/30

    gcloud dns response-policies rules create RESPONSE_POLICY_RULE \
    --response-policy=RESPONSE_POLICY \
    --dns-name="*.run.app." \
    --local-data=name="restricted.googleapis.com.",type="A",ttl=300,rrdatas="199.36.153.4|199.36.153.5|199.36.153.6|199.36.153.7"
    

    更改下列內容:

    • RESPONSE_POLICY_RULE:回應政策規則的名稱。
    • RESPONSE_POLICY:您在上一個步驟中指定的回應政策名稱,請加上引號。

此時,來自虛擬私有雲網路的要求將受到下列限制:

  • 無法離開虛擬私有雲網路,以防止輸出至 service perimeter 外部。
  • 只能連線至會檢查 VPC Service Controls 的 Google API 和服務,防止資料經由 Google API 遭竊。

部署符合 VPC Service Controls 規範的 Cloud Run 服務和作業

為 Cloud Run 設定 VPC Service Controls 後,請務必確保 service perimeter 內部署的所有 Cloud Run 服務和作業都啟用 VPC Service Controls。請按照下列步驟操作:

  • Cloud Run 服務和作業必須使用直接虛擬私有雲輸出流量或無伺服器 VPC 存取連接器。詳情請參閱「連線至虛擬私有雲網路」。
  • Cloud Run 服務和作業必須透過虛擬私有雲網路轉送所有輸出流量。 詳情請參閱「輸出設定」。
  • Cloud Run 服務只能允許內部來源傳出的流量。詳情請參閱「輸入設定」。將輸入設定為「全部」會停用 VPC Service Controls 強制執行功能。

稽核現有服務,確保符合 VPC Service Controls 規範

設定 VPC Service Controls 後,系統會自動檢查 service perimeter 內專案中建立的新服務是否符合規範。不過,為避免現有工作負載中斷,既有服務仍會繼續運作,但不一定符合組織政策。

Google 建議您定期稽核服務,確保輸入和輸出設定符合需求,並視需要更新或重新部署服務。舉例來說,您可以建立指令碼,使用 Cloud Run Admin API 列出服務,並醒目顯示其中未指定適當網路設定的項目。