Lakehouse 런타임 카탈로그에서 페더레이션 카탈로그 엔드포인트의 VPC 서비스 제어 경계 규칙을 사용하면 BigQuery에서 외부 Apache Iceberg 테이블을 쿼리하면서 데이터 무단 반출을 방지할 수 있습니다.Google Cloud 프로젝트 또는 Cloud Storage 버킷이 서비스 경계 내에 있는 경우 Amazon S3 및 Microsoft Azure Data Lake Storage (ADLS) Gen2에 대한 이그레스 규칙 또는 Cloud Storage에 대한 인그레스 규칙을 구성할 수 있습니다. 이러한 규칙은 AWS Glue Data Catalog, Databricks Unity Catalog, Snowflake Horizon Catalog, Workday 데이터 레이크에 등록된 테이블에 대한 메타데이터 동기화 및 쿼리를 승인합니다.
프로젝트가 서비스 경계 내에 있지 않으면 페더레이션 카탈로그 엔드포인트가 VPC 서비스 제어 구성 없이 작동합니다. SAP Business Data Cloud (SAP BDC)에 대한 크로스 클라우드 연결은 SAP BDC의 VPC 서비스 제어 구성을 참조하세요. 사용자 인증 정보 자동 판매 모드에서 Apache Iceberg REST 카탈로그 엔드포인트를 통해 액세스하는 버킷을 보호하려면 사용자 인증 정보 자동 판매와 함께 VPC 서비스 제어 사용을 참조하세요.
시작하기 전에
- AWS Glue Data Catalog, Databricks Unity Catalog, Snowflake Horizon Catalog 또는 Workday 데이터 레이크의 페더레이션 카탈로그 엔드포인트를 설정합니다.
테이블 파일이 저장된 위치에 따라 프로젝트에 하나 이상의 서비스 경계를 만듭니다.
- 외부 클라우드 스토리지 (Amazon S3 또는 ADLS Gen2):
biglake.googleapis.com및bigquery.googleapis.com를 제한하는 경계로 페더레이션 카탈로그 엔드포인트 프로젝트를 보호합니다. 필수 이그레스 규칙은 외부 클라우드 스토리지에 이그레스 규칙 추가를 참조하세요. - Cloud Storage:
storage.googleapis.com를 제한하는 경계로 Cloud Storage 버킷 프로젝트를 보호합니다. 버킷 프로젝트와 페더레이션 카탈로그 엔드포인트 프로젝트는 단일 경계를 공유하거나 별도의 경계에 상주할 수 있습니다. 필수 인그레스 규칙은 서비스 경계에서 Cloud Storage 버킷에 대한 인그레스 규칙 추가를 참조하세요.
- 외부 클라우드 스토리지 (Amazon S3 또는 ADLS Gen2):
경계 외부의 사용자 또는 서비스 계정이 페더레이션 카탈로그 엔드포인트를 쿼리하는 경우 카탈로그 엔드포인트 프로젝트의 경계에 허용하는 인그레스 규칙을 추가합니다.
필요한 역할
서비스 경계를 구성하는 데 필요한 권한을 얻으려면 관리자에게 조직에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.
-
서비스 경계 및 인그레스 또는 이그레스 정책 구성: Access Context Manager 편집자 (
roles/accesscontextmanager.policyEditor)
역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.
커스텀 역할이나 다른 사전 정의된 역할을 통해 필요한 권한을 얻을 수도 있습니다.
사용 사례 및 필수 경계 규칙
구성하는 경계 규칙은 테이블 파일이 있는 위치와 쿼리 호출자가 실행되는 위치에 따라 달라집니다.
| 사용 사례 | 필수 경계 규칙 | 구성 단계 |
|---|---|---|
Amazon S3 또는 ADLS Gen2의 크로스 클라우드 테이블 쿼리: 승인되지 않은 외부 이그레스를 차단하면서 보호된 BigQuery 프로젝트의 페더레이션 카탈로그 엔드포인트를 통해 s3:// 버킷 또는 abfss:// 컨테이너의 Apache Iceberg 테이블을 쿼리합니다. |
카탈로그 엔드포인트의 blirc-... 서비스 계정과 쿼리 주 구성원이 승인된 외부 버킷 또는 컨테이너를 읽을 수 있도록 카탈로그 엔드포인트 프로젝트의 경계에 이그레스 규칙을 추가합니다. |
카탈로그 엔드포인트의 서비스 계정을 찾은 다음 외부 클라우드 스토리지에 대한 이그레스 규칙을 추가합니다. |
보호된 Cloud Storage 버킷의 외부 카탈로그 테이블에 액세스: storage.googleapis.com를 제한하는 경계 내의 gs:// 버킷에 저장된 Databricks Unity Catalog 또는 Snowflake Horizon Catalog 테이블을 쿼리합니다(페더레이션 카탈로그 엔드포인트와 동일한 프로젝트 및 경계 내에 있는 경우에도 해당). |
원격 카탈로그의 Google Cloud 서비스 계정이 storage.googleapis.com에 액세스할 수 있도록 Cloud Storage 버킷 프로젝트의 경계에 인그레스 규칙을 추가합니다. |
서비스 경계의 Cloud Storage 버킷에 인그레스 규칙을 추가합니다. |
| 카탈로그 엔드포인트 경계 외부의 호출자로부터 쿼리 허용: 경계 외부에 있는 분석가 계정, BI 도구 또는 워크로드 서비스 계정에서 카탈로그 엔드포인트 프로젝트의 BigQuery 작업을 실행합니다. | 테이블 위치의 스토리지 규칙 외에도 외부 호출자를 bigquery.googleapis.com 및 biglake.googleapis.com에 허용하는 카탈로그 엔드포인트 프로젝트의 경계에 인그레스 규칙을 추가합니다. |
인그레스 규칙 참조를 사용하여 호출자 인그레스를 구성한 후 테이블 위치의 스토리지 절차를 따릅니다. |
VPC 서비스 제어가 페더레이션 카탈로그 엔드포인트 트래픽을 평가하는 방법
페더레이션 카탈로그 엔드포인트는 기본 스토리지에서 읽는 두 가지 고유한 작업인 메타데이터 동기화와 BigQuery 쿼리를 수행합니다. VPC 서비스 제어가 이러한 작업을 평가하는 방법은 테이블 파일이 저장되는 위치에 따라 다릅니다.
외부 클라우드 스토리지 (Amazon S3 또는 Azure Data Lake Storage Gen2): VPC 서비스 제어는 카탈로그 엔드포인트 프로젝트의 서비스 경계에서Google Cloud 의 호출자 ID 및 대상 외부 버킷 또는 컨테이너로의 이그레스를 평가합니다.
작업 신원 평가됨 평가된 리소스 메타데이터 동기화 카탈로그 엔드포인트의 자동 프로비저닝된 Lakehouse 서비스 계정 ( blirc-PROJECT_NUMBER-ID@gcp-sa-biglakerestcatalog.iam.gserviceaccount.com)테이블의 Apache Iceberg 메타데이터를 보관하는 외부 버킷 또는 컨테이너 쿼리 BigQuery 작업을 실행하는 사용자 또는 서비스 계정 테이블의 메타데이터 및 데이터 파일을 보관하는 외부 버킷 또는 컨테이너 Amazon S3 또는 ADLS Gen2에 저장된 테이블의 경우 경계의 이그레스 규칙에 다음이 모두 포함되어야 합니다.
- ID: 카탈로그 엔드포인트의 서비스 계정과 쿼리 주 구성원 모두
- 외부 리소스: 테이블이 메타데이터 및 데이터 파일에 사용하는 모든 버킷 또는 컨테이너입니다.
- 작업:
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 버킷 프로젝트가storage.googleapis.com를 제한하는 서비스 경계 내에 있는 경우storage.googleapis.com는 원격 카탈로그의 Google Cloud 서비스 계정을 경계 인그레스를 시도하는 외부 ID로 평가합니다. 이 평가는 버킷이 페더레이션 카탈로그 엔드포인트와 동일한 프로젝트 및 서비스 경계에 있는 경우에도 적용됩니다. 원격 카탈로그의Google Cloud 서비스 계정이storage.googleapis.com에 액세스할 수 있도록 버킷 프로젝트의 서비스 경계에 인그레스 규칙을 추가해야 합니다.
VPC 서비스 제어는 BigQuery 및 Lakehouse (biglake.googleapis.com)에서 수행하는 스토리지 읽기만 평가합니다. Lakehouse가 원격 카탈로그의 API 엔드포인트에 수행하는 호출 (예: 네임스페이스 및 테이블 나열)은 평가하지 않으며 스토리지를 직접 읽는 외부 쿼리 엔진을 제어하지 않습니다.
외부 리소스 형식
이그레스 규칙에서 외부 리소스를 정확한 버킷 또는 컨테이너 URI로 지정합니다.
객체 경로와 와일드 카드는 지원되지 않습니다. 버킷, 컨테이너, 스토리지 계정 이름은 소문자여야 합니다. 이러한 이름에 대문자가 포함된 규칙은 규칙을 저장할 때 거부됩니다. Azure Data Lake Storage Gen2 (abfss://) 및 Azure Blob Storage (azure://) URI는 VPC 서비스 제어 이그레스 규칙에서 서로 바꿔 사용할 수 없습니다. 제휴 카탈로그 엔드포인트의 경우 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의 테이블의 경우 서비스 경계의 Cloud Storage 버킷에 인그레스 규칙 추가로 건너뜁니다. 테이블이 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에 저장된 경우 카탈로그 엔드포인트 프로젝트를 보호하는 서비스 경계에 이그레스 규칙을 추가합니다.
콘솔
Google Cloud 콘솔에서 VPC 서비스 제어 페이지로 이동합니다.
조직 및 액세스 정책을 선택한 후 카탈로그 엔드포인트 프로젝트가 포함된 서비스 경계의 이름을 클릭합니다.
수정을 클릭한 후 이그레스 정책 섹션에서 이그레스 규칙 추가를 클릭합니다.
From 섹션의 ID에서 ID 및 그룹 선택을 선택하고 ID 추가를 클릭한 후 카탈로그 엔드포인트의 서비스 계정과 쿼리를 실행하는 사용자 또는 서비스 계정을 추가합니다.
받는 사람 섹션에서 다음을 수행합니다.
- 외부 리소스를 선택하고 리소스 추가를 클릭한 후 테이블에서 사용하는 각
s3://버킷 또는abfss://컨테이너를 입력하고 외부 리소스 추가를 클릭합니다. - 작업 또는 IAM 역할에서 API 작업 테이블의 다음 서비스를 구성합니다.
- BigQuery API (
bigquery.googleapis.com): 기본 모든 메서드 (*) 항목을 읽기 전용 액세스로 제한하려면bigquery.googleapis.com의 작업 메뉴를 열고 수정을 클릭하고 메서드 선택을 선택하고externalResource.read권한을 선택한 후 선택한 메서드 추가를 클릭합니다. - BigLake API (
biglake.googleapis.com): 작업 추가를 클릭하고 BigLake API (biglake.googleapis.com)를 선택하고 모든 메서드를 선택한 후 모든 메서드 추가를 클릭합니다.
- BigQuery API (
- 외부 리소스를 선택하고 리소스 추가를 클릭한 후 테이블에서 사용하는 각
저장을 클릭합니다.
gcloud CLI
카탈로그 엔드포인트의 서비스 계정, 쿼리 주 구성원, 테이블에서 사용하는 모든 외부 버킷 또는 컨테이너를 지정하는
egress.yaml파일을 만듭니다. 전체 스키마는 이그레스 규칙 참조를 확인하세요.- 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: 제휴 카탈로그 엔드포인트를 통해 쿼리를 실행하는 사용자 또는 서비스 계정의 이메일 주소입니다. 서비스 계정의 경우user:대신serviceAccount:프리픽스를 사용합니다. 또는identities를identityType: ANY_IDENTITY로 바꿔 경계의 모든 주 구성원을 허용합니다.S3_BUCKET_NAME,ADLS_CONTAINER,STORAGE_ACCOUNT: 테이블 메타데이터 및 데이터 파일을 보관하는 외부 스토리지 위치입니다. 스토리지 제공업체에 적용되는 항목만 포함합니다.
조직의 액세스 정책의 숫자 ID를 찾습니다.
gcloud access-context-manager policies list \ --organization=ORGANIZATION_ID \ --format='value(name)'ORGANIZATION_ID를 숫자 조직 ID로 바꿉니다.서비스 경계에 이그레스 규칙을 적용합니다.
gcloud access-context-manager perimeters update PERIMETER_NAME \ --policy=POLICY_ID \ --set-egress-policies=egress.yaml다음을 바꿉니다.
PERIMETER_NAME: 서비스 경계의 이름입니다.POLICY_ID: 액세스 정책의 숫자 ID입니다.
규칙을 시행하기 전에 테스트하려면
gcloud access-context-manager perimeters dry-run update를 사용하여 테스트 실행 구성에 적용하고gcloud access-context-manager perimeters dry-run enforce를 사용하여 검증 후 시행합니다.규칙이 활성 상태인지 확인합니다.
gcloud access-context-manager perimeters describe PERIMETER_NAME \ --policy=POLICY_ID \ --format='yaml(status.egressPolicies)'
서비스 경계의 Cloud Storage 버킷에 인그레스 규칙 추가
원격 카탈로그 (예: Databricks Unity Catalog 또는 Snowflake Horizon Catalog)의 테이블이 storage.googleapis.com를 제한하는 경계로 보호되는 Cloud Storage 버킷에 저장된 경우 버킷 프로젝트의 서비스 경계에 인그레스 규칙을 추가합니다. BigQuery 및 Lakehouse는 blirc-... 서비스 계정이 아닌 원격 카탈로그의 Google Cloud 서비스 계정을 사용하여 Cloud Storage에 인증하므로 버킷이 페더레이션 카탈로그 엔드포인트와 동일한 프로젝트 및 경계에 있는 경우에도 이 규칙이 필요합니다.
콘솔
Google Cloud 콘솔에서 VPC 서비스 제어 페이지로 이동합니다.
조직 및 액세스 정책을 선택한 후 Cloud Storage 버킷이 포함된 프로젝트를 보호하는 서비스 경계의 이름을 클릭합니다.
수정을 클릭한 후 인그레스 정책 섹션에서 인그레스 규칙 추가를 클릭합니다.
보낸사람 섹션에서 다음을 수행합니다.
- ID에서 ID 및 그룹 선택을 선택하고 ID 추가를 클릭한 후 Cloud Storage 버킷에 대해 원격 카탈로그에서 프로비저닝한 Google Cloud 서비스 계정을 추가합니다.
- 소스에서 모든 소스를 선택합니다(또는 소스 선택을 선택하여 액세스 수준 지정).
받는 사람 섹션에서 다음을 수행합니다.
- 리소스에서 리소스 선택을 선택합니다. 프로젝트 탭에서 프로젝트 추가를 클릭하고 Cloud Storage 버킷이 포함된 프로젝트를 선택한 후 선택한 프로젝트 추가를 클릭합니다.
- 작업 또는 IAM 역할에서 작업 선택을 선택하고 작업 추가를 클릭하고 Cloud Storage API(
storage.googleapis.com)를 선택하고 모든 메서드를 선택하고 모든 메서드 추가를 클릭합니다. 또는 메서드 선택을 선택하여 특정 지원되는 서비스 메서드 (예:google.storage.objects.get,google.storage.objects.list,google.storage.buckets.get)를 선택하고 선택한 메서드 추가를 클릭합니다.
저장을 클릭합니다.
gcloud CLI
원격 카탈로그의Google Cloud 서비스 계정이 버킷 프로젝트의
storage.googleapis.com에 액세스할 수 있도록 허용하는ingress.yaml파일을 만듭니다. 전체 스키마는 인그레스 규칙 참조를 확인하세요.- 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: Cloud Storage 버킷에 액세스하기 위해 원격 카탈로그에서 프로비저닝한Google Cloud 서비스 계정 이메일 주소입니다 (예: Databricks Unity Catalog의DESCRIBE STORAGE CREDENTIAL또는 Snowflake Horizon Catalog의DESC EXTERNAL VOLUME).BUCKET_PROJECT_NUMBER: Cloud Storage 버킷이 포함된 프로젝트의 숫자 프로젝트 번호입니다.
조직의 액세스 정책의 숫자 ID를 찾습니다.
gcloud access-context-manager policies list \ --organization=ORGANIZATION_ID \ --format='value(name)'ORGANIZATION_ID를 숫자 조직 ID로 바꿉니다.버킷 프로젝트를 보호하는 서비스 경계에 인그레스 규칙을 적용합니다.
gcloud access-context-manager perimeters update BUCKET_PERIMETER_NAME \ --policy=POLICY_ID \ --set-ingress-policies=ingress.yaml다음을 바꿉니다.
BUCKET_PERIMETER_NAME: 버킷 프로젝트를 보호하는 서비스 경계의 이름입니다.POLICY_ID: 액세스 정책의 숫자 ID입니다.
규칙을 시행하기 전에 테스트하려면
gcloud access-context-manager perimeters dry-run update를 사용하여 테스트 실행 구성에 적용하고gcloud access-context-manager perimeters dry-run enforce를 사용하여 검증 후 시행합니다.규칙이 활성 상태인지 확인합니다.
gcloud access-context-manager perimeters describe BUCKET_PERIMETER_NAME \ --policy=POLICY_ID \ --format='yaml(status.ingressPolicies)'
구성 확인
서비스 경계 정책 업데이트가 전파되는 데 최대 30분이 걸릴 수 있습니다. 규칙이 적용된 후 VPC 서비스 제어 거부 없이 메타데이터 동기화 및 BigQuery 쿼리가 완료되는지 확인합니다.
다음 예약된 메타데이터 동기화 주기가 완료될 때까지 기다린 후 Cloud 감사 로그에서 정책 거부 감사 로그를 확인하여 VPC 서비스 제어 위반이 발생하지 않는지 확인합니다. 동기화는 새로고침 일정에 따라 자동으로 실행되며 수동으로 트리거할 수 없습니다.
로그 탐색기에서 보호된 프로젝트(외부 클라우드 스토리지의 카탈로그 엔드포인트 프로젝트 또는 Cloud Storage 테이블의 Cloud Storage 버킷 프로젝트)를 선택합니다. 자세한 내용은 감사 로그에서 VPC 서비스 제어 오류 검색을 참조하세요. 다음 쿼리를 실행합니다.
log_id("cloudaudit.googleapis.com/policy") protoPayload.metadata.@type:"type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"규칙이 전파된 후 위반 항목이 표시되면 로그 항목의
egressViolations.targetResource,ingressViolations.targetResource,authenticationInfo.principalEmail필드를 검사하여 규칙의 리소스 및 ID와 일치하는지 확인합니다. 새 테이블이 동기화되지 않고VpcServiceControlAuditMetadata항목이 표시되지 않으면 원격 카탈로그 권한 및 사용자 인증 정보를 확인합니다. 크로스 클라우드 데이터 액세스 문제 해결을 참조하세요.4단계로 구성된 P.C.N.T (Project.Catalog.Namespace.Table) 이름 지정 규칙을 사용하여 BigQuery의 테이블에 대해 테스트 쿼리를 실행합니다.
SELECT COUNT(*) FROM `PROJECT_ID.CATALOG_ID.NAMESPACE.TABLE_NAME`;다음을 바꿉니다.
PROJECT_ID: 페더레이션 카탈로그 엔드포인트가 포함된 Google Cloud프로젝트의 IDCATALOG_ID: 페더레이션 카탈로그 엔드포인트의 ID입니다.NAMESPACE: 제휴 카탈로그 엔드포인트의 네임스페이스입니다.TABLE_NAME: 네임스페이스에 있는 테이블의 이름입니다.
VPC 서비스 제어에서 쿼리를 차단하면 오류 메시지에
vpcServiceControlsUniqueIdentifier값이 포함됩니다.protoPayload.metadata.vpcServiceControlsUniqueId를 해당 식별자와 일치시켜 로그 탐색기에서 정책 거부 감사 로그를 필터링합니다.log_id("cloudaudit.googleapis.com/policy") protoPayload.metadata.@type:"type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata" protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_IDENTIFIER"UNIQUE_IDENTIFIER를 오류 메시지의vpcServiceControlsUniqueIdentifier값으로 바꿉니다.