1. 簡介
在本實驗室中,我們將學習如何使用 VPC 服務控管,在將資料從 Cloud Storage 轉移至 BigQuery 資料集時,保護 BigQuery 資料移轉服務。接著,我們會保護 Cloud Storage,並重複上述程序,將資料從 Cloud Storage 轉移至 BigQuery。Cloud Storage 的保護措施會導致 VPC Service Controls 違規,因此必須修正才能成功轉移。最後,我們也會保護 BigQuery,然後嘗試在專案之間複製資料集,這也會導致違規行為,需要進行修正。
在本研究室中,我們將分別使用輸入和輸出規則來修正輸入和輸出違規問題。我們也會使用存取層級來修正 BigQuery 資料移轉入口違規問題。本程式碼研究室的目標如下:
- 瞭解如何分別針對不同服務 (特別是 Cloud Storage、BigQuery 和 BigQuery 資料移轉服務) 使用入站和出站規則,修正入站和出站違規問題。
- 瞭解特定違規行為的發生原因。
2. 資源設定和需求
事前準備
在本程式碼研究室中,我們假設您已瞭解:
- 如何建立資料夾
- 如何在資料夾中建立專案或移動資料夾中的現有專案
- 如何建立有範圍的存取權政策
- 如何透過 Google Cloud 控制台建立及設定服務範圍
- 如何從稽核記錄找出違規記錄
設定
我們的初始設定如下:
- Google Cloud 機構。
- 機構下的資料夾。在本程式碼研究室中,我們會稱其為
codelab-folder
。 codelab-folder
資料夾中的兩個 Google Cloud 專案。在本程式碼研究室中,我們將專案稱為project-1
和project-2
。- 如果您尚未建立資料夾和專案,請在 Google Cloud 控制台中,建立機構下的資料夾,並建立兩個新專案。
- 所需權限:用於管理資料夾的 IAM 角色、用於管理專案的 IAM 角色、用於設定 VPC Service Controls 的 IAM 角色、用於管理 BigQuery 的 IAM 角色,以及用於管理 Cloud Storage 的 IAM 角色。
project-1
和project-2
專案的帳單帳戶。
建立範圍政策和一般服務範圍
在本程式碼研究室中,我們會使用一般服務範圍來保護 project-2
。
- 建立範圍限定的存取權政策,其範圍為資料夾
codelab-folder
層級。在本程式碼研究室中,我們假設建立的存取權政策 ID 為987654321
。 - 建立一般範圍,我們稱之為
perimeter-2
,並新增專案project-2
。
在範圍 perimeter-2
中,限制 BigQuery Data Transfer API
。
建立 Cloud Storage bucket 和 BigQuery 資料集
本程式碼研究室的目的在於讓您瞭解如何使用 CSV 檔案,因此任何 CSV 檔案都行,不論內容為何。主要限制與並置需求有關,這項規定會強制執行以下規定:
- 如果您的 BigQuery 資料集位於多地區,含有要轉移資料的 Cloud Storage 值區必須位於相同的多地區,或是位於多地區內的某個位置
- 如果資料集位於某個地區,Cloud Storage 值區就必須位於相同的地區。
從現在開始,我們會確保本程式碼研究室的 Cloud Storage 值區和 BigQuery 資料集位於相同地區或多地區。
在專案 project-1
中建立新的 Cloud Storage 值區
如要建立新的 Cloud Storage 值區,請按照建立新的值區的說明步驟操作。
- 請輸入符合值區命名規定的值區名稱。在本程式碼研究室中,我們會將儲存體命名為
codelab-bqtransfer-bucket
。 - 針對資料儲存位置 (值區位置),請選取位置類型和位置,以便永久儲存值區資料。在本程式碼研究室中,我們會使用「美國 (多個美國區域)」。
建立 CSV 檔案
您可以透過本機電腦或 Cloud Shell,使用 echo
指令建立範例 CSV 檔案 codelab-test-file.csv
,請使用下列指令:
echo "name,age" > codelab-test-file.csv; \
echo "Alice,10" >> codelab-test-file.csv; \
echo "Bob,20" >> codelab-test-file.csv; \
echo "Carol,30" >> codelab-test-file.csv; \
echo "Dan,40" >> codelab-test-file.csv; \
echo "Eve,50" >> codelab-test-file.csv; \
echo "Frank,60" >> codelab-test-file.csv; \
echo "Grace,70" >> codelab-test-file.csv; \
echo "Heidi,80" >> codelab-test-file.csv;
將 CSV 檔案上傳至 Cloud Storage 值區
建立 CSV 檔案後,請執行下列指令,將檔案物件上傳至已建立的值區:
gcloud storage cp codelab-test-file.csv gs://codelab-bqtransfer-bucket
您可以列出值區中的物件,或執行下列指令,確認檔案是否已上傳至已建立的值區:
gcloud storage ls --recursive gs://codelab-bqtransfer-bucket/**
在 project-2
中建立 BigQuery 資料集和資料表
- 按照這些步驟,在專案
project-2
中建立 BigQuery 資料集。 - 按照這些步驟,在已建立的資料集
codelab_bqtransfer_dataset
下方建立 BigQuery 資料表。- 在「Source」部分,選取「Create table from」清單中的「Empty table」。
- 在「Table」(資料表) 欄位中,輸入要建立的資料表名稱。在本程式碼研究室中,我們使用名稱:
codelab-bqtransfer-table
。 - 確認「Table type」欄位已設為「Native table」
- 在「Schema」(結構定義) 部分輸入結構定義。您可以按一下「以文字形式編輯」,然後輸入符合建立的 CSV 檔案格式的下列結構定義,即可輸入結構定義資訊。
[{ "name": "name", "type": "STRING", "mode": "NULLABLE", "description": "The name" }, { "name": "age", "type": "INTEGER", "mode": "NULLABLE", "description": "The age" }]
費用
您必須在專案 project-2
和 project-1
中啟用計費功能,才能使用 Cloud 資源/API。建議您關閉已使用的資源,避免產生超出本程式碼研究室的費用。
產生費用的資源是 BigQuery 和 Cloud Storage。如需預估費用,請使用 BigQuery 定價計算工具和 Cloud Storage 計算工具。
3. 設定從 Cloud Storage 物件到 BigQuery 資料表的資料移轉作業
我們現在會嘗試建立資料移轉服務 (位於 project-2
),以便從 Cloud Storage (位於 project-1
) 將資料移轉至 BigQuery (位於 project-2
),同時在 project-2
中使用 VPC 服務控管來保護 BigQuery 資料移轉服務。只保護 BigQuery 資料移轉服務 (而不保護 BigQuery 和 Cloud Storage) 會限制使用者只能建立及管理資料移轉作業 (例如手動啟動資料移轉作業)。
設定從 Cloud Storage 移轉資料
如要建立資料移轉作業,請按照下列步驟操作:
- 前往
project-2
的 Google Cloud 控制台中的 BigQuery 頁面。 - 按一下「資料移轉」。
調查存取「資料移轉」頁面時的違規情形
我們可以在 Google Cloud 控制台中查看 VPC Service Controls 專屬 ID。使用相同的 ID 篩選記錄檔並找出違規詳細資料 (將 OBSERVED_VPCSC_DENIAL_UNIQUE_ID
替換為觀察到的拒絕 ID):
protoPayload.metadata.@type="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
protoPayload.metadata.vpcServiceControlsUniqueId="OBSERVED_VPCSC_DENIAL_UNIQUE_ID"
系統偵測到的違規行為是 NO_MATCHING_ACCESS_LEVEL
,這是一種入站違規行為,詳細資料如下:
ingressViolations: [
0: {
servicePerimeter: "accessPolicies/987654321/servicePerimeters/perimeter-2"
targetResource: "projects/[PROJECT2_NUMBER]"
}]
violationReason: "NO_MATCHING_ACCESS_LEVEL"
callerIp: "USER_PUBLIC_IP_ADDRESS"
resource: {
labels: {
method: "google.cloud.bigquery.datatransfer.v1.DataTransferService.ListTransferConfigs"
project_id: "project-2"
service: "bigquerydatatransfer.googleapis.com"
}
type: "audited_resource"
}
存取「資料移轉」頁面時,系統會嘗試列出所有已設定的資料移轉,因此違反 ListTransferConfigs
方法。
修正 bigquerydatatransfer.googleapis.com
服務的違規問題
您可以使用存取層級或 ingress 規則來修正 ingress 違規問題。在本程式碼研究室中,我們將使用已拒絕使用者身分的 ingress 規則,允許存取 bigquerydatatransfer.googleapis.com
服務和所有方法。
輸入規則生效後,您應該可以順利存取「資料移轉」頁面。
繼續設定從 Cloud Storage 移轉資料
在前述步驟中,點選「資料轉移」後,請繼續執行以下步驟:
- 按一下「+ 建立移轉作業」。
- 在「Source type」(來源類型) 專區中,針對「Source」(來源),選擇「Google Cloud Storage」。
- 在「Transfer config name」(轉移設定名稱) 區段中,針對「Display name」(顯示名稱) 輸入移轉作業的名稱,例如
Codelab Transfer
。 - 在「Schedule options」(排程選項) 專區:
- 選取「重複執行頻率」,例如 15 分鐘。
- 請務必選取「立即開始」,否則資料移轉作業會在設定的重複執行頻率後才開始
- 在「Destination settings」(目的地設定) 專區中,針對「Destination dataset」(目的地資料集),選擇您建立來儲存資料的資料集:
codelab_bqtransfer_dataset
- 在「資料來源詳細資料」專區中
- 在「Destination table」(目的地資料表) 中輸入目的地資料表的名稱。目標資料表必須遵循資料表命名規則。在本程式碼研究室中,我們會使用先前建立的資料表:
codelab-bqtransfer-table
- 在「Cloud Storage URI」部分,輸入 Cloud Storage URI。在本程式碼研究室中,我們會使用已建立的儲存桶和檔案:
codelab-bqtransfer-bucket/codelab-test-file.csv
- 針對「Write preference」(寫入偏好設定),請保留
APPEND
(或選擇MIRROR
)。 - 請勿選取在轉移後刪除檔案 (因為我們會重複使用相同的檔案。不過,您可以使用多個檔案,並在轉移後刪除來源檔案)
- 在「File format」(檔案格式) 部分,選取「CSV」
- 在「Transfer Options」中,點選「CSV」,然後輸入半形逗號 (「,」) 做為「Field delimiter」。
- 在「Destination table」(目的地資料表) 中輸入目的地資料表的名稱。目標資料表必須遵循資料表命名規則。在本程式碼研究室中,我們會使用先前建立的資料表:
- 在「Service Account」(服務帳戶) 選單中,選取與 Google Cloud 專案相關聯的服務帳戶
- 所選服務帳戶必須具備所需權限,才能在代管儲存值區的專案中使用 Cloud Storage;請參閱本程式講義中的
project-1
。 - 在本程式碼研究室中,我們會使用在
project-2
中建立的服務帳戶做為codelab-sa@project-2.iam.gserviceaccount.com
。
- 所選服務帳戶必須具備所需權限,才能在代管儲存值區的專案中使用 Cloud Storage;請參閱本程式講義中的
- 按一下 [儲存]。
由於我們選取「立即開始」做為排程選項,因此選取「儲存」後,系統就會開始進行第一次轉移。
驗證資料移轉服務狀態
如要確認已設定資料移轉作業的狀態,請按照下列步驟操作:
- 前往 Google Cloud 控制台的「BigQuery」頁面
- 按一下「資料移轉」。
- 系統會顯示已設定的轉移清單
按一下「顯示名稱」下方的 Codelab Transfer
,系統就會列出目前執行過的所有執行作業。
資料轉移作業應能順利執行,且無論是手動觸發的資料轉移作業,還是排定的資料轉移作業,都不會違反 VPC Service Controls。請注意,只有手動觸發的轉移作業需要入站規則,才能允許存取手動啟動的轉移作業主體。
4. 手動觸發資料移轉作業的 IP 位址限制
目前設定的入站規則允許已設定的 ID 從任何 IP 位址手動觸發資料移轉。
透過存取層級,VPC Service Controls 可根據特定 API 要求的屬性限制允許的存取權,特別是:
- IP 子網路:檢查要求是否來自特定 IP 位址。
- 區域:檢查要求是否來自特定區域,這會根據 IP 位址的地理位置判斷。
- 原則:檢查要求是否來自特定帳戶。
- 裝置政策:檢查要求是否來自符合特定需求的裝置。
如要強制驗證這些屬性,並搭配已設定的入站規則,我們必須建立存取層級,允許所需屬性,然後在入站規則中將建立的存取層級新增為來源。
此圖表顯示兩個主要實體 (
user@example.com
和 user2@example.com
) 在三種情境下啟動的存取權,說明 VPC Service Controls 如何評估來源 (入站存取權層級) 和身分屬性屬性,並以 AND 條件 (兩者必須相符) 進行評估。
- 當使用者 user@example.com 嘗試從存取層級允許的 IP 位址存取時,系統會允許存取,因為該使用者的 IP 位址和使用者帳戶與入站規則中的設定相符。
- 當使用者 user@example.com 的 IP 位址不符於允許的 IP 位址時,系統會封鎖該使用者的存取權,即使該使用者的帳戶是輸入規則中設定的帳戶。
- 使用者 user2@example.com 嘗試從允許的 IP 位址存取資料,但因帳戶不符合入站規則而遭到封鎖。
建立存取層級
如要建立以 IP 位址限制存取權的存取層級,請按照下列步驟操作:
- 在 Google Cloud 控制台中開啟「Access Context Manager」頁面。
- 系統顯示提示時,請選取資料夾
codelab-folder
。
- 系統顯示提示時,請選取資料夾
- 按一下「Access Context Manager」頁面頂端的「CREATE ACCESS LEVEL」。
- 在「New Access Level」(建立新的存取層級) 窗格中,為新的存取層級指定「Title」(標題)。在本程式碼研究室中,我們會將其稱為
project_2_al
。 - 在「條件」部分,按一下「IP 子網路」前方的「+」。
- 在「IP Subnetworks」(IP 子網路) 方塊中,選取「Public IP」(公開 IP)
- 您也可以選擇使用私人 IP,在存取層級使用內部 IP 位址。不過,在本程式碼研究室中,我們使用的是公開 IP。
- 輸入一或多個 IPv4 或 IPv6 範圍 (CIDR 區塊格式)。
在 ingress 規則中新增存取層級
在輸入規則中,存取層級會在 sources
欄位下參照,這是 輸入規則參照 中所述的必要欄位。為了允許資源的入站存取,VPC Service Controls 會將 sources
和 identityType
屬性視為 AND 條件。入站規則會使用手動觸發資料移轉的使用者身分,而不是資料移轉設定中指定的服務帳戶。
重新執行轉移作業,並使用限制 IP 位址存取權的設定
如要評估已套用設定的有效性,請使用下列情境再次觸發轉移作業:
- 使用輸入規則參照的存取層級中允許的 IP 位址範圍。
- 使用設定「不允許」的 IP 位址
來自允許 IP 位址的存取應成功,來自不允許 IP 位址的存取則應失敗,並導致 VPC Service Controls 違規。
如要測試使用其他 IP 位址,最簡單的方法是允許在使用 Google Cloud 控制台時指派 IP 位址,然後在使用 Cloud Shell 時進行測試。
在 Cloud Shell 中執行下列指令,手動觸發轉移作業,並替換 RUN_TIME 和 RESOURCE_NAME:
bq mk \
--transfer_run \
--run_time='RUN_TIME' \
RESOURCE_NAME
舉例來說,下列範例指令會立即執行專案 1234567890
中的移轉 12345678-90ab-cdef-ghij-klmnopqrstuv
設定。
NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ");
bq mk \
--transfer_run \
--run_time=$NOW \
projects/1234567890/locations/us/transferConfigs/12345678-90ab-cdef-ghij-klmnopqrstuv
觀察到的輸出內容顯示 VPC Service Controls 違規,這與預期一致,因為系統不允許使用該 IP 位址。
系統偵測到 DataTransferService.StartManualTransferRuns
方法的違規情形。
ingressViolations: [
0: {
servicePerimeter: "accessPolicies/987654321/servicePerimeters/perimeter-2"
targetResource: "projects/[PROJECT2_NUMBER]"
targetResourcePermissions: [0: "vpcsc.permissions.unavailable"]
}]
violationReason: "RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER"
resource: {
labels: {
method: "google.cloud.bigquery.datatransfer.v1.DataTransferService.StartManualTransferRuns"
project_id: "project-2"
service: "bigquerydatatransfer.googleapis.com"
}
type: "audited_resource"
}
severity: "ERROR"
5. 在保護 Cloud Storage 服務的同時開始資料移轉作業
由於我們要執行從 Cloud Storage 到 BigQuery 的移轉作業,因此請在受 VPC Service Controls 保護的服務中加入 Cloud Storage,看看移轉作業是否仍能成功。
在 perimeter-2
設定中,將 Cloud Storage API 和 BigQuery Data Transfer API 新增為受限制服務。
保護 Cloud Storage API 後,請等待下次排定資料移轉作業,或按照下列步驟手動觸發移轉作業:
- 前往 Google Cloud 控制台的「BigQuery」頁面。
- 按一下「資料移轉」。
- 從清單中選取轉移作業:在本程式碼研究室中,我們使用的是「Codelab Transfer」轉移作業
- 按一下「立即執行移轉作業」
- 按一下「確定」。
系統會啟動另一次轉移作業。您可能需要重新整理頁面,才能看到這項資訊。這次的轉移作業會因違反 VPC Service Controls 而失敗。
調查 Cloud Storage VPC Service Controls 違規
使用轉移「摘要」中顯示的 vpcServiceControlsUniqueIdentifier
篩選稽核記錄。
系統偵測到違規行為是 RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER
外連違規,詳細資料如下:
- 主體是指在資料移轉服務中設定的服務帳戶 (無論是手動觸發或執行預定的資料移轉作業,拒絕的主體都會相同)。
- 受影響的服務是 Cloud Storage
- 要求來源是設定資料移轉服務的專案:
project-2
- 目標專案是 Cloud Storage 物件所在的專案:
project-1
principalEmail: "codelab-sa@project-2.iam.gserviceaccount.com"
egressViolations: [
0: {
servicePerimeter: "accessPolicies/987654321/servicePerimeters/perimeter-2"
source: "projects/[PROJECT2_NUMBER]"
sourceType: "Resource"
targetResource: "projects/[PROJECT1_NUMBER]"
targetResourcePermissions: [0: "storage.objects.get"]
}]
labels: {
method: "google.storage.objects.get"
project_id: "project-2"
service: "storage.googleapis.com"
}
修正 Cloud Storage 輸出違規問題
如要修正輸出違規情形,我們必須使用輸出規則,允許來自遭拒服務帳戶的流量,連往含有 Cloud Storage 物件的專案。
修改服務範圍 perimeter-2
後,請重複該程序再次觸發轉移作業。轉移作業不會顯示錯誤。
6. 將 BigQuery 資料集從 project-2 複製到 project-1
確認可以將資料從 project-1
的 Cloud Storage 值區轉移至 project-2
的 BigQuery 資料集後,我們將複製 BigQuery 資料集,從 project-2
轉移至 project-1
,同時 BigQuery API 受到 VPC Service Controls 保護。
如要建立及複製資料集,我們會使用 bq mk
指令,該指令會使用 bq 工具。
在 project-1
中建立目的地資料集
在複製資料集之前,您必須先建立目的地資料集。如要建立目的地資料集,我們可以執行下列指令,在專案 project-1
中建立名為 copied_dataset
的資料集,並將 us
做為位置。
bq mk \
--dataset \
--location=us \
project-1:copied_dataset
使用 VPC Service Controls 保護 project-2
中的 BigQuery 服務
修改外圍 perimeter-2
的設定,並將 BigQuery API 新增為受保護的服務,以及 BigQuery 資料移轉和 Cloud Storage 服務。
開始複製資料集
如要複製資料集,請執行下列 bq mk
指令,將專案 project-2
中的資料集 codelab_bqtransfer_dataset
複製到 project-1
中的資料集 copied_dataset
,並覆寫資料集內容 (如有)。
bq mk \
--transfer_config \
--project_id=project-1 \
--target_dataset=copied_dataset \
--data_source=cross_region_copy \
--display_name='Dataset from project-2 to project-1' \
--params='{
"source_dataset_id":"codelab_bqtransfer_dataset",
"source_project_id":"project-2",
"overwrite_destination_table":"true"
}'
指令會順利執行,同時建立轉移設定,以便開始複製資料集的作業。複製資料集本身會失敗,並違反 VPC Service Controls。
如要查看相應的 VPC Service Controls 違規詳細資料,請使用下列記錄查詢,檢查 project-2
(來源資料集專案) 中的記錄。記錄查詢會根據 BigQuery 服務和所複製資料集的資源名稱篩選記錄 (codelab_bqtransfer_dataset
)。
resource.labels.service="bigquery.googleapis.com"
protoPayload.metadata.resourceNames:"datasets/codelab_bqtransfer_dataset"
系統偵測到的 VPC Service Controls 違規行為是從 project-2
到 project-1
的傳出違規行為。
egressViolations: [
0: {
servicePerimeter: "accessPolicies/987654321/servicePerimeters/perimeter-2"
source: "projects/[PROJECT-2-NUMBER]"
sourceType: "Resource"
targetResource: "projects/[PROJECT-1-NUMBER]"
targetResourcePermissions: [
0: "bigquery.transfers.update"
1: "bigquery.transfers.get"
2: "bigquery.jobs.create"
]
}
]
method: "bigquery.tables.getData"
service: "bigquery.googleapis.com"
修正所有 BigQuery 違規問題,並重新開始複製資料集
如要修正輸出違規問題,我們需要建立輸出規則,允許遭拒絕的使用者主體。遭拒的主體是執行 mk
指令的主體。
出口規則生效後,請在範圍 perimeter-2
上執行相同指令來複製資料集。這次應該可以成功複製資料集,且不會違反 VPC Service Controls。
7. 清理
雖然在未使用服務時使用 VPC Service Controls 無須另外付費,但建議您清理本實驗室中使用的設定。您也可以刪除 VM 執行個體和/或 Cloud 專案,以免發生費用。刪除 Cloud 專案後,系統就會停止對專案使用的所有資源收取費用。
- 如要刪除 Cloud Storage 值區,請完成下列步驟:
- 如要刪除 BigQuery 資料集,請完成下列步驟:
- 如要刪除服務範圍,請完成下列步驟:
- 在 Google Cloud 控制台中,依序選取「Security」和「VPC Service Controls」,然後選取存取權政策的範圍層級,在本例中為資料夾層級。
- 在「VPC Service Controls」頁面中,找出您要刪除的範圍,然後在相對應的資料表列中選取
Delete Icon
。
- 如要刪除存取層級,請完成下列步驟:
- 在 Google Cloud 控制台中,開啟「Access Context Manager」頁面,並設為「資料夾」範圍。
- 在表格中找出要刪除的存取層級所在的資料列,然後選取「三點圖示選單」,再選取「刪除」。
- 如要關閉專案,請完成下列步驟:
- 在 Google Cloud 控制台中,前往要刪除的專案的「IAM & Admin Settings」頁面。
- 在「IAM & Admin Settings」(IAM 與管理設定) 頁面上,選取「Shutdown」(關機)。
- 輸入專案 ID,然後選取「仍要關閉」。
8. 恭喜!
在本程式碼研究室中,您建立了 VPC Service Controls 範圍、強制執行範圍,並對其進行疑難排解。
瞭解詳情
您也可以探索下列情境:
- 在其他範圍中新增
project-1
,同時保護 BigQuery、BigQuery 資料移轉服務和 Cloud Storage。 - 從其他支援的來源執行 BigQuery 資料移轉作業。
- 根據其他屬性 (例如位置或裝置政策) 限制使用者存取權。
授權
這項內容採用的授權為 Creative Commons 姓名標示 2.0 通用授權。