將 VPC Service Controls 與聯合目錄端點搭配使用

在 Lakehouse 執行階段目錄中,VPC Service Controls 針對聯合目錄端點設定的 perimeter 規則,可讓您在 BigQuery 中查詢外部 Apache Iceberg 資料表,同時協助防止資料竊取。如果Google Cloud 專案或 Cloud Storage bucket 位於 service perimeter 內,您可以為 Amazon S3 和 Microsoft Azure Data Lake Storage (ADLS) Gen2 設定輸出規則,或為 Cloud Storage 設定輸入規則。這些規則會授權背景中繼資料重新整理,以及查詢在 AWS Glue Data Catalog、Databricks Unity Catalog、Snowflake Horizon Catalog 和 Workday 資料湖泊中註冊的資料表。

如果專案不在 service perimeter 內,則不需設定 VPC Service Controls,即可使用聯合目錄端點。如要瞭解如何跨雲端連線至 SAP Business Data Cloud (SAP BDC),請參閱「SAP BDC 的 VPC Service Controls 設定」。如要保護在憑證販售模式下,透過 Apache Iceberg REST 目錄端點存取的 bucket,請參閱「搭配使用 VPC Service Controls 與憑證販售」。

事前準備

  1. 為 AWS Glue Data Catalog、Databricks Unity Catalog、Snowflake Horizon Catalog 或 Workday 資料湖泊 設定聯合目錄端點。
  2. 視資料表檔案的儲存位置,為專案建立一或多個 service perimeter:

    • 外部雲端儲存空間 (Amazon S3 或 ADLS Gen2):使用 perimeter 限制 biglake.googleapis.com 和 bigquery.googleapis.com,保護聯合目錄端點專案。如需必要的輸出規則,請參閱「為外部雲端儲存空間新增輸出規則」。
    • Cloud Storage:使用限制 storage.googleapis.com 的 perimeter 保護 Cloud Storage bucket 專案。bucket 專案和聯合目錄端點專案可以共用單一 perimeter,也可以位於不同的 perimeter。如需必要的輸入規則,請參閱「為 service perimeter 中的 Cloud Storage bucket 新增輸入規則」。
  3. 如果 perimeter 外部的使用者或服務帳戶查詢聯合目錄端點,請新增輸入規則,允許他們進入目錄端點專案的 perimeter。

必要的角色

如要取得設定 service perimeter 所需的權限,請要求管理員在組織中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

用途和必要 perimeter 規則

您設定的 perimeter 規則取決於資料表檔案的所在位置,以及查詢呼叫端的執行位置:

用途 必要 perimeter 規則 設定步驟
查詢 Amazon S3 或 ADLS Gen2 中的跨雲端資料表:透過受保護 BigQuery 專案中的聯合目錄端點,查詢 s3:// bucket 或 abfss:// 容器中的 Apache Iceberg 資料表,同時封鎖未經授權的外部輸出。 在目錄端點專案的 perimeter 新增輸出規則,允許目錄端點的 blirc-... 服務帳戶和查詢主體讀取核准的外部 bucket 或容器。 找出目錄端點的服務帳戶,然後新增外部雲端儲存空間的輸出規則。
存取受保護 Cloud Storage bucket 中的外部目錄資料表:查詢儲存在 gs:// bucket 中的 Databricks Unity Catalog 或 Snowflake Horizon Catalog 資料表,該 bucket 位於限制 storage.googleapis.com 的 perimeter 內 (即使與聯合目錄端點位於相同專案和 perimeter 內)。 在 Cloud Storage bucket 專案的 perimeter 新增輸入規則,允許遠端目錄的 Google Cloud 服務帳戶存取storage.googleapis.com。 為 service perimeter 中的 Cloud Storage bucket 新增輸入規則。
允許來自目錄端點 perimeter 外部呼叫者的查詢:從位於 perimeter 外部的分析師帳戶、BI 工具或工作負載服務帳戶,在目錄端點專案中執行 BigQuery 工作。 在目錄端點專案的 perimeter 新增輸入規則,允許外部呼叫端存取 bigquery.googleapis.com 和 biglake.googleapis.com,並為資料表位置新增儲存空間規則。 請參閱輸入規則參考資料,設定呼叫端輸入,然後按照資料表位置的儲存程序操作。

VPC Service Controls 如何評估聯合目錄端點流量

聯合目錄端點會執行兩項不同的作業,從基礎儲存空間讀取資料:背景中繼資料重新整理和 BigQuery 查詢。VPC Service Controls 評估這些作業的方式,取決於資料表檔案的儲存位置:

  • 外部雲端儲存空間 (Amazon S3 或 Azure Data Lake Storage Gen2):VPC Service Controls 會根據Google Cloud 上的呼叫端身分,以及目標外部 bucket 或容器,評估目錄端點專案 service perimeter 的輸出:

    作業 已評估身分 評估的資源
    背景中繼資料重新整理 目錄端點自動佈建的 Lakehouse 服務帳戶 (blirc-PROJECT_NUMBER-ID@gcp-sa-biglakerestcatalog.iam.gserviceaccount.com) 存放資料表 Apache Iceberg 中繼資料的外部 bucket 或容器
    查詢 執行 BigQuery 工作的服務帳戶或使用者 存放資料表中繼資料和資料檔案的外部 bucket 或容器

    如果資料表儲存在 Amazon S3 或 ADLS Gen2,perimeter 的輸出規則必須包含下列所有項目:

    • 身分:目錄端點的服務帳戶和查詢主體。
    • 外部資源:資料表用於中繼資料和資料檔案的所有 bucket 或容器。
    • 作業:bigquery.googleapis.com (具有 externalResource.read 權限) 和 biglake.googleapis.com (具有所有方法,'*')。
  • Cloud Storage ( Google Cloud上的 Databricks Unity Catalog 或 Snowflake Horizon Catalog 外部位置):在背景中繼資料重新整理和 BigQuery 查詢期間,BigQuery 和 Lakehouse 會使用遠端目錄提供的縮減範圍憑證,而非目錄端點的 blirc-... 服務帳戶,從 Cloud Storage 讀取資料。如果 Cloud Storage bucket 專案位於限制 storage.googleapis.com 的 service perimeter 內,storage.googleapis.com 會將遠端目錄的 Google Cloud 服務帳戶視為嘗試進入 perimeter 的外部身分。即使 bucket 與聯合目錄端點位於相同專案和 service perimeter,這項評估仍適用。您必須在 bucket 專案的 service perimeter 新增輸入規則,允許遠端目錄的Google Cloud 服務帳戶存取storage.googleapis.com。

VPC Service Controls 只會評估 BigQuery 和 Lakehouse (biglake.googleapis.com) 執行的儲存空間讀取作業。不會評估 Lakehouse 對遠端目錄 API 端點發出的呼叫 (例如列出命名空間和資料表),也不會控管直接讀取儲存空間的外部查詢引擎。

外部資源格式

在輸出規則中,將外部資源指定為確切的值區或容器 URI。不支援物件路徑和萬用字元。值區、容器和儲存體帳戶名稱必須為小寫;如果這些名稱包含大寫字元,儲存規則時會遭到拒絕。在 VPC Service Controls 輸出規則中,Azure 資料湖泊 Storage Gen2 (abfss://) 和 Azure Blob 儲存體 (azure://) URI 不可互換;如果是聯合目錄端點,則必須指定 abfss:// 格式。

下表列出聯合目錄端點支援的外部資源 URI 格式:

儲存服務 格式 範例
Amazon S3 s3://BUCKET_NAME s3://my-iceberg-warehouse
Azure Data Lake Storage Gen2 abfss://CONTAINER@STORAGE_ACCOUNT.dfs.core.windows.net abfss://unity-catalog-storage@mystorageaccount.dfs.core.windows.net

找出目錄端點的服務帳戶

建立目錄端點時,Lakehouse 會為每個聯合目錄端點佈建專屬服務帳戶。如果是 Cloud Storage 中的資料表,請跳至「為 service perimeter 中的 Cloud Storage bucket 新增輸入規則」。如果資料表儲存在 Amazon S3 或 ADLS Gen2,請擷取這個服務帳戶電子郵件地址,用於輸出規則:

gcloud biglake iceberg catalogs describe CATALOG_ID \
    --project=PROJECT_ID \
    --format='value(biglake-service-account)'

更改下列內容:

  • CATALOG_ID:聯合目錄端點的 ID。
  • PROJECT_ID:包含聯合目錄端點的 Google Cloud專案 ID。

指令會傳回以下格式的電子郵件地址:

blirc-PROJECT_NUMBER-ID@gcp-sa-biglakerestcatalog.iam.gserviceaccount.com

新增外部雲端儲存空間的輸出規則

如果透過聯合目錄端點存取的資料表儲存在 Amazon S3 或 ADLS Gen2,請在保護目錄端點專案的 service perimeter 新增輸出規則。

控制台

  1. 前往 Google Cloud 控制台的「VPC Service Controls」頁面。

    前往「VPC Service Controls」頁面

  2. 選取組織和存取權政策,然後按一下包含目錄端點專案的 service perimeter 名稱。

  3. 按一下「Edit」(編輯),然後在「Egress policy」(輸出政策) 區段中,按一下「Add an egress rule」(新增輸出規則)。

  4. 在「From」(來源) 部分的「Identities」(身分) 下方,選取「Select identities & groups」(選取身分和群組),然後按一下「Add identities」(新增身分),新增目錄端點的服務帳戶,以及執行查詢的使用者或服務帳戶。

  5. 在「To」(收件者) 部分:

    1. 選取「External resources」(外部資源),按一下「Add resources」(新增資源),輸入資料表使用的每個 s3:// bucket 或 abfss:// 容器,然後按一下「Add external resources」(新增外部資源)。
    2. 在「Operations or IAM roles」(作業或 IAM 角色) 下方,在「API operations」(API 作業) 表格中設定下列服務:
      • BigQuery API (bigquery.googleapis.com):如要將預設的所有方法 (*) 項目限制為唯讀存取權,請開啟 bigquery.googleapis.com 的動作選單,然後依序點選「Edit」(編輯)、「Select methods」(選取方法)、externalResource.read 權限和「Add selected methods」(新增所選方法)。
      • BigLake API (biglake.googleapis.com):按一下「Add operations」(新增作業),選取「BigLake API」(biglake.googleapis.com),然後選取「All methods」(所有方法),再按一下「Add all methods」(新增所有方法)。
  6. 按一下「儲存」。

gcloud CLI

  1. 建立名為 egress.yaml 的檔案,指定目錄端點的服務帳戶、查詢主體,以及資料表使用的每個外部 bucket 或容器。如需完整結構定義,請參閱輸出規則參考資料。

    - egressFrom:
        identities:
        - serviceAccount:CATALOG_ENDPOINT_SERVICE_ACCOUNT
        - user:QUERY_USER_EMAIL
      egressTo:
        externalResources:
        - s3://S3_BUCKET_NAME
        - abfss://ADLS_CONTAINER@STORAGE_ACCOUNT.dfs.core.windows.net
        operations:
        - serviceName: bigquery.googleapis.com
          methodSelectors:
          - permission: externalResource.read
        - serviceName: biglake.googleapis.com
          methodSelectors:
          - method: '*'
    

    更改下列內容:

    • CATALOG_ENDPOINT_SERVICE_ACCOUNT:您先前擷取的目錄端點服務帳戶電子郵件地址。
    • QUERY_USER_EMAIL:使用者或服務帳戶的電子郵件地址,用於透過聯合目錄端點執行查詢。如果是服務帳戶,請使用 serviceAccount: 前置字元,而非 user:。或者,您也可以將 identities 替換為 identityType: ANY_IDENTITY,允許 perimeter 中的任何主體。
    • S3_BUCKET_NAME、ADLS_CONTAINER 和 STORAGE_ACCOUNT:保存資料表中繼資料和資料檔案的外部儲存空間位置。請只加入適用於儲存空間供應商的項目。
  2. 找出組織存取權政策的數字 ID:

    gcloud access-context-manager policies list \
        --organization=ORGANIZATION_ID \
        --format='value(name)'
    

    將 ORGANIZATION_ID 替換為數字組織 ID。

  3. 將輸出規則套用至 service perimeter:

    gcloud access-context-manager perimeters update PERIMETER_NAME \
        --policy=POLICY_ID \
        --set-egress-policies=egress.yaml
    

    更改下列內容:

    • PERIMETER_NAME:service perimeter 的名稱。
    • POLICY_ID:存取權政策的數字 ID。

    如要在強制執行規則前測試規則,請使用 gcloud access-context-manager perimeters dry-run update 將規則套用至模擬測試設定,並在使用 gcloud access-context-manager perimeters dry-run enforce 驗證後強制執行。

  4. 確認規則已啟用:

    gcloud access-context-manager perimeters describe PERIMETER_NAME \
        --policy=POLICY_ID \
        --format='yaml(status.egressPolicies)'
    

在 service perimeter 中為 Cloud Storage bucket 新增輸入規則

如果遠端目錄 (例如 Databricks Unity Catalog 或 Snowflake Horizon Catalog) 中的資料表儲存在 Cloud Storage bucket,且該 bucket 受到限制 storage.googleapis.com 的 perimeter 保護,請在 bucket 專案的 service perimeter 新增輸入規則。BigQuery 和 Lakehouse 會使用遠端目錄的 Google Cloud 服務帳戶 (而非blirc-...服務帳戶) 向 Cloud Storage 進行驗證,因此即使 bucket 與聯合目錄端點位於相同專案和 perimeter,仍須遵守這項規則。

控制台

  1. 前往 Google Cloud 控制台的「VPC Service Controls」頁面。

    前往「VPC Service Controls」頁面

  2. 選取組織和存取權政策,然後按一下保護專案 (含有 Cloud Storage bucket) 的 service perimeter 名稱。

  3. 按一下「Edit」(編輯),然後在「Ingress policy」(輸入政策) 區段中,按一下「Add an ingress rule」(新增輸入規則)。

  4. 在「From」(來源) 部分:

    1. 在「Identities」(身分) 下方,選取「Select identities & groups」(選取身分和群組),按一下「Add identities」(新增身分),然後新增遠端目錄為 Cloud Storage bucket 佈建的 Google Cloud 服務帳戶。
    2. 在「Sources」(來源) 下方,選取「All sources」(所有來源) (或選取「Select sources」(選取來源) 指定存取層級)。
  5. 在「To」(收件者) 部分:

    1. 在「資源」下方,選取「選取資源」。在「Projects」(專案) 分頁中,按一下「Add projects」(新增專案),選取 Cloud Storage bucket 所在的專案,然後按一下「Add selected projects」(新增所選專案)。
    2. 在「Operations or IAM roles」(作業或 IAM 角色) 下方,選取「Select operations」(選取作業),按一下「Add operations」(新增作業),選取「Cloud Storage API」(storage.googleapis.com),選取「All methods」(所有方法),然後按一下「Add all methods」(新增所有方法)。或者,選取「Select methods」(選取方法),選擇特定的支援服務方法 (例如 google.storage.objects.get、google.storage.objects.list 和 google.storage.buckets.get),然後按一下「Add selected methods」(新增所選方法)。
  6. 按一下「儲存」。

gcloud CLI

  1. 建立名為 ingress.yaml 的檔案,允許遠端目錄的Google Cloud 服務帳戶存取 bucket 專案中的 storage.googleapis.com。如需完整結構定義,請參閱輸入規則參考資料。

    - ingressFrom:
        identities:
        - serviceAccount:REMOTE_CATALOG_GCS_SERVICE_ACCOUNT
        sources:
        - accessLevel: '*'
      ingressTo:
        operations:
        - serviceName: storage.googleapis.com
          methodSelectors:
          - method: '*'
        resources:
        - projects/BUCKET_PROJECT_NUMBER
    

    更改下列內容:

    • REMOTE_CATALOG_GCS_SERVICE_ACCOUNT:遠端目錄佈建的Google Cloud 服務帳戶電子郵件地址,用於存取 Cloud Storage bucket (例如 Databricks Unity Catalog 中的 DESCRIBE STORAGE CREDENTIAL,或 Snowflake Horizon Catalog 中的 DESC EXTERNAL VOLUME)。
    • BUCKET_PROJECT_NUMBER:Cloud Storage bucket 所在專案的數字編號。
  2. 找出組織存取權政策的數字 ID:

    gcloud access-context-manager policies list \
        --organization=ORGANIZATION_ID \
        --format='value(name)'
    

    將 ORGANIZATION_ID 替換為數字組織 ID。

  3. 將輸入規則套用至保護 bucket 專案的 service perimeter:

    gcloud access-context-manager perimeters update BUCKET_PERIMETER_NAME \
        --policy=POLICY_ID \
        --set-ingress-policies=ingress.yaml
    

    更改下列內容:

    • BUCKET_PERIMETER_NAME:保護 bucket 專案的 service perimeter 名稱。
    • POLICY_ID:存取權政策的數字 ID。

    如要在強制執行規則前測試規則,請使用 gcloud access-context-manager perimeters dry-run update 將規則套用至模擬測試設定,並在使用 gcloud access-context-manager perimeters dry-run enforce 驗證後強制執行。

  4. 確認規則已啟用:

    gcloud access-context-manager perimeters describe BUCKET_PERIMETER_NAME \
        --policy=POLICY_ID \
        --format='yaml(status.ingressPolicies)'
    

驗證設定

service perimeter 政策更新最多可能需要 30 分鐘才會生效。規則生效後,請確認背景中繼資料重新整理和 BigQuery 查詢作業完成,且未遭到 VPC Service Controls 拒絕:

  1. 等待下一個排定的背景中繼資料重新整理週期完成,然後在 Cloud 稽核記錄中查看政策遭拒稽核記錄,確認沒有發生 VPC Service Controls 違規。背景中繼資料重新整理作業會按照排程自動執行,無法手動觸發。

    在 Logs Explorer 中,選取受保護的專案,也就是外部 Cloud Storage 的目錄端點專案,或 Cloud Storage 資料表的 Cloud Storage bucket 專案。詳情請參閱「從稽核記錄擷取 VPC Service Controls 錯誤」。執行以下查詢:

    log_id("cloudaudit.googleapis.com/policy")
    protoPayload.metadata.@type:"type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
    

    如果規則生效後出現違規項目,請檢查記錄項目中的 egressViolations.targetResource、ingressViolations.targetResource 和 authenticationInfo.principalEmail 欄位,確認這些欄位與規則中的資源和身分相符。如果新資料表無法同步,且未顯示任何 VpcServiceControlAuditMetadata 項目,請檢查遠端目錄權限和憑證,詳情請參閱「排解跨雲端資料存取問題」。

  2. 使用四部分 P.C.N.T (Project.Catalog.Namespace.Table) 命名慣例,對 BigQuery 中的資料表執行測試查詢:

    SELECT COUNT(*)
    FROM `PROJECT_ID.CATALOG_ID.NAMESPACE.TABLE_NAME`;
    

    更改下列內容:

    • PROJECT_ID:包含聯合目錄端點的 Google Cloud專案 ID。
    • CATALOG_ID:聯合目錄端點的 ID。
    • NAMESPACE:聯合目錄端點中的命名空間。
    • TABLE_NAME:命名空間中的資料表名稱。

    如果查詢遭到 VPC Service Controls 封鎖,錯誤訊息會包含 vpcServiceControlsUniqueIdentifier 值。在 Logs Explorer 中,比對 protoPayload.metadata.vpcServiceControlsUniqueId 與該 ID,篩選政策遭拒稽核記錄:

    log_id("cloudaudit.googleapis.com/policy")
    protoPayload.metadata.@type:"type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
    protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_IDENTIFIER"
    

    將 UNIQUE_IDENTIFIER 替換為錯誤訊息中的 vpcServiceControlsUniqueIdentifier 值。

後續步驟