Dataflow 보안 및 권한

Dataflow 파이프라인은 Dataflow 관리형 서비스를 사용하여 로컬로 실행(소규모 데이터세트에 대한 테스트 수행 시)하거나 관리형 Google Cloud 리소스에서 실행할 수 있습니다. 로컬 또는 클라우드에서 실행 중인 파이프라인 및 작업자는 권한 시스템을 사용하여 파이프라인 파일 및 리소스에 대한 보안 액세스를 유지합니다. Dataflow 권한은 파이프라인 리소스에 액세스하는 데 사용되는 역할에 따라 지정됩니다. 이 문서에서는 다음 개념을 설명합니다.

  • Dataflow VM 업그레이드
  • 로컬 및 Google Cloud 파이프라인을 실행하는 데 필요한 역할 및 권한
  • 프로젝트 전체에서 파이프라인 리소스에 액세스하는 데 필요한 역할 및 권한
  • Dataflow 서비스 및 데이터 보안에 사용되는 데이터 유형

시작하기 전에

플랫폼 개요에서 Google Cloud 프로젝트 식별자에 대해 알아보세요. 식별자에는 프로젝트 이름, 프로젝트 ID, 프로젝트 번호가 포함됩니다.

Dataflow VM 업그레이드 및 패치

Dataflow는 Container-Optimized OS를 사용합니다. 따라서 Container-Optimized OS의 보안 프로세스도 Dataflow에 적용됩니다.

일괄 파이프라인은 시간이 제한적이며 유지보수가 필요하지 않습니다. 새 일괄 파이프라인이 시작되면 최신 Dataflow 이미지가 사용됩니다.

스트리밍 파이프라인의 경우 보안 패치가 즉시 필요하면 Google Cloud가 보안 게시판을 사용하여 알림을 표시합니다. 스트리밍 파이프라인의 경우 --update 옵션을 사용하여 최신 Dataflow 이미지로 작업을 다시 시작하는 것이 좋습니다.

Dataflow 컨테이너 이미지는 Google Cloud Console에서 확인할 수 있습니다.

로컬 파이프라인의 보안 및 권한

로컬로 실행하면 Apache Beam 파이프라인은 gcloud 명령줄 도구 실행 파일로 구성된 Google Cloud 계정으로 실행됩니다. 따라서 로컬에서 실행되는 Apache Beam SDK 작업과 Google Cloud 계정은 동일한 파일 및 리소스에 액세스할 수 있습니다.

기본값으로 선택한 Google Cloud 계정을 나열하려면 gcloud config list 명령어를 실행합니다.

Google Cloud 파이프라인의 보안 및 권한

파이프라인을 실행하면 Dataflow는 두 가지 서비스 계정을 사용하여 보안 및 권한을 관리합니다.

  • Dataflow 서비스 계정. Dataflow 서비스는 Dataflow 서비스 계정을 작업 생성 요청의 일부로 사용하고(예: 프로젝트 할당량 확인 및 사용자 대신 작업자 인스턴스 생성) 작업 실행 중 작업을 관리하는 데도 사용합니다.

  • 작업자 서비스 계정. 작업자 인스턴스는 사용자가 작업을 제출한 후 작업자 서비스 계정을 사용하여 입력 및 출력 리소스에 액세스합니다.

Dataflow 서비스 계정

Dataflow 서비스를 실행하면 Dataflow 서비스가 사용자를 대신하여 리소스를 조작합니다(예: 추가 VM 생성). Dataflow 서비스에서 파이프라인을 실행하면 Dataflow 서비스 계정(service-<project-number>@dataflow-service-producer-prod.iam.gserviceaccount.com)이 사용됩니다. Dataflow 서비스 계정은 Dataflow Job 리소스를 처음 사용할 때 생성됩니다. 이 계정은 프로젝트에서 Dataflow Service Agent 역할을 할당받고 Compute Engine 작업자 시작을 포함하여 프로젝트에서 Dataflow 작업을 실행하는 데 필요한 권한을 갖습니다. 이 계정은 Dataflow 서비스에서 단독으로 사용되며 프로젝트에 따라 다릅니다.

Cloud Console 또는 gcloud 명령줄 도구를 사용하여 Dataflow 서비스 계정의 권한을 검토할 수 있습니다.

Console

  1. 역할 페이지로 이동합니다.

    역할로 이동

  2. Cloud Console 툴바에서 프로젝트를 선택합니다.

  3. Dataflow 서비스 계정의 권한을 보려면 오른쪽 상단에서 Google 제공 역할 부여 포함 체크박스를 선택하고 Cloud Dataflow 서비스 에이전트 체크박스를 선택합니다.

gcloud

Dataflow 서비스 계정의 권한을 확인합니다.

gcloud iam roles describe roles/dataflow.serviceAgent

Google Cloud 서비스는 프로젝트 및 리소스에 대한 읽기/쓰기 권한을 요구하므로 프로젝트에 자동으로 설정된 기본 권한을 변경하지 않는 것이 좋습니다. ID 및 액세스 관리(IAM) 정책에서 서비스 계정 권한을 삭제해도 해당 계정은 Dataflow 서비스에서 소유하고 있으므로 계속 존재하게 됩니다. Dataflow 서비스 계정이 프로젝트 권한을 잃으면 Dataflow는 VM을 시작하거나 다른 관리 작업을 수행할 수 없습니다.

작업자 서비스 계정

Compute Engine 인스턴스는 클라우드에서 Apache Beam SDK 작업을 실행합니다. 이러한 작업자는 프로젝트의 작업자 서비스 계정을 사용하여 파이프라인의 파일 및 기타 리소스에 액세스합니다. 작업자 서비스 계정은 모든 작업자 VM의 ID로 사용됩니다. VM에서 시작되는 모든 요청에는 작업자 서비스 계정이 사용됩니다. 이 서비스 계정은 또한 Cloud Storage 버킷 및 Pub/Sub 주제와 같은 리소스와 상호작용하는 데에도 사용됩니다.

작업자 서비스 계정에서 작업을 만들고 실행하고 조사할 수 있으려면 roles/dataflow.adminroles/dataflow.worker 역할이 있는지 확인합니다. 또한 서비스 계정을 가장하려면 사용자 계정에 iam.serviceAccounts.actAs 권한이 필요합니다.

기본 작업자 서비스 계정

기본적으로 작업자가 프로젝트의 Compute Engine 서비스 계정을 작업자 서비스 계정으로 사용합니다. 이 서비스 계정(<project-number>-compute@developer.gserviceaccount.com)은 Cloud Console의 API 라이브러리에서 프로젝트에 Compute Engine API를 사용 설정할 때 자동으로 생성됩니다.

Compute Engine 기본 서비스 계정은 프로젝트 리소스에 대한 다양한 액세스를 통해 Dataflow를 쉽게 시작할 수 있습니다. 하지만 프로덕션 워크로드의 경우 필요한 역할 및 권한만 사용하여 새 서비스 계정을 만드는 것이 좋습니다.

사용자 관리형 작업자 서비스 계정 지정

세분화된 액세스 제어로 리소스를 만들고 사용하려면 사용자 관리형 서비스 계정을 만들고 작업자 서비스 계정으로 사용할 수 있습니다.

사용자 관리형 서비스 계정이 없는 경우 서비스 계정을 생성하여 서비스 계정의 필수 IAM 역할을 설정해야 합니다. 서비스 계정에는 최소한 Dataflow 작업자 역할이 있어야 합니다. BigQuery, Pub/Sub, Cloud Storage에 대한 쓰기와 같은 작업 요구 사항에 따라 Cloud Platform 리소스를 사용하려면 서비스 계정에 추가 역할이 필요할 수 있습니다. 예를 들어 BigQuery에서 작업을 읽는 경우 서비스 계정에도 최소한 roles/bigquery.dataViewer 역할이 있어야 합니다. 또한 사용자 관리 서비스 계정에 Dataflow 작업에 지정된 스테이징 및 임시 위치에 대해 읽기 및 쓰기 액세스 권한이 있는지 확인합니다.

사용자 관리형 서비스 계정은 작업과 동일한 프로젝트 또는 다른 프로젝트에 있을 수 있습니다. 서비스 계정과 작업이 다른 프로젝트에 있는 경우 작업을 실행하기 전에 서비스 계정을 구성해야 합니다. 또한 사용자 관리형 서비스 계정에서 다음 Google 관리 서비스 계정에 서비스 계정 토큰 생성자 역할을 부여해야 합니다.

  • Compute Engine 기본 서비스 계정(<project-number>-compute@developer.gserviceaccount.com)
  • Dataflow 서비스 에이전트(service-<project-number>@dataflow-service-producer-prod.iam.gserviceaccount.com)

자바

파이프라인 작업을 실행할 때 --serviceAccount 옵션을 사용하여 서비스 계정을 지정합니다. --serviceAccount=my-service-account-name@<project-id>.iam.gserviceaccount.com

Python

파이프라인 작업을 실행할 때 --service_account_email 옵션을 사용하여 서비스 계정을 지정합니다.--service_account_email=my-service-account-name@<project-id>.iam.gserviceaccount.com

Cloud Console의 권한 페이지에서 프로젝트의 서비스 계정 목록을 확인할 수 있습니다.

여러 Google Cloud 프로젝트에서 Google Cloud 리소스에 액세스

Apache Beam 파이프라인은 다른 Google Cloud 프로젝트의 Google Cloud 리소스에 액세스할 수 있습니다. 이러한 리소스는 다음과 같습니다.

Apache Beam 파이프라인이 프로젝트 전체에서 이러한 리소스에 액세스할 수 있게 하려면 리소스 각각의 액세스 제어 메커니즘을 사용하여 Dataflow 프로젝트의 작업자 서비스 계정에 대한 액세스 권한을 명시적으로 부여해야 합니다.

Google Cloud 프로젝트에서 Cloud Storage 버킷에 액세스

Dataflow 프로젝트에 다른 Google Cloud 프로젝트가 소유한 Cloud Storage 버킷에 대한 액세스 권한을 부여하려면 버킷이 Dataflow 프로젝트의 작업자 서비스 계정에 액세스할 수 있도록 설정해야 합니다. Cloud Storage 액세스 제어를 사용하여 필요한 액세스 권한을 부여할 수 있습니다.

Cloud Console의 IAM 및 관리자 페이지에서 Dataflow 프로젝트의 서비스 계정 목록을 확인할 수 있습니다. 계정 이름을 알면 gsutil 명령어를 실행하여 버킷과 해당 콘텐츠에 프로젝트의 서비스 계정 소유권(읽기/쓰기 권한)을 부여할 수 있습니다.

Dataflow 프로젝트의 서비스 계정에 다른 프로젝트에 있는 Cloud Storage 버킷에 대한 액세스 권한을 부여하려면 셸 또는 터미널 창에서 gsutil acl ch -u <project-number>-compute@developer.gserviceaccount.com:OWNER gs://<bucket> 명령어를 사용합니다.

Dataflow 프로젝트의 서비스 계정에 다른 프로젝트에 있는 Cloud Storage 버킷의 기존 콘텐츠에 대한 액세스 권한을 부여하려면 셸 또는 터미널 창에서 gsutil -m acl ch -r -u <project-number>-compute@developer.gserviceaccount.com:OWNER gs://<bucket> 명령어를 사용합니다.

이전 명령어는 기존 리소스에만 액세스 권한을 부여합니다. Dataflow 프로젝트의 서비스 계정에 버킷에 대한 기본 권한을 부여하면 해당 계정이 버킷에 추가될 향후 리소스에 액세스할 수 있습니다. gsutil defacl ch -u <project-number>-compute@developer.gserviceaccount.com:OWNER gs://<bucket>

Google Cloud 프로젝트에서 BigQuery 데이터 세트에 액세스

BigQueryIO API를 사용하여 Dataflow를 사용하는 프로젝트가 아닌 다른 Google Cloud 프로젝트가 소유한 BigQuery 데이터 세트에 액세스할 수 있습니다. BigQuery 소스와 싱크가 제대로 작동하려면 다음 두 계정이 Dataflow 작업에서 읽고 쓰는 모든 BigQuery 데이터 세트에 액세스할 수 있어야 합니다.

  • Dataflow 작업을 실행하기 위해 사용하는 Google Cloud 계정입니다.
  • Dataflow 작업을 실행하는 작업자 서비스 계정입니다.

이러한 계정에 명시적으로 액세스 권한을 부여하려면 BigQuery를 구성해야 합니다. BigQuery 페이지 또는 BigQuery API를 사용하여 BigQuery 데이터 세트에 대한 액세스 권한을 부여하는 방법을 자세히 알아보려면 BigQuery 액세스 제어를 참조하세요.

필요한 BigQuery 권한 중 파이프라인이 BigQuery 데이터 세트에 액세스하기 위해 bigquery.datasets.get IAM 권한이 필요합니다. 일반적으로 대부분의 BigQuery IAM 역할에 bigquery.datasets.get 권한이 포함되지만 roles/bigquery.jobUser 역할은 예외입니다.

예를 들어 Google Cloud 계정이 abcde@gmail.com이고 Dataflow 작업을 실행하는 프로젝트의 프로젝트 번호가 123456789인 경우 사용되는 BigQuery 데이터세트에 액세스할 수 있는 권한을 abcde@gmail.com123456789-compute@developer.gserviceaccount.com 계정 모두에 부여해야 합니다.

Google Cloud 프로젝트에서 Pub/Sub 주제 및 구독에 액세스

다른 Google Cloud 프로젝트가 소유한 Pub/Sub 주제 또는 구독에 액세스하려면 Pub/Sub의 ID 및 액세스 관리 기능을 사용하여 프로젝트 간 권한을 설정해야 합니다. Dataflow는 작업자 서비스 계정을 사용하여 작업을 실행하고 이 서비스 계정에 다른 프로젝트의 Pub/Sub 리소스에 대한 액세스 권한을 부여합니다.

다음 Pub/Sub 역할의 권한은 필수입니다.

  • roles/pubsub.subscriber: 데이터를 사용하고 구독을 생성합니다.
  • roles/pubsub.viewer: 주제 및 구독의 구성을 쿼리합니다. Dataflow는 기한을 적절하게 연장하기 위해 구독의 확인 기한에 액세스해야 합니다. 또한 Dataflow는 이 권한을 통해 구독 및 주제에 문제가 발생할 수 있는 지원되지 않는 설정을 확인할 수 있습니다.

Pub/Sub의 ID 및 액세스 관리 기능에 대한 자세한 내용 및 사용 방법을 보여주는 코드 예시를 보려면 샘플 사용 사례: 프로젝트 간 통신을 참조하세요.

Google Cloud 프로젝트에서 Firestore에 액세스

다른 Google Cloud 프로젝트가 소유한 Firestore 데이터베이스(기본 모드 또는 Datastore 모드)에 액세스하려면 Dataflow 프로젝트의 Compute Engine(<project-number>-compute@developer.gserviceaccount.com) 서비스 계정을 Firestore를 소유한 프로젝트의 편집자로 추가하거나 roles/datastore.viewer와 같이 더 제한적인 Datastore 역할을 사용합니다. 또한 Google Cloud Console에서 API 라이브러리의 두 프로젝트 모두에서 Firestore API를 사용 설정합니다.

신뢰할 수 있는 이미지 정책이 있는 프로젝트의 이미지 액세스

프로젝트에 신뢰할 수 있는 이미지 정책이 설정되어 있고 부팅 이미지가 다른 프로젝트에 있다면 신뢰할 수 있는 이미지 정책이 이미지에 액세스할 수 있도록 구성되어 있는지 확인합니다. 예를 들어 템플릿 Dataflow 작업을 실행하는 경우 정책 파일에 dataflow-service-producer-prod 프로젝트에 대한 액세스 권한이 포함되어 있는지 확인합니다. 템플릿 작업의 이미지가 포함된 Cloud 프로젝트입니다.

데이터 액세스 및 보안

Dataflow 서비스는 두 종류의 데이터와 함께 작동합니다.

  • 최종 사용자 데이터. Dataflow 파이프라인에서 처리되는 데이터입니다. 일반적인 파이프라인은 하나 이상의 소스에서 데이터를 읽고, 데이터의 변환을 구현하고, 결과를 하나 이상의 싱크에 씁니다. 모든 소스와 싱크는 Dataflow에서 직접 관리하지 않는 스토리지 서비스입니다.

  • 운영 데이터. 이 데이터에는 Dataflow 파이프라인을 관리하는 데 필요한 모든 메타데이터가 포함됩니다. 이 데이터에는 작업 이름 또는 파이프라인 옵션과 같은 사용자 제공 메타데이터와 작업 ID와 같은 시스템 생성 메타데이터가 모두 포함됩니다.

Dataflow 서비스는 여러 보안 메커니즘을 사용하여 데이터를 안전하게 비공개로 유지합니다. 이러한 메커니즘은 다음 상황에 적용됩니다.

  • 서비스에 파이프라인 제출
  • 파이프라인 평가
  • 파이프라인 실행 중 및 실행 후에 원격 분석 및 측정항목에 대한 액세스 요청
  • Shuffle 또는 Streaming Engine 엔진과 같은 Dataflow 서비스 사용

데이터 지역

Dataflow 서비스의 모든 핵심 데이터 처리는 파이프라인 코드에 지정된 리전에서 수행됩니다. 리전을 지정하지 않으면 기본 리전 us-central1이 사용됩니다. 파이프라인 작업은 사용자가 파이프라인 코드에 이 옵션을 지정하는 경우 다른 리전의 소스와 싱크에서 선택적으로 읽고 쓸 수 있습니다. 그러나 실제 데이터 처리는 Dataflow VM을 실행하도록 지정된 리전에서만 수행됩니다.

파이프라인 논리는 개별 작업자 VM 인스턴스에서 평가됩니다. 이러한 인스턴스가 위치한 영역과 인스턴스가 통신하는 비공개 네트워크를 지정할 수 있습니다. 플랫폼의 보조 계산은 Cloud Storage 위치 또는 파일 크기와 같은 메타데이터에 따라 다릅니다.

Dataflow는 리전 서비스입니다. 데이터 지역 및 지역 엔드포인트에 대한 자세한 내용은 지역 엔드포인트를 참조하세요.

파이프라인 데이터 제출

Google Cloud 프로젝트의 IAM 권한은 Dataflow 서비스에 대한 액세스를 제어합니다. 프로젝트에 대해 편집자 또는 소유자 권한이 부여된 모든 주 구성원이 파이프라인을 서비스에 제출할 수 있습니다. 파이프라인을 제출하려면 gcloud 명령줄 도구를 사용하여 인증해야 합니다. 인증 후에는 HTTPS 프로토콜을 사용하여 파이프라인을 제출할 수 있습니다. Google Cloud 계정 사용자 인증 정보로 인증하는 방법에 대한 자세한 내용은 현지 언어로 된 빠른 시작을 참조하세요.

파이프라인 데이터 평가

파이프라인 평가 일환으로 임시 데이터가 생성되어 작업자 VM 인스턴스 또는 Cloud Storage에 로컬로 저장될 수 있습니다. 임시 데이터는 저장 상태에서 암호화되며 파이프라인이 평가된 후에는 유지되지 않습니다. 이러한 데이터는 Dataflow 파이프라인에 지정된 것과 동일한 리전에서 Shuffle 서비스 또는 Streaming Engine 서비스(서비스를 선택한 경우)에 저장할 수도 있습니다.

자바

기본적으로 Compute Engine VM은 작업 성공 여부와 관계없이 Dataflow 작업이 완료되면 삭제됩니다. 즉, 관련 영구 디스크 및 여기에 저장된 모든 중간 데이터가 삭제됩니다. Cloud Storage에 저장된 중간 데이터는 Cloud Storage 경로 --stagingLocation 또는 --tempLocation의 하위 위치에서 찾을 수 있습니다. Cloud Storage 파일에 출력을 쓰는 경우 쓰기 작업이 완료되기 전에 출력 위치에 임시 파일이 생성될 수 있습니다.

Python

기본적으로 Compute Engine VM은 작업 성공 여부와 관계없이 Dataflow 작업이 완료되면 삭제됩니다. 즉, 관련 영구 디스크 및 여기에 저장된 모든 중간 데이터가 삭제됩니다. Cloud Storage에 저장된 중간 데이터는 Cloud Storage 경로 --staging_location 또는 --temp_location의 하위 위치에서 찾을 수 있습니다. Cloud Storage 파일에 출력을 쓰는 경우 쓰기 작업이 완료되기 전에 출력 위치에 임시 파일이 생성될 수 있습니다.

파이프라인 로그 및 원격 분석의 데이터

Cloud Logging에 저장된 정보는 주로 Dataflow 프로그램의 코드를 통해 생성됩니다. Dataflow 서비스는 Cloud Logging에서 경고 및 오류 데이터를 생성할 수 있지만 이러한 데이터는 서비스가 로그에 추가하는 유일한 중간 데이터입니다. Cloud Logging은 글로벌 서비스입니다.

원격 분석 데이터와 관련 측정항목은 저장 상태에서 암호화되며 이 데이터에 대한 액세스는 Google Cloud 프로젝트의 읽기 권한으로 제어됩니다.

Dataflow 서비스의 데이터

파이프라인에 Dataflow Shuffle 또는 Dataflow Streaming을 사용하는 경우, 영역 파이프라인 옵션을 지정하지 마세요. 대신 리전을 지정하고 현재 Shuffle 또는 Streaming을 사용할 수 있는 리전 중 하나로 값을 설정합니다. Dataflow가 지정한 리전에서 영역을 자동으로 선택합니다. 전송 중인 최종 사용자 데이터는 작업자 VM 및 동일한 영역에 유지됩니다. 이러한 Dataflow 작업은 VM 영역 외부에 있는 소스와 싱크를 계속 읽고 쓸 수 있습니다. 전송 중 데이터를 Dataflow Shuffle 또는 Dataflow Streaming 서비스로 보낼 수도 있지만 데이터는 항상 파이프라인 코드에 지정된 리전에 남아 있습니다.

파이프라인의 기본 클라우드 리소스에서 제공되는 보안 메커니즘을 사용하는 것이 좋습니다. 이러한 메커니즘으로는 데이터 소스 및 싱크의 데이터 보안 기능을 갖춘 BigQuery 및 Cloud Storage 등이 포함됩니다. 또한 단일 프로젝트에서 서로 다른 신뢰 수준을 혼용하지 않아야 합니다.