IAM으로 리소스 액세스 제어

이 문서에서는 리소스의 현재 액세스 정책을 보는 방법, 리소스에 액세스 권한을 부여하는 방법, 리소스에 대해 액세스 권한을 해제하는 방법을 설명합니다.

이 문서에서는 Google Cloud의 Identity and Access Management(IAM) 시스템에 익숙하다고 가정합니다.

필요한 역할

리소스의 IAM 정책을 수정하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 BigQuery 데이터 소유자(roles/bigquery.dataOwner) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 액세스 관리를 참조하세요.

이 사전 정의된 역할에는 리소스의 IAM 정책을 수정하는 데 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 확장하세요.

필수 권한

  • bigquery.datasets.get - 데이터 세트의 액세스 정책을 가져옵니다.
  • bigquery.datasets.update - 데이터 세트의 액세스 정책을 설정합니다.
  • bigquery.datasets.getIamPolicy - 콘솔 전용이며, 데이터 세트의 액세스 정책을 가져옵니다.
  • bigquery.datasets.setIamPolicy - 콘솔 전용이며, 데이터 세트의 액세스 정책을 설정합니다.
  • bigquery.tables.getIamPolicy - 테이블 또는 뷰의 액세스 정책을 가져옵니다.
  • bigquery.tables.setIamPolicy - 테이블 또는 뷰의 액세스 정책을 설정합니다.
  • bigquery.jobs.create - 선택적으로 bq 도구 또는 SQL BigQuery 작업을 만듭니다.

커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.

리소스의 액세스 정책 보기

다음 섹션에서는 여러 리소스의 액세스 정책을 보는 방법을 설명합니다.

데이터 세트의 액세스 정책 보기

다음 옵션 중 하나를 선택합니다.

콘솔

  1. BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 탐색기 창에서 프로젝트를 확장하고 데이터 세트를 선택합니다.

  3. 공유 > 권한을 클릭합니다.

    데이터 세트 액세스 정책이 데이터 세트 권한 창에 표시됩니다.

bq

기존 정책을 가져와서 JSON의 로컬 파일로 출력하려면 Cloud Shell에서 bq show 명령어를 사용합니다.

bq show \
    --format=prettyjson \
    PROJECT_ID:DATASET > PATH_TO_FILE

다음을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID입니다.
  • DATASET: 데이터 세트의 이름입니다.
  • PATH_TO_FILE: 로컬 머신의 JSON 파일 경로입니다.

API

데이터 세트를 만들 때 액세스 제어를 적용하려면 정의된 dataset resource를 사용하여 datasets.insert를 호출합니다. 액세스 제어를 업데이트하려면 datasets.patch를 호출하고 Dataset 리소스에서 access 속성을 사용합니다.

datasets.update 메서드는 전체 데이터 세트 리소스를 바꾸기 때문에 datasets.patch 메서드를 사용하여 액세스 제어를 업데이트하는 것이 좋습니다.

테이블 또는 뷰의 액세스 정책 보기

다음 옵션 중 하나를 선택합니다.

콘솔

  1. BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 탐색기 창에서 프로젝트를 확장하고 테이블 또는 뷰를 선택합니다.

  3. 공유를 클릭합니다.

    테이블 또는 뷰 액세스 정책이 공유 창에 나타납니다.

bq

기존 액세스 정책을 가져와서 JSON의 로컬 파일로 출력하려면 Cloud Shell에서 bq get-iam-policy 명령어를 사용합니다.

bq get-iam-policy \
    --table=true \
    PROJECT_ID:DATASET.RESOURCE > PATH_TO_FILE

다음을 바꿉니다.

  • PROJECT_ID: 프로젝트 ID입니다.
  • DATASET: 데이터 세트의 이름입니다.
  • RESOURCE: 정책을 보려는 테이블 또는 뷰의 이름입니다.
  • PATH_TO_FILE: 로컬 머신의 JSON 파일 경로입니다.

API

현재 정책을 검색하려면 tables.getIamPolicy 메서드를 호출합니다.

리소스에 대해 액세스 권한 부여

다음 섹션에서는 여러 리소스에 대한 액세스 권한을 부여하는 방법을 설명합니다.

데이터 세트에 대해 액세스 권한 부여

다음 옵션 중 하나를 선택합니다.

콘솔

  1. BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 탐색기 창에서 프로젝트를 확장하고 공유할 데이터 세트를 선택합니다.

  3. 공유 > 권한을 클릭합니다.

  4. 주 구성원 추가를 클릭합니다.

  5. 새 주 구성원 필드에 주 구성원을 입력합니다.

  6. 역할 선택 목록에서 사전 정의된 역할 또는 커스텀 역할을 선택합니다.

  7. 저장을 클릭합니다.

  8. 데이터 세트 정보로 돌아가려면 닫기를 클릭합니다.

SQL

데이터 세트에 대한 액세스 권한을 주 구성원에 부여하려면 GRANT DCL 문을 사용합니다.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    GRANT ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

    다음을 바꿉니다.

    • ROLE_LIST: 부여하려는 역할 또는 쉼표로 구분된 역할 목록입니다.
    • RESOURCE_TYPE: 역할이 적용된 리소스 유형입니다.

      지원되는 값은 SCHEMA(데이터 세트와 같음), TABLE, VIEW, EXTERNAL TABLE입니다.

    • RESOURCE_NAME: 권한을 부여하려는 리소스 이름입니다.
    • USER_LIST: 역할이 부여된 쉼표로 구분된 사용자 목록입니다.

      유효한 형식 목록은 user_list를 참조하세요.

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

  1. 기존 데이터 세트 정보(액세스 제어 포함)를 JSON 파일에 기록하려면 bq show 명령어를 사용합니다.

    bq show \
       --format=prettyjson \
       PROJECT_ID:DATASET > PATH_TO_FILE
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • DATASET: 데이터 세트의 이름입니다.
    • PATH_TO_FILE: 로컬 머신의 JSON 파일 경로입니다.
  2. JSON 파일의 access 섹션으로 변경합니다. specialGroup 항목(projectOwners, projectWriters, projectReaders, allAuthenticatedUsers)에 추가할 수 있습니다. userByEmail, groupByEmail, domain 중 하나를 추가할 수도 있습니다.

    예를 들어 데이터 세트 JSON 파일의 access 섹션은 다음과 비슷합니다.

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "domain_name"
      },
      {
       "role": "WRITER",
       "userByEmail": "user_email"
      },
      {
       "role": "READER",
       "groupByEmail": "group_email"
      }
     ],
     ...
    }
    

  3. 수정이 완료되면 bq update 명령어를 사용하고 --source 플래그로 JSON 파일을 포함합니다. 데이터 세트가 기본 프로젝트가 아닌 다른 프로젝트에 있다면 프로젝트 ID를 PROJECT_ID:DATASET 형식으로 데이터 세트 이름에 추가합니다.

    bq update \
    --source PATH_TO_FILE \
    PROJECT_ID:DATASET
    
  4. 액세스 제어 변경사항을 확인하려면 파일에 정보를 쓰지 않고 bq show 명령어를 다시 사용합니다.

    bq show --format=prettyjson PROJECT_ID:DATASET
    

API

데이터 세트를 만들 때 액세스 제어를 적용하려면 정의된 데이터 세트 리소스를 사용하여 datasets.insert 메서드를 호출합니다. 액세스 제어를 업데이트하려면 datasets.patch 메서드를 호출하고 Dataset 리소스에서 access 속성을 사용합니다.

datasets.update 메서드는 전체 데이터 세트 리소스를 바꾸기 때문에 datasets.patch 메서드를 사용하여 액세스 제어를 업데이트하는 것이 좋습니다.

Go

이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 확인하세요.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// updateDatasetAccessControl demonstrates how the access control policy of a dataset
// can be amended by adding an additional entry corresponding to a specific user identity.
func updateDatasetAccessControl(projectID, datasetID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	meta, err := ds.Metadata(ctx)
	if err != nil {
		return err
	}
	// Append a new access control entry to the existing access list.
	update := bigquery.DatasetMetadataToUpdate{
		Access: append(meta.Access, &bigquery.AccessEntry{
			Role:       bigquery.ReaderRole,
			EntityType: bigquery.UserEmailEntity,
			Entity:     "sample.bigquery.dev@gmail.com"},
		),
	}

	// Leverage the ETag for the update to assert there's been no modifications to the
	// dataset since the metadata was originally read.
	if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

자바

이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용Java 설정 안내를 따르세요. 자세한 내용은 BigQuery Java API 참조 문서를 확인하세요.

import com.google.cloud.bigquery.Acl;
import com.google.cloud.bigquery.Acl.Role;
import com.google.cloud.bigquery.Acl.User;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;
import java.util.ArrayList;

public class UpdateDatasetAccess {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    // Create a new ACL granting the READER role to "sample.bigquery.dev@gmail.com"
    // For more information on the types of ACLs available see:
    // https://cloud.google.com/storage/docs/access-control/lists
    Acl newEntry = Acl.of(new User("sample.bigquery.dev@gmail.com"), Role.READER);

    updateDatasetAccess(datasetName, newEntry);
  }

  public static void updateDatasetAccess(String datasetName, Acl newEntry) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      Dataset dataset = bigquery.getDataset(datasetName);

      // Get a copy of the ACLs list from the dataset and append the new entry
      ArrayList<Acl> acls = new ArrayList<>(dataset.getAcl());
      acls.add(newEntry);

      bigquery.update(dataset.toBuilder().setAcl(acls).build());
      System.out.println("Dataset Access Control updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Dataset Access control was not updated \n" + e.toString());
    }
  }
}

Python

이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

데이터 세트에 대한 액세스 제어를 사용하여 dataset.access_entries 속성을 설정합니다. 그런 다음 client.update_dataset() 함수를 호출하여 속성을 업데이트합니다.

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
dataset_id = "your-project.your_dataset"

# TODO(developer): Set entity_id to the ID of the email or group from whom
# you are adding access. Alternatively, to the JSON REST API representation
# of the entity, such as a view's table reference.
entity_id = "user-or-group-to-add@example.com"

from google.cloud.bigquery.enums import EntityTypes

# TODO(developer): Set entity_type to the type of entity you are granting access to.
# Common types include:
#
# * "userByEmail" -- A single user or service account. For example "fred@example.com"
# * "groupByEmail" -- A group of users. For example "example@googlegroups.com"
# * "view" -- An authorized view. For example
#       {"projectId": "p", "datasetId": "d", "tableId": "v"}
#
# For a complete reference, see the REST API reference documentation:
# https://cloud.google.com/bigquery/docs/reference/rest/v2/datasets#Dataset.FIELDS.access
entity_type = EntityTypes.GROUP_BY_EMAIL

# TODO(developer): Set role to a one of the "Basic roles for datasets"
# described here:
# https://cloud.google.com/bigquery/docs/access-control-basic-roles#dataset-basic-roles
role = "READER"

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

dataset = client.get_dataset(dataset_id)  # Make an API request.

entries = list(dataset.access_entries)
entries.append(
    bigquery.AccessEntry(
        role=role,
        entity_type=entity_type,
        entity_id=entity_id,
    )
)
dataset.access_entries = entries

dataset = client.update_dataset(dataset, ["access_entries"])  # Make an API request.

full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
print(
    "Updated dataset '{}' with modified user permissions.".format(full_dataset_id)
)

테이블 또는 뷰에 대해 액세스 부여

다음 옵션 중 하나를 선택합니다.

콘솔

  1. BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 탐색기 창에서 프로젝트를 확장하고 공유할 테이블 또는 뷰를 선택합니다.

  3. 공유를 클릭합니다.

  4. 주 구성원 추가를 클릭합니다.

  5. 새 주 구성원 필드에 주 구성원을 입력합니다.

  6. 역할 선택 목록에서 사전 정의된 역할 또는 커스텀 역할을 선택합니다.

  7. 저장을 클릭합니다.

  8. 테이블 또는 뷰 세부정보로 돌아가려면 닫기를 클릭합니다.

SQL

주 구성원에 테이블 또는 뷰에 대한 액세스 권한을 부여하려면 GRANT DCL 문을 사용합니다.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    GRANT ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

    다음을 바꿉니다.

    • ROLE_LIST: 부여하려는 역할 또는 쉼표로 구분된 역할 목록입니다.
    • RESOURCE_TYPE: 역할이 적용된 리소스 유형입니다.

      지원되는 값은 SCHEMA(데이터 세트와 같음), TABLE, VIEW, EXTERNAL TABLE입니다.

    • RESOURCE_NAME: 권한을 부여하려는 리소스 이름입니다.
    • USER_LIST: 역할이 부여된 쉼표로 구분된 사용자 목록입니다.

      유효한 형식 목록은 user_list를 참조하세요.

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

  1. 기존 테이블 또는 뷰 정보(액세스 제어 포함)를 JSON 파일에 기록하려면 bq get-iam-policy 명령어를 사용합니다.

    bq get-iam-policy \
       PROJECT_ID:DATASET.TABLE_OR_VIEW \
       > PATH_TO_FILE
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • DATASET: 업데이트하려는 테이블 또는 뷰가 포함된 데이터 세트의 이름입니다.
    • TABLE_OR_VIEW: 업데이트할 리소스의 이름입니다.
    • PATH_TO_FILE: 로컬 머신의 JSON 파일 경로입니다.
  2. JSON 파일의 access 섹션으로 변경합니다. specialGroup 항목(projectOwners, projectWriters, projectReaders, allAuthenticatedUsers)에 추가할 수 있습니다. userByEmail, groupByEmail, domain 중 하나를 추가할 수도 있습니다. 예를 들어 테이블 또는 뷰의 JSON 파일의 access 섹션은 다음과 비슷합니다.

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "domain_name"
      },
      {
       "role": "WRITER",
       "userByEmail": "user_email"
      },
      {
       "role": "READER",
       "groupByEmail": "group_email"
      }
     ],
     ...
    }
    

  3. set-iam-policy 명령어를 사용하여 정책을 업데이트합니다.

    bq set-iam-policy \
        PROJECT_ID:DATASET.TABLE_OR_VIEW \
        > PATH_TO_FILE
    

  4. 액세스 제어 변경사항을 확인하려면 파일에 정보를 쓰지 않고 bq get-iam-policy 명령어를 다시 사용합니다.

    bq get-iam-policy --format=prettyjson \
        PROJECT_ID:DATASET.TABLE_OR_VIEW
    

API

  1. 현재 정책을 검색하려면 tables.getIamPolicy 메서드를 호출합니다.
  2. 정책을 수정하여 구성원 또는 결합을 추가합니다. 정책에 필요한 형식은 정책 참조 주제를 참조하세요.

자바

이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용Java 설정 안내를 따르세요. 자세한 내용은 BigQuery Java API 참조 문서를 확인하세요.

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

// Sample to create iam policy for table
public class CreateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    createIamPolicy(datasetName, tableName);
  }

  public static void createIamPolicy(String datasetName, String tableName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      policy
          .toBuilder()
          .addIdentity(Role.of("roles/bigquery.dataViewer"), Identity.allUsers())
          .build();
      bigquery.setIamPolicy(tableId, policy);
      System.out.println("Iam policy created successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not created. \n" + e.toString());
    }
  }
}

리소스에 대한 액세스 취소

다음 섹션에서는 여러 리소스에 대한 액세스 권한을 취소하는 방법을 설명합니다.

데이터 세트에 대한 액세스 취소

다음 옵션 중 하나를 선택합니다.

콘솔

  1. BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 탐색기 패널에서 프로젝트를 확장하고 데이터 세트를 선택합니다.

  3. 세부정보 패널에서 공유 > 권한을 클릭합니다.

  4. 데이터 세트 권한 대화상자에서 취소하려는 액세스 권한이 있는 주 구성원을 확장합니다.

  5. 주 구성원 삭제를 클릭합니다.

  6. 주 구성원에서 역할을 삭제할까요? 대화상자에서 삭제를 클릭합니다.

  7. 데이터 세트 세부정보로 돌아가려면 닫기를 클릭합니다.

SQL

주 구성원에서 데이터 세트에 대해 액세스 권한을 삭제하려면 REVOKE DCL 문을 사용합니다.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    REVOKE ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

    다음을 바꿉니다.

    • ROLE_LIST: 취소하려는 역할 또는 쉼표로 구분된 역할 목록입니다.
    • RESOURCE_TYPE: 역할이 취소되는 리소스 유형입니다.

      지원되는 값은 SCHEMA(데이터 세트와 같음), TABLE, VIEW, EXTERNAL TABLE입니다.

    • RESOURCE_NAME: 권한을 취소하려는 리소스의 이름입니다.
    • USER_LIST: 역할이 취소되는 쉼표로 구분된 사용자 목록입니다.

      유효한 형식 목록은 user_list를 참조하세요.

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

  1. 기존 데이터 세트 정보(액세스 제어 포함)를 JSON 파일에 기록하려면 bq show 명령어를 사용합니다.

    bq show \
      --format=prettyjson \
      PROJECT_ID:DATASET > PATH_TO_FILE
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • DATASET: 데이터 세트의 이름입니다.
    • PATH_TO_FILE: 로컬 머신의 JSON 파일 경로입니다.
  2. JSON 파일의 access 섹션으로 변경합니다. specialGroup 항목(projectOwners, projectWriters, projectReaders, allAuthenticatedUsers)을 삭제할 수 있습니다. userByEmail, groupByEmail, domain도 삭제할 수 있습니다.

    예를 들어 데이터 세트 JSON 파일의 access 섹션은 다음과 비슷합니다.

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "domain_name"
      },
      {
       "role": "WRITER",
       "userByEmail": "user_email"
      },
      {
       "role": "READER",
       "groupByEmail": "group_email"
      }
     ],
     ...
    }
    

  3. 수정이 완료되면 bq update 명령어를 사용하고 --source 플래그로 JSON 파일을 포함합니다. 데이터 세트가 기본 프로젝트가 아닌 다른 프로젝트에 있다면 프로젝트 ID를 PROJECT_ID:DATASET 형식으로 데이터 세트 이름에 추가합니다.

    bq update \
        --source PATH_TO_FILE \
        PROJECT_ID:DATASET
    
  4. 액세스 제어 변경사항을 확인하려면 파일에 정보를 쓰지 않고 show 명령어를 다시 사용합니다.

    bq show --format=prettyjson PROJECT_ID:DATASET
    

API

datasets.patch를 호출하고 Dataset 리소스의 access 속성을 사용하여 액세스 제어를 업데이트합니다.

datasets.update 메서드는 전체 데이터 세트 리소스를 바꾸기 때문에 datasets.patch 메서드를 사용하여 액세스 제어를 업데이트하는 것이 좋습니다.

Go

이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용Go 설정 안내를 따르세요. 자세한 내용은 BigQuery Go API 참조 문서를 확인하세요.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// revokeDatasetAccess updates the access control on a dataset to remove all
// access entries that reference a specific entity.
func revokeDatasetAccess(projectID, datasetID, entity string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// entity := "user@mydomain.com"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	meta, err := ds.Metadata(ctx)
	if err != nil {
		return err
	}

	var newAccessList []*bigquery.AccessEntry
	for _, entry := range meta.Access {
		if entry.Entity != entity {
			newAccessList = append(newAccessList, entry)
		}
	}

	// Only proceed with update if something in the access list was removed.
	// Additionally, we use the ETag from the initial metadata to ensure no
	// other changes were made to the access list in the interim.
	if len(newAccessList) < len(meta.Access) {

		update := bigquery.DatasetMetadataToUpdate{
			Access: newAccessList,
		}
		if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
			return err
		}
	}
	return nil
}

Python

이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용Python 설정 안내를 따르세요. 자세한 내용은 BigQuery Python API 참조 문서를 확인하세요.

데이터 세트에 대한 액세스 제어를 사용하여 dataset.access_entries 속성을 설정합니다. 그런 다음 client.update_dataset() 함수를 호출하여 속성을 업데이트합니다.

# TODO(developer): Set dataset_id to the ID of the dataset to fetch.
dataset_id = "your-project.your_dataset"

# TODO(developer): Set entity_id to the ID of the email or group from whom you are revoking access.
entity_id = "user-or-group-to-remove@example.com"

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

dataset = client.get_dataset(dataset_id)  # Make an API request.

entries = list(dataset.access_entries)
dataset.access_entries = [
    entry for entry in entries if entry.entity_id != entity_id
]

dataset = client.update_dataset(
    dataset,
    # Update just the `access_entries` property of the dataset.
    ["access_entries"],
)  # Make an API request.

full_dataset_id = f"{dataset.project}.{dataset.dataset_id}"
print(f"Revoked dataset access for '{entity_id}' to ' dataset '{full_dataset_id}.'")

테이블 또는 뷰에 대해 액세스 취소

다음 옵션 중 하나를 선택합니다.

콘솔

  1. BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 탐색기 창에서 프로젝트를 확장하고 테이블 또는 뷰를 선택합니다.

  3. 세부정보 패널에서 공유를 클릭합니다.

  4. 공유 대화상자에서 액세스 권한을 취소하려는 주 구성원을 확장합니다.

  5. 삭제를 클릭합니다.

  6. 주 구성원에서 역할을 삭제할까요? 대화상자에서 삭제를 클릭합니다.

  7. 테이블 또는 뷰 세부정보로 돌아가려면 닫기를 클릭합니다.

SQL

주 구성원에서 테이블 또는 뷰에 대해 액세스 권한을 삭제하려면 REVOKE DCL 문을 사용합니다.

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 쿼리 편집기에서 다음 문을 입력합니다.

    REVOKE ROLE_LIST
    ON RESOURCE_TYPE RESOURCE_NAME
    TO "USER_LIST"
    

    다음을 바꿉니다.

    • ROLE_LIST: 취소하려는 역할 또는 쉼표로 구분된 역할 목록입니다.
    • RESOURCE_TYPE: 역할이 취소되는 리소스 유형입니다.

      지원되는 값은 SCHEMA(데이터 세트와 같음), TABLE, VIEW, EXTERNAL TABLE입니다.

    • RESOURCE_NAME: 권한을 취소하려는 리소스의 이름입니다.
    • USER_LIST: 역할이 취소되는 쉼표로 구분된 사용자 목록입니다.

      유효한 형식 목록은 user_list를 참조하세요.

  3. 실행을 클릭합니다.

쿼리를 실행하는 방법에 대한 자세한 내용은 대화형 쿼리 실행을 참조하세요.

bq

  1. 기존 테이블 또는 뷰 정보(액세스 제어 포함)를 JSON 파일에 기록하려면 bq get-iam-policy 명령어를 사용합니다.

    bq get-iam-policy \
       PROJECT_ID:DATASET.TABLE_OR_VIEW \
       > PATH_TO_FILE
    

    다음을 바꿉니다.

    • PROJECT_ID: 프로젝트 ID입니다.
    • DATASET: 업데이트하려는 테이블 또는 뷰가 포함된 데이터 세트의 이름입니다.
    • TABLE_OR_VIEW: 업데이트할 리소스의 이름입니다.
    • PATH_TO_FILE: 로컬 머신의 JSON 파일 경로입니다.

  2. JSON 파일의 access 섹션으로 변경합니다. specialGroup 항목(projectOwners, projectWriters, projectReaders, allAuthenticatedUsers)을 삭제할 수 있습니다. userByEmail, groupByEmail, domain도 삭제할 수 있습니다. 예를 들어 테이블 또는 뷰의 JSON 파일의 access 섹션은 다음과 비슷합니다.

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      },
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      },
      {
       "role": "READER",
       "domain": "domain_name"
      },
      {
       "role": "WRITER",
       "userByEmail": "user_email"
      },
      {
       "role": "READER",
       "groupByEmail": "group_email"
      }
     ],
     ...
    }
    

  3. bq set-iam-policy 명령어를 사용하여 정책을 업데이트합니다.

     bq set-iam-policy \
         PROJECT_ID:DATASET.TABLE_OR_VIEW \
         > PATH_TO_FILE
    

  4. 액세스 제어 변경사항을 확인하려면 파일에 정보를 쓰지 않고 get-iam-policy 명령어를 다시 사용합니다.

    bq get-iam-policy --format=prettyjson \
        PROJECT_ID:DATASET.TABLE_OR_VIEW
    

API

  1. 현재 정책을 검색하려면 tables.getIamPolicy 메서드를 호출합니다.
  2. 정책을 수정하여 구성원 또는 결합을 삭제합니다. 정책에 필요한 형식은 정책 참조 주제를 참조하세요.

  3. tables.setIamPolicy를 호출하여 업데이트된 정책을 작성합니다. 참고: 구성원이 없는 비어 있는 binding은 허용되지 않으며 이 경우 오류가 발생합니다.

자바

이 샘플을 사용해 보기 전에 BigQuery 빠른 시작: 클라이언트 라이브러리 사용Java 설정 안내를 따르세요. 자세한 내용은 BigQuery Java API 참조 문서를 확인하세요.

import com.google.cloud.Identity;
import com.google.cloud.Policy;
import com.google.cloud.Role;
import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

// Sample to update iam policy in table
public class UpdateIamPolicy {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    updateIamPolicy(datasetName, tableName);
  }

  public static void updateIamPolicy(String datasetName, String tableName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId tableId = TableId.of(datasetName, tableName);

      Policy policy = bigquery.getIamPolicy(tableId);
      Map<Role, Set<Identity>> binding = new HashMap<>(policy.getBindings());
      binding.remove(Role.of("roles/bigquery.dataViewer"));

      policy.toBuilder().setBindings(binding).build();
      bigquery.setIamPolicy(tableId, policy);

      System.out.println("Iam policy updated successfully");
    } catch (BigQueryException e) {
      System.out.println("Iam policy was not updated. \n" + e.toString());
    }
  }
}