VPC Service Controls (VPC SC) 簡介
雖然 IAM 控管「誰」有權存取資源,但 VPC Service Controls (VPC SC) 控管「從何處」允許存取以及資料可以「流向何處」。它在 Google Cloud 資源周圍建立一個邏輯周界,以降低資料外洩 (Data Exfiltration) 的風險。
對於 專業雲端安全工程師 (PSE) 而言,VPC SC 是「最後一道防線」。即使服務帳戶金鑰被盜,如果攻擊者位於周界之外,他們也無法使用該金鑰存取受保護的資料。
白話文解釋(Plain English Explanation)
類比 1:大使館院區
把服務周界 (Service Perimeter) 想像成設在外國境內的大使館院區。大使館決定哪些專案(房間)位於圍牆之內,以及哪些 API(如 storage.googleapis.com、bigquery.googleapis.com)屬於「外交財產」。即使竊賊偷走了警衛的鑰匙(服務帳戶憑證),只要他不是從許可的位址前來,就無法在大門口使用——許可的位址由 Access Level 定義,比對來源 IP、裝置狀態或身分。警衛不在乎鑰匙是不是真的;只要請求來自不對的街道,就會在周界處被擋下,並回傳 RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER 違規。
類比 2:飯店保險箱與後門通道
沒有 VPC SC 的 GCS 和 BigQuery 就像飯店保險箱——IAM 是密碼鎖。但如果客人抄走密碼後直接從大廳把現金搬走,保險箱本身沒失職,飯店還是賠錢。VPC SC 就是大廳金屬偵測門加上保全攝影機:就算密碼正確,你也不能把現金透過大廳走向未經授權的出口。restricted VIP 199.36.153.4/30(對應 restricted.googleapis.com)就是專用的服務電梯——只有透過 Private Google Access 路由到這個 VIP 的地端流量,才被允許抵達受限 API。
類比 3:消防演習 vs 真正火災(Dry-run vs Enforced)
測試模式 (Dry-run mode) 就像消防演習——警報會把「會被擋下的人」全部記錄起來(spec 設定),但門其實沒鎖,業務照常運作。強制執行模式 (Enforced mode)(status 設定)才是真正的火災——門會真的鎖住,請求會以 ACCESS_DENIED 失敗。你永遠要先演習 7 到 14 天,掃描 Policy Denied 記錄中的 vpcServiceControlsUniqueId,辨識合法流量,撰寫對應的 Ingress/Egress 規則,最後才把 spec 升級為 status。
定義服務周界與保護邊界
服務周界 (Service Perimeter) 是一個可以在組織或資料夾層級套用的邏輯邊界。您可以將專案加入周界,並指定要限制哪些 Google Cloud 服務 (API)。
關鍵組件:
- 受保護的專案 (Protected Projects): 周界內的專案。預設情況下,這些專案之間的通訊是被允許的。
- 受限服務 (Restricted Services): 被周界「鎖定」的特定 API(例如
storage.googleapis.com、bigquery.googleapis.com)。 - 存取層級 (Access Levels): 在 Access Context Manager 中定義的條件,規定何時允許從周界外部進行存取。
VPC Service Controls (VPC SC) 是一項安全功能,允許您在 Google Cloud 資源周圍定義安全周界,以減輕資料外洩風險。
受限服務 (Storage, BigQuery, KMS)
當您限制某項服務時,VPC SC 會攔截對該服務 API 的呼叫。如果呼叫源自周界外部且不符合允許的入站規則 (Ingress Rule),該呼叫將被封鎖。
常見的受限服務包括:
- Cloud Storage (GCS): 防止將資料複製到周界外部的儲存桶。
- BigQuery: 防止將資料匯出到未授權的資料集。
- Cloud KMS: 確保金鑰僅由邊界內獲授權的實體使用。
- Cloud SQL、Vertex AI 和 Pub/Sub。
VPC SC 保護的是 API,而不僅僅是網路流量。即使是擁有合法 IAM 權限的使用者,如果試圖將資料移至未授權的地點,VPC SC 依然有效。
防止資料外洩
VPC SC 的主要設計目的是防止兩種類型的資料外洩:
- 來自未授權地點的存取: 攻擊者從公共網際網路使用被盜的憑證。
- 將資料複製到未授權的資源: 惡意的內部人員試圖將受保護 GCS 儲存桶中的資料複製到其在另一個組織中擁有的儲存桶。
測試模式 (Dry-run mode)
如果不夠小心,設定 VPC SC 往往會「搞壞」應用程式。測試模式 (Dry-run mode) 允許您在不實際執行限制的情況下測試周界的變更。
- 強制執行模式 (Enforced Mode,
status設定): 違規會導致ACCESS_DENIED錯誤,請求會被封鎖。 - 測試模式 (Dry-run Mode,
spec設定): 違規會記錄在 Cloud Logging 中並標記dryRun: true,但請求仍會被允許。
一個 perimeter 資源同時擁有 status 區塊(正式生效的政策)和 spec 區塊(提案中的政策)。您不斷在 spec 上反覆調整,直到記錄乾淨,再呼叫 accesscontextmanager.servicePerimeters.commit 將 spec 升級為 status。
Restricted VIP 199.36.153.4/30(由 restricted.googleapis.com 解析)是友善於地端流量的端點,連混合流量也會強制套用 VPC SC。請在地端透過 Cloud DNS 轉送區與 Cloud Router,把 Private Google Access 的 *.googleapis.com DNS 指向這個 VIP;標準的 private.googleapis.com(199.36.153.8/30)VIP 不會 對受限服務套用周界限制。
強烈建議至少使用測試模式 7 到 14 天。分析記錄以識別會被封鎖的合法流量,並在切換到強制執行模式之前建立必要的入站/出站規則。
VPC SC 故障排除:Troubleshooter
Google Cloud 控制台中的 VPC Service Controls Troubleshooter 是一項必不可少的工具。
- 在 Cloud Logging 中找到拒絕存取的唯一 ID (尋找
vpcServiceControlsUniqueIdentifier)。 - 將 ID 貼到 Troubleshooter 中。
- 該工具會識別是哪個周界封鎖了請求,以及是哪個具體規則(或缺乏規則)導致了拒絕。
處理來自周界外部的存取
有時,合法的實體(使用者、外部服務或 CI/CD 流水線)需要存取周界內的資源。
1. 入站規則 (Ingress Rules)
入站規則允許進入周界的存取。可以根據以下內容定義範圍:
- 身分 (Identity): 特定的使用者帳戶或服務帳戶。
- 來源 (Source): 存取層級 (IP 範圍、裝置狀態) 或特定專案。
- 資源 (Resource): 特定的儲存桶或資料集。
2. Access Context Manager 整合
如前所述,ACM 存取層級可用作進入周界的「鑰匙」。例如,您可以設定僅當開發人員使用受管理的裝置時,才允許其存取 BigQuery。
周界類型:標準 vs. 代管
- 標準周界 (Standard Perimeter): 您手動加入專案並設定服務。最常用於自定義的組織需求。
- 代管周界 (Managed Perimeter): 通常用於多租戶環境,其中周界是透過程式編寫產生的。
跨專案與資料夾管理周界
VPC SC 周界是透過存取政策 (Access Policies) 在組織層級進行管理的。
- 一個專案只能屬於一個服務周界。
- 您可以使用周界橋接 (Perimeter Bridges)(參見主題 13)來允許不同周界之間的通訊。
記錄與診斷資訊
VPC SC 會為每次拒絕產生稽核記錄。
- 記錄名稱:
cloudaudit.googleapis.com/policy(Policy Denied 稽核記錄)或data_access。 - 過濾器:
protoPayload.metadata.@type="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata" AND protoPayload.status.code=7 - 負載: 查看
protoPayload.metadata.vpcServiceControlsUniqueId(要貼進 Troubleshooter 的唯一 ID)以及protoPayload.metadata.violationReason。
常見的 violationReason 數值
RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER:跨周界的呼叫(例如周界 A 的 Dataflow 工作要讀取周界 B 的 GCS 儲存桶)。請以 Perimeter Bridge 或 Ingress/Egress 規則 修復。NO_MATCHING_ACCESS_LEVEL:呼叫者位於周界外,且沒有 Ingress 規則的 Access Level 命中其 IP、裝置或身分。請以 ACM Access Level + Ingress 規則修復。SERVICE_NOT_ALLOWED_FROM_VPC:周界內的 VPC 嘗試呼叫某個受限 API,但該 API 沒有列在restrictedServices(或 VPC Accessible Services)清單中。請新增該服務或透過VPCAccessibleServices修復。
VPC SC 拒絕記錄分流口訣:
RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER→ 跨周界;加 Bridge 或 Ingress/Egress 規則。NO_MATCHING_ACCESS_LEVEL→ 周界外呼叫者;建 ACM Access Level + Ingress 規則。SERVICE_NOT_ALLOWED_FROM_VPC→ 服務不在restrictedServices/VPCAccessibleServices內。
永遠先從 Policy Denied 記錄抓 vpcServiceControlsUniqueId,再把它丟進 Troubleshooter——不要靠猜。
除非服務受到限制,否則 VPC SC 不會套用於專案「內部」的流量。它主要守衛的是「API 邊界」。
PSE 考試情境
情境 1:防止跨組織資料傳輸
「安全工程師需要防止員工使用 gsutil cp 指令將資料從敏感專案移至個人的 GCS 儲存桶。應該如何設定?」
解答: 在敏感專案周圍建立服務周界。限制 Cloud Storage API。確保沒有出站規則允許流量流向「個人」組織。
情境 2:排除中斷的流水線
「在強制執行周界後,位於地端的 Jenkins 伺服器無法再將建置構件上傳到 GCS。工程師應該檢查什麼?」
解答: 檢查 Cloud Audit Logs 中的 VPC SC 拒絕記錄。找到 vpcServiceControlsUniqueIdentifier。使用 VPC SC Troubleshooter。如果來源是 Jenkins 的 IP,請為該 IP 建立 ACM 存取層級,並將其加入周界的入站規則中。
總結檢查表
- 區分 IAM 和 VPC SC 之間的差異。
- 列出三項通常受 VPC SC 保護的服務。
- 解釋測試模式 (Dry-run mode) 的好處。
- 識別用於分析 VPC SC 拒絕原因的工具。
- 描述入站規則如何允許外部存取。