VPC Service Controls - BigQuery Data Transfer Service Protection

1. 簡介

在本實驗室中,我們將學習如何使用 VPC 服務控管,在將資料從 Cloud Storage 轉移至 BigQuery 資料集時,保護 BigQuery 資料移轉服務。接著,我們會保護 Cloud Storage,並重複上述程序,將資料從 Cloud Storage 轉移至 BigQuery。Cloud Storage 的保護措施會導致 VPC Service Controls 違規,因此必須修正才能成功轉移。最後,我們也會保護 BigQuery,然後嘗試在專案之間複製資料集,這也會導致違規行為,需要進行修正。

在本研究室中,我們將分別使用輸入和輸出規則來修正輸入和輸出違規問題。我們也會使用存取層級來修正 BigQuery 資料移轉入口違規問題。本程式碼研究室的目標如下:

  • 瞭解如何分別針對不同服務 (特別是 Cloud Storage、BigQuery 和 BigQuery 資料移轉服務) 使用入站和出站規則,修正入站和出站違規問題。
  • 瞭解特定違規行為的發生原因。

2. 資源設定和需求

事前準備

在本程式碼研究室中,我們假設您已瞭解:

設定

我們的初始設定如下:

程式碼研究室初始設定圖表

建立範圍政策和一般服務範圍

在本程式碼研究室中,我們會使用一般服務範圍來保護 project-2

在範圍 perimeter-2 中,限制 BigQuery Data Transfer API

保護資料移轉服務的 VPC SC 設定。

建立 Cloud Storage bucket 和 BigQuery 資料集

本程式碼研究室的目的在於讓您瞭解如何使用 CSV 檔案,因此任何 CSV 檔案都行,不論內容為何。主要限制與並置需求有關,這項規定會強制執行以下規定:

  • 如果您的 BigQuery 資料集位於多地區,含有要轉移資料的 Cloud Storage 值區必須位於相同的多地區,或是位於多地區內的某個位置
  • 如果資料集位於某個地區,Cloud Storage 值區就必須位於相同的地區。

從現在開始,我們會確保本程式碼研究室的 Cloud Storage 值區和 BigQuery 資料集位於相同地區或多地區。

在專案 project-1 中建立新的 Cloud Storage 值區

如要建立新的 Cloud Storage 值區,請按照建立新的值區的說明步驟操作。

  • 請輸入符合值區命名規定的值區名稱。在本程式碼研究室中,我們會將儲存體命名為 codelab-bqtransfer-bucket
  • 針對資料儲存位置 (值區位置),請選取位置類型位置,以便永久儲存值區資料。在本程式碼研究室中,我們會使用「美國 (多個美國區域)」

Cloud Storage 建立設定。

建立 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

執行 cp 指令,將 CSV 檔案上傳至 Cloud Storage。

您可以列出值區中的物件,或執行下列指令,確認檔案是否已上傳至已建立的值區:

gcloud storage ls --recursive gs://codelab-bqtransfer-bucket/**

project-2 中建立 BigQuery 資料集和資料表

  1. 按照這些步驟,在專案 project-2 中建立 BigQuery 資料集。
    1. 針對「Dataset ID」(資料集 ID),輸入唯一的資料集名稱。在本程式碼研究室中,我們使用的是 codelab_bqtransfer_dataset
    2. 針對「Location type」(位置類型),選擇資料集的地理位置。在本程式講義中,我們使用與 Cloud Storage 值區相同的位置:美國 (多個美國地區)建立 BigQuery 資料集。
  2. 按照這些步驟,在已建立的資料集 codelab_bqtransfer_dataset 下方建立 BigQuery 資料表。
    1. 在「Source」部分,選取「Create table from」清單中的「Empty table」
    2. 在「Table」(資料表) 欄位中,輸入要建立的資料表名稱。在本程式碼研究室中,我們使用名稱:codelab-bqtransfer-table
    3. 確認「Table type」欄位已設為「Native table」
    4. 在「Schema」(結構定義) 部分輸入結構定義。您可以按一下「以文字形式編輯」,然後輸入符合建立的 CSV 檔案格式的下列結構定義,即可輸入結構定義資訊。
    [{
    "name": "name",
    "type": "STRING",
    "mode": "NULLABLE",
    "description": "The name"
    },
    {
    "name": "age",
    "type": "INTEGER",
    "mode": "NULLABLE",
    "description": "The age"
    }]
    

費用

您必須在專案 project-2project-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 移轉資料

如要建立資料移轉作業,請按照下列步驟操作:

  1. 前往 project-2Google Cloud 控制台中的 BigQuery 頁面
  2. 按一下「資料移轉」

在「Data Transfer Service」頁面上違反 VPC SC。

調查存取「資料移轉」頁面時的違規情形

我們可以在 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 移轉資料

在前述步驟中,點選「資料轉移」後,請繼續執行以下步驟:

  1. 按一下「+ 建立移轉作業」
  2. 在「Source type」(來源類型) 專區中,針對「Source」(來源),選擇「Google Cloud Storage」
  3. 在「Transfer config name」(轉移設定名稱) 區段中,針對「Display name」(顯示名稱) 輸入移轉作業的名稱,例如 Codelab Transfer
  4. 在「Schedule options」(排程選項) 專區:
    1. 選取「重複執行頻率」,例如 15 分鐘。
    2. 請務必選取「立即開始」,否則資料移轉作業會在設定的重複執行頻率後才開始
  5. 在「Destination settings」(目的地設定) 專區中,針對「Destination dataset」(目的地資料集),選擇您建立來儲存資料的資料集:codelab_bqtransfer_dataset
  6. 在「資料來源詳細資料」專區中
    1. 在「Destination table」(目的地資料表) 中輸入目的地資料表的名稱。目標資料表必須遵循資料表命名規則。在本程式碼研究室中,我們會使用先前建立的資料表:codelab-bqtransfer-table
    2. 在「Cloud Storage URI」部分,輸入 Cloud Storage URI。在本程式碼研究室中,我們會使用已建立的儲存桶和檔案:codelab-bqtransfer-bucket/codelab-test-file.csv
    3. 針對「Write preference」(寫入偏好設定),請保留 APPEND (或選擇 MIRROR)。
    4. 請勿選取在轉移後刪除檔案 (因為我們會重複使用相同的檔案。不過,您可以使用多個檔案,並在轉移後刪除來源檔案)
    5. 在「File format」(檔案格式) 部分,選取「CSV」
    6. 在「Transfer Options」中,點選「CSV」,然後輸入半形逗號 (「,」) 做為「Field delimiter」
  7. 在「Service Account」(服務帳戶) 選單中,選取與 Google Cloud 專案相關聯的服務帳戶
    1. 所選服務帳戶必須具備所需權限,才能在代管儲存值區的專案中使用 Cloud Storage;請參閱本程式講義中的 project-1
    2. 在本程式碼研究室中,我們會使用在 project-2 中建立的服務帳戶做為 codelab-sa@project-2.iam.gserviceaccount.com
  8. 按一下 [儲存]

由於我們選取「立即開始」做為排程選項,因此選取「儲存」後,系統就會開始進行第一次轉移。

驗證資料移轉服務狀態

如要確認已設定資料移轉作業的狀態,請按照下列步驟操作:

資料移轉服務工作。

按一下「顯示名稱」下方的 Codelab Transfer,系統就會列出目前執行過的所有執行作業。

資料移轉服務執行作業的詳細資料。

資料轉移作業應能順利執行,且無論是手動觸發的資料轉移作業,還是排定的資料轉移作業,都不會違反 VPC Service Controls。請注意,只有手動觸發的轉移作業需要入站規則,才能允許存取手動啟動的轉移作業主體。

4. 手動觸發資料移轉作業的 IP 位址限制

目前設定的入站規則允許已設定的 ID 從任何 IP 位址手動觸發資料移轉。

透過存取層級,VPC Service Controls 可根據特定 API 要求的屬性限制允許的存取權,特別是:

  • IP 子網路:檢查要求是否來自特定 IP 位址。
  • 區域:檢查要求是否來自特定區域,這會根據 IP 位址的地理位置判斷。
  • 原則:檢查要求是否來自特定帳戶。
  • 裝置政策:檢查要求是否來自符合特定需求的裝置。

如要強制驗證這些屬性,並搭配已設定的入站規則,我們必須建立存取層級,允許所需屬性,然後在入站規則中將建立的存取層級新增為來源。

根據使用者 IP 位址,由 VPC SC 保護的存取權 此圖表顯示兩個主要實體 (user@example.comuser2@example.com) 在三種情境下啟動的存取權,說明 VPC Service Controls 如何評估來源 (入站存取權層級) 和身分屬性屬性,並以 AND 條件 (兩者必須相符) 進行評估。

  1. 當使用者 user@example.com 嘗試從存取層級允許的 IP 位址存取時,系統會允許存取,因為該使用者的 IP 位址和使用者帳戶與入站規則中的設定相符。
  2. 當使用者 user@example.com 的 IP 位址不符於允許的 IP 位址時,系統會封鎖該使用者的存取權,即使該使用者的帳戶是輸入規則中設定的帳戶。
  3. 使用者 user2@example.com 嘗試從允許的 IP 位址存取資料,但因帳戶不符合入站規則而遭到封鎖

建立存取層級

如要建立以 IP 位址限制存取權的存取層級,請按照下列步驟操作:

  1. 在 Google Cloud 控制台中開啟「Access Context Manager」頁面。
    • 系統顯示提示時,請選取資料夾 codelab-folder
  2. 按一下「Access Context Manager」頁面頂端的「CREATE ACCESS LEVEL」
  3. 在「New Access Level」(建立新的存取層級) 窗格中,為新的存取層級指定「Title」(標題)。在本程式碼研究室中,我們會將其稱為 project_2_al
  4. 在「條件」部分,按一下「IP 子網路」前方的「+」
  5. 在「IP Subnetworks」(IP 子網路) 方塊中,選取「Public IP」(公開 IP)

在 ingress 規則中新增存取層級

在輸入規則中,存取層級會在 sources 欄位下參照,這是 輸入規則參照 中所述的必要欄位。為了允許資源的入站存取,VPC Service Controls 會將 sourcesidentityType 屬性視為 AND 條件。入站規則會使用手動觸發資料移轉的使用者身分,而不是資料移轉設定中指定的服務帳戶。

使用存取層級設定的 Ingress 規則。

重新執行轉移作業,並使用限制 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 位址。

來自未允許 IP 位址的 VPC SC 違規。

系統偵測到 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 APIBigQuery Data Transfer API 新增為受限制服務。

保護 Cloud Storage 的 VPC SC 設定。

保護 Cloud Storage API 後,請等待下次排定資料移轉作業,或按照下列步驟手動觸發移轉作業

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。
  2. 按一下「資料移轉」
  3. 從清單中選取轉移作業:在本程式碼研究室中,我們使用的是「Codelab Transfer」轉移作業
  4. 按一下「立即執行移轉作業」
  5. 按一下「確定」

系統會啟動另一次轉移作業。您可能需要重新整理頁面,才能看到這項資訊。這次的轉移作業會因違反 VPC Service Controls 而失敗。

複製 BigQuery 資料集時違反 VPC SC。

調查 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 物件的專案。

允許 codelab 服務帳戶的傳出規則。

修改服務範圍 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 服務。

已設定 VPC SC 來保護 Cloud Storage API。

開始複製資料集

如要複製資料集,請執行下列 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-2project-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 指令的主體。

允許存取所有 BigQuery 方法的傳出規則。

出口規則生效後,請在範圍 perimeter-2 上執行相同指令來複製資料集。這次應該可以成功複製資料集,且不會違反 VPC Service Controls。

7. 清理

雖然在未使用服務時使用 VPC Service Controls 無須另外付費,但建議您清理本實驗室中使用的設定。您也可以刪除 VM 執行個體和/或 Cloud 專案,以免發生費用。刪除 Cloud 專案後,系統就會停止對專案使用的所有資源收取費用。

  • 如要刪除 Cloud Storage 值區,請完成下列步驟:
    • 前往 Google Cloud 控制台中的「Cloud Storage Buckets」(Cloud Storage 值區) 頁面
    • 勾選要刪除的值區核取方塊,然後按一下「刪除」
    • 在出現的重疊視窗中,確認您要刪除的值區及內容。刪除 Cloud Storage 值區。
  • 如要刪除 BigQuery 資料集,請完成下列步驟:
    • 前往 Google Cloud 控制台的「BigQuery」頁面。
    • 在「Explorer」窗格中展開專案,然後選取資料集。
    • 展開三點圖示選單,然後點選「刪除」
    • 在「Delete dataset」對話方塊中,在欄位中輸入 delete,然後按一下「Delete」刪除 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 通用授權。