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. 設定和需求
在本教學課程中,我們需要下列先決條件:
- GCP 機構
- 機構下的資料夾。
- 資料夾下的同一機構有 2 項 GCP 專案。
- 機構層級的必要權限。
- 兩個專案的帳單帳戶。
- VPC Service Controls 基本教學課程 I VPC Service Controls 和 Access Context Manager 設定。
資源設定
- 按照「Resources-setup」的說明設定資源「VPC Service Controls 基本教學課程 I」一節
- 確認您具備管理 Cloud Storage 所需的權限。
- 在本教學課程中,我們將開始使用 CLI,而非 Cloud 控制台。在其中一個開發環境中,設定 gcloud CLI:
- Cloud Shell:如要在已設定 gcloud CLI 的情況下使用線上終端機,請啟用 Cloud Shell。
按一下 Cloud 控制台右上角的圖示,即可啟用 Cloud Shell。工作階段可能需要幾秒鐘的時間才能完成初始化。詳情請參閱 Cloud Shell 指南。
費用
您必須在 Cloud 控制台中啟用帳單功能,才能使用 Cloud 資源/API。執行本程式碼研究室不會產生任何費用 (如果有的話)。如要關閉資源,以免產生本教學課程結束後產生的費用,您可以刪除自己建立的資源或刪除專案。新使用者符合價值 $300 美元的免費試用方案。
只有 VM 執行個體和 Cloud Storage 物件是唯一會產生費用的資源。如要查看 VM 執行個體的預估費用,請前往 Pricing Calculator。如要查看 Cloud Storage 的預估費用,請參閱這份價目表。
3. 建立 Storage 值區和物件
如前所述,我們要重複使用在上一個教學課程中建立的資源。所以請繼續建立 Cloud Storage 值區。在本教學課程中,我們將開始使用 gcloud CLI,而非控制台。
- 在 Google 控制台中選取「ProjectX」。在這個專案中,我們將建立 Storage 值區和物件。
- 執行下列指令,確認已將 Cloud Shell 設為使用 ProjectX:
gcloud config set project PROJECT_ID
- 在開發環境中,執行下列指令:
gcloud storage buckets create gs://BUCKET_NAME --location=us-central1
- 建立儲存空間物件,讓我們能夠從 ProjectZ 中的 VM 執行個體讀取該物件。我們將建立 .txt 檔案
nano hello.txt
在文字檔中加入任何內容。
- 將物件上傳至值區。
gcloud storage cp /home/${USER}/hello.txt gs://BUCKET_NAME
- 如要確認物件是否已上傳至值區,請列出該物件。
gcloud storage ls gs://BUCKET_NAME
控制台中應會列出 hello.txt 檔案。
4. 保護 Cloud Storage API
在先前的程式碼研究室中,我們建立了範圍並受保護的 Compute Engine API。在本程式碼研究室中,我們將編輯「模擬測試」模式範圍並新增 Cloud Storage。這有助於我們在稽核記錄中呈現 VPC Service Controls 違規事項,協助判斷範圍保護的影響,但在我們強制執行範圍前,您還是可以存取這些資源。
- 在 Google 控制台中選取機構。 存取 VPC Service Controls。請確認您位於機構範圍。
- 開啟 Cloud Shell 並更新 Dry Run 範圍「SuperProtection」先前研究室中建立的映像檔
gcloud access-context-manager perimeters dry-run update SuperProtection --policy=POLICY --add-restricted-services=storage.googleapis.com
- 透過說明範圍,確認 Cloud Storage API 已更新
gcloud access-context-manager perimeters dry-run describe SuperProtection --policy=POLICY
輸出內容中會列出 Cloud Storage API 列於受限制的服務下方
以及 Compute Engine API 中,但具有「-vpcAccessibleServices: {}"
」標籤:
5. 確認 Cloud Storage API 已受到保護
在模擬測試模式下,確認「SuperProtection」範圍是將物件從在 ProjectZ 中建立的 VM 執行個體列出到代管 Storage 值區的 ProjectX,藉此證明您遭拒
- 在 Cloud 控制台中,前往專案選取器並選取 ProjectZ,接著前往 Compute Engine >VM 執行個體。
- 按一下「SSH」按鈕,連線至 VM 執行個體並存取其指令列。
- 列出我們先前上傳的 hello.txt 檔案。
gcloud storage ls gs://BUCKET_NAME
Cloud Storage API 受到模擬測試模式下的保護,您應該可以列出資源,但 ProjectZ 稽核記錄中必須顯示錯誤訊息。
- 前往 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"
- 我們已驗證對 Cloud Storage 發出的 API 呼叫是否產生 VPC Service Controls 違規事項,因此會使用新設定強制執行範圍。開啟 Cloud Shell 並強制執行模擬測試範圍:
gcloud access-context-manager perimeters dry-run enforce SuperProtection --policy=POLICY --async
- 使用 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。
- 前往專案選取器,然後選取 ProjectZ。
- 請在記錄檔探索工具中使用下列查詢,在稽核記錄中找出 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"
- 按一下「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 與服務通訊,並在各個服務範圍之間共用資料。
- 啟用 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
gcloud access-context-manager perimeters update SuperProtection --set-egress-policies=egresstorage.yaml --policy=POLICY
現在,我們可以再次嘗試從 VM 執行個體存取值區。
- 在 Cloud 控制台中,前往專案選取器並選取 ProjectZ,接著前往 Compute Engine >VM 執行個體。
- 按一下「SSH」按鈕,連線至 VM 執行個體並存取其指令列。
- 進入 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).
- 我們必須向 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
- 請再次嘗試從 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 專案後,系統就會停止對該專案使用的所有資源收取費用。
- 如要刪除 VM 執行個體,請勾選 VM 執行個體名稱左側的核取方塊,然後按一下「刪除」。
- 如要刪除範圍,請完成下列步驟:
- 在 Google Cloud 控制台中,依序點選「安全性」和機構範圍的「VPC Service Controls」。
- 在 VPC Service Controls 頁面中,找到要刪除的範圍,然後在相對應的表格列中按一下「刪除圖示」
- 如要刪除存取層級,請完成下列步驟:
- 在 Google Cloud 控制台中,開啟資料夾範圍的「Access Context Manager」頁面。
- 在格狀檢視中,找出您要刪除的存取層級,然後在該列中按一下「刪除圖示」,然後點選「Delete」(刪除)。
- 如要刪除 Storage 物件和值區,請完成下列步驟:
- 在 Google Cloud 控制台中,開啟 「Cloud Storage Bucket」(Cloud Storage 值區) 頁面。
- 找出您建立的值區,並選取旁邊的核取方塊。
- 按一下「刪除」。
- 在隨即開啟的視窗中,確認要刪除值區。
- 按一下「刪除」。
- 如要關閉專案,請完成下列步驟:
- 前往 Google Cloud 控制台中的 IAM 與管理員設定您想刪除的專案頁面。
- 在「IAM 與」在「管理設定」頁面中,按一下「關閉」。
- 輸入專案 ID,然後點選「仍要關閉」。
8. 恭喜!
在本程式碼研究室中,您更新了 VPC Service Controls 模擬測試範圍,並強制執行該範圍,並排解相關問題。
瞭解詳情
- 請參閱 VPC Service Controls 說明文件。
- 請參閱 Access Context Manager 說明文件。
- 請參閱 VPC-SC 疑難排解工具。
- 請參閱輸入和輸出規則說明文件。
- 請參閱模擬測試說明文件
- 請參閱 Cloud Storage 說明文件。
授權
這項內容採用的是創用 CC 姓名標示 2.0 通用授權。