VPC Service Controls 基本教學課程 II - 解決輸出違規問題

1. 簡介

VPC Service Controls (VPC-SC) 是 Google Cloud 中的機構層級安全性控管機制,可讓企業客戶降低資料竊取風險。VPC Service Controls 可讓用戶端限制透過網際網路和其他服務存取多用戶群服務,同時限制對已授權 IP、用戶端內容和裝置參數的存取權,藉此為多用戶群服務提供零信任式存取權,減少蓄意和意外損失。如同我們在 VPC Service Controls 基本教學課程 I 中所述,您可以使用 VPC Service Controls 建立範圍,以保護您明確指定的服務資源和資料。

本教學課程的目標是:

  • 瞭解 VPC Service Controls 的基本概念
  • 更新服務範圍,並使用模擬測試模式進行測試
  • 使用 VPC Service Controls 保護兩項服務
  • 列出 Cloud Storage 中的物件時,解決 VPC Service Controls 輸出違規問題的問題

2. 設定和需求

在本教學課程中,我們需要下列先決條件:

dbec101f41102ca2.png

資源設定

  1. 按照「Resources-setup」的說明設定資源「VPC Service Controls 基本教學課程 I」一節
  2. 確認您具備管理 Cloud Storage 所需的權限
  3. 在本教學課程中,我們將開始使用 CLI,而非 Cloud 控制台。在其中一個開發環境中,設定 gcloud CLI:
  • Cloud Shell:如要在已設定 gcloud CLI 的情況下使用線上終端機,請啟用 Cloud Shell。

按一下 Cloud 控制台右上角的圖示,即可啟用 Cloud Shell。工作階段可能需要幾秒鐘的時間才能完成初始化。詳情請參閱 Cloud Shell 指南

a0ceb29950db4eac.png

  • 本機殼層:如要使用本機開發環境,請安裝初始化 gcloud CLI。

費用

您必須在 Cloud 控制台中啟用帳單功能,才能使用 Cloud 資源/API。執行本程式碼研究室不會產生任何費用 (如果有的話)。如要關閉資源,以免產生本教學課程結束後產生的費用,您可以刪除自己建立的資源或刪除專案。新使用者符合價值 $300 美元的免費試用方案

只有 VM 執行個體和 Cloud Storage 物件是唯一會產生費用的資源。如要查看 VM 執行個體的預估費用,請前往 Pricing Calculator。如要查看 Cloud Storage 的預估費用,請參閱這份價目表

3. 建立 Storage 值區和物件

如前所述,我們要重複使用在上一個教學課程中建立的資源。所以請繼續建立 Cloud Storage 值區。在本教學課程中,我們將開始使用 gcloud CLI,而非控制台。

  1. 在 Google 控制台中選取「ProjectX」。在這個專案中,我們將建立 Storage 值區和物件。
  2. 執行下列指令,確認已將 Cloud Shell 設為使用 ProjectX:
gcloud config set project PROJECT_ID
  1. 在開發環境中,執行下列指令:
gcloud storage buckets create gs://BUCKET_NAME --location=us-central1
  1. 建立儲存空間物件,讓我們能夠從 ProjectZ 中的 VM 執行個體讀取該物件。我們將建立 .txt 檔案
nano hello.txt 

在文字檔中加入任何內容。

  1. 將物件上傳至值區。
gcloud storage cp /home/${USER}/hello.txt gs://BUCKET_NAME
  1. 如要確認物件是否已上傳至值區,請列出該物件。
gcloud storage ls gs://BUCKET_NAME

控制台中應會列出 hello.txt 檔案。

4. 保護 Cloud Storage API

在先前的程式碼研究室中,我們建立了範圍並受保護的 Compute Engine API。在本程式碼研究室中,我們將編輯「模擬測試」模式範圍並新增 Cloud Storage。這有助於我們在稽核記錄中呈現 VPC Service Controls 違規事項,協助判斷範圍保護的影響,但在我們強制執行範圍前,您還是可以存取這些資源。

  1. 在 Google 控制台中選取機構。 存取 VPC Service Controls。請確認您位於機構範圍。
  2. 開啟 Cloud Shell 並更新 Dry Run 範圍「SuperProtection」先前研究室中建立的映像檔
gcloud access-context-manager perimeters dry-run update SuperProtection --policy=POLICY --add-restricted-services=storage.googleapis.com
  1. 透過說明範圍,確認 Cloud Storage API 已更新
gcloud access-context-manager perimeters dry-run describe SuperProtection --policy=POLICY 

輸出內容中會列出 Cloud Storage API 列於受限制的服務下方

以及 Compute Engine API 中,但具有「-vpcAccessibleServices: {}"」標籤:

2025ddc01a2e9a81.png

5. 確認 Cloud Storage API 已受到保護

在模擬測試模式下,確認「SuperProtection」範圍是將物件從在 ProjectZ 中建立的 VM 執行個體列出到代管 Storage 值區的 ProjectX,藉此證明您遭拒

  1. 在 Cloud 控制台中,前往專案選取器並選取 ProjectZ,接著前往 Compute Engine >VM 執行個體
  2. 按一下「SSH」按鈕,連線至 VM 執行個體並存取其指令列。

5ca02149b78c11f9.png

  1. 列出我們先前上傳的 hello.txt 檔案。
gcloud storage ls gs://BUCKET_NAME

Cloud Storage API 受到模擬測試模式下的保護,您應該可以列出資源,但 ProjectZ 稽核記錄中必須顯示錯誤訊息。

  1. 前往 ProjectZ 中的 Logs Explorer API,然後找出 VPC Service Controls 上一則錯誤訊息。您可以使用這個篩選器來取得我們需要的記錄:
protoPayload.status.details.violations.type="VPC_SERVICE_CONTROLS"
"(Dry Run Mode) Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:UNIQUE_ID"

這個篩選器會顯示上次屬於 Cloud Storage 模擬測試模式的違規事件。以下為記錄的示例,我們可在嘗試列出 ProjectX 所在值區的內容時,驗證是否違反政策。

egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTX_ID"
sourceType: "Network"
targetResource: "projects/PROJECTZ_ID"
}
]
resourceNames: [
0: "projects//buckets/BUCKET_NAME"
]
securityPolicyInfo: {
organizationId: "ORGANIZATION_ID"
servicePerimeterName: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"
vpcServiceControlsUniqueId: "UNIQUE_ID"
}
methodName: "google.storage.objects.list"
  1. 我們已驗證對 Cloud Storage 發出的 API 呼叫是否產生 VPC Service Controls 違規事項,因此會使用新設定強制執行範圍。開啟 Cloud Shell 並強制執行模擬測試範圍:
gcloud access-context-manager perimeters dry-run enforce SuperProtection --policy=POLICY --async
  1. 使用 SSH 連線至 VM 執行個體,然後再次列出儲存空間值區,確認模擬測試範圍已正確強制執行。
gcloud storage ls gs://BUCKET_NAME

我們會在 VM CLI 中收到 VPC Service Controls 違規事項,而非 Storage 物件清單:

ERROR: (gcloud.storage.ls) User [PROJECT_NUMBER-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier:"UNIQUE_ID"

我們成功利用 VPC Service Controls 防止資料讀取或將資料複製到範圍外的資源,避免資料竊取。

6. 解決清單遭拒的問題。

我們會針對 VM 執行個體 CLI 收到的拒絕情況進行疑難排解。讓我們查看稽核記錄,找出 VPC Service Controls 的專屬 ID。

  1. 前往專案選取器,然後選取 ProjectZ。
  2. 請在記錄檔探索工具中使用下列查詢,在稽核記錄中找出 VPC Service Controls 專屬 ID:
resource.type="audited_resource"
protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"

這項操作會顯示所有 VPC Service Controls 稽核記錄。我們會尋找最後一個錯誤記錄。由於 API 呼叫是透過 VM 執行個體發出,因此主體須為 Compute Engine 服務帳戶「PROJECT_NUMBER-compute@developer.gserviceaccount.com"

由於我們已擁有 VPC Service Controls 專屬 ID,現在可以使用這個篩選器,直接取得所需的記錄:

protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_ID"
  1. 按一下「VPC Service Controls」標頭,然後選取「排解拒絕問題」即可開啟 VPC Service Controls 疑難排解工具。

這個 API 會在友善的 UI 中顯示違規原因,以及這是是否有輸入或輸出違規情況以及其他實用內容。

在本練習中,我們會尋找下列項目:

authenticationInfo: {
principalEmail: "PROJECT_ID-compute@developer.gserviceaccount.com"
egressViolations: [
0: {
servicePerimeter: "accessPolicies/POLICY/servicePerimeters/SuperProtection"
source: "projects/PROJECTZ_ID"
sourceType: "Network"
targetResource: "projects/PROJECTX_ID"
}
violationReason: "NETWORK_NOT_IN_SAME_SERVICE_PERIMETER"

這些資訊足以讓我們知道我們需要建立輸出規則,讓 Compute Engine 服務帳戶從 ProjectZ 到 ProjectX 存取儲存值區。我們還可以看到網路不在同一個範圍內,因此我們必須允許 VPC 與服務通訊,並在各個服務範圍之間共用資料。

  1. 啟用 Cloud Shell,並使用文字編輯器建立含有輸出規則的 .yaml 檔案。
nano egresstorage.yaml 
- egressTo:
    operations:
    - serviceName: storage.googleapis.com
      methodSelectors:
      - method: \"*\"
    resources:
    - projects/PROJECTX_ID
 egressFrom:
    identities:
    - serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com
  1. 更新保護 ProjectZ 的輸入政策
gcloud access-context-manager perimeters update SuperProtection --set-egress-policies=egresstorage.yaml --policy=POLICY 

現在,我們可以再次嘗試從 VM 執行個體存取值區。

  1. 在 Cloud 控制台中,前往專案選取器並選取 ProjectZ,接著前往 Compute Engine >VM 執行個體
  2. 按一下「SSH」按鈕,連線至 VM 執行個體並存取其指令列。
  3. 進入 VM CLI 後,請嘗試列出 Storage 值區中的物件。
gcloud storage ls gs://BUCKET_NAME/

系統會顯示以下錯誤訊息:

ERROR: (gcloud.storage.ls) User [PROJECT_ID-compute@developer.gserviceaccount.com] does not have permission to access b instance [BUCKET_NAME] (or it may not exist): PROJECT_ID-compute@developer.gserviceaccount.com does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist).
  1. 我們必須向 Compute Engine 服務帳戶授予物件讀取者權限,才能列出 Storage 值區中的物件。
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME --member=serviceAccount:PROJECT_ID-compute@developer.gserviceaccount.com --role=roles/storage.objectViewer
  1. 請再次嘗試從 VM 執行個體的 CLI 列出 hello.txt 檔案。
gcloud storage ls gs://BUCKET_NAME/
.
.
gs://BUCKET_NAME/hello.txt

現在我們可以列出物件,而未違反 VPC Service Controls 權限,但下載檔案怎麼辦?我們試試看。

gcloud storage cp gs://BUCKET_NAME/hello.txt /home/${USER}

然後,系統會取得以下輸出內容

Copying gs://BUCKET_NAME/hello.txt to file:///home/${USER}
 Completed files 1/1 | 54.0B/54.0B  

7. 清除

在未使用 VPC Service Controls 的情況下,使用 VPC Service Controls 不會另外收費,但最佳做法是清除本研究室中使用的設定。您也可以刪除 VM 執行個體和/或 Cloud 專案,以免產生費用。刪除 Cloud 專案後,系統就會停止對該專案使用的所有資源收取費用。

  1. 如要刪除 VM 執行個體,請勾選 VM 執行個體名稱左側的核取方塊,然後按一下「刪除」

da0abf0894fe03cd.png

  1. 如要刪除範圍,請完成下列步驟:
  • 在 Google Cloud 控制台中,依序點選「安全性」和機構範圍的「VPC Service Controls」
  • 在 VPC Service Controls 頁面中,找到要刪除的範圍,然後在相對應的表格列中按一下「刪除圖示」
  1. 如要刪除存取層級,請完成下列步驟:
  • 在 Google Cloud 控制台中,開啟資料夾範圍的「Access Context Manager頁面。
  • 在格狀檢視中,找出您要刪除的存取層級,然後在該列中按一下「刪除圖示」,然後點選「Delete」(刪除)
  1. 如要刪除 Storage 物件和值區,請完成下列步驟:
  • 在 Google Cloud 控制台中,開啟 「Cloud Storage Bucket」(Cloud Storage 值區) 頁面。
  • 找出您建立的值區,並選取旁邊的核取方塊。
  • 按一下「刪除」。
  • 在隨即開啟的視窗中,確認要刪除值區。
  • 按一下「刪除」。
  1. 如要關閉專案,請完成下列步驟:
  • 前往 Google Cloud 控制台中的 IAM 與管理員設定您想刪除的專案頁面。
  • 在「IAM 與」在「管理設定」頁面中,按一下「關閉」
  • 輸入專案 ID,然後點選「仍要關閉」

8. 恭喜!

在本程式碼研究室中,您更新了 VPC Service Controls 模擬測試範圍,並強制執行該範圍,並排解相關問題。

瞭解詳情

授權

這項內容採用的是創用 CC 姓名標示 2.0 通用授權。