IAM 조건으로 액세스 제어

이 문서에서는 IAM 조건을 사용하여 BigQuery 리소스에 대한 액세스를 제어하는 방법을 설명합니다.

IAM 조건을 사용하면 지정된 조건이 충족되는 경우에만 BigQuery 리소스에 대한 액세스 권한을 부여할 수 있습니다. 예를 들어 제한된 기간 동안 또는 특정 시간에 정기적으로 리소스에 대한 액세스 권한을 부여할 수 있습니다. IAM 조건은 프로젝트, 폴더, 조직 수준에서 지원되며 BigQuery 데이터 세트, 테이블, 뷰, 루틴, 모델에 적용할 수 있습니다.

IAM 조건은 아직 존재하지 않는 리소스를 포함하여 여러 관련 리소스에 동시에 Identity and Access Management(IAM) 권한을 부여하는 데 유용합니다. 관련 없는 BigQuery 리소스 그룹에 권한을 부여하려면 IAM 태그를 사용하는 것이 좋습니다.

시작하기 전에

IAM API를 사용 설정하고 사용자에게 이 문서의 각 태스크를 수행하는 데 필요한 권한을 부여하는 IAM 역할을 부여합니다.

IAM API 사용 설정

IAM API를 사용 설정하려면 다음 옵션 중 하나를 선택합니다.

콘솔

Identity and Access Management(IAM) API 페이지로 이동하여 API를 사용 설정합니다.

API 사용 설정하기

gcloud

gcloud services enable 명령어를 실행합니다.

gcloud services enable iam.googleapis.com

필수 권한

BigQuery 리소스에 IAM 조건을 적용하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트 IAM 관리자(roles/resourcemanager.projectIamAdmin) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

이 사전 정의된 역할에는 BigQuery 리소스에 IAM 조건을 적용하는 데 필요한 resourcemanager.projects.setIamPolicy 권한이 포함되어 있습니다.

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

조직 전체에 IAM 조건을 사용하려면 조직 정책을 관리할 수 있는 권한도 필요합니다.

BigQuery에서 IAM 역할 및 권한에 대한 자세한 내용은 IAM 소개를 참조하세요.

조건 속성

다음 속성을 기반으로 BigQuery 리소스에 IAM 조건을 설정할 수 있습니다.

  • request.time: 사용자가 BigQuery 리소스에 액세스하려고 시도한 시간입니다. 자세한 내용과 예시는 날짜/시간 속성을 참조하세요.
  • resource.name: BigQuery 리소스의 경로입니다. 형식은 속성 형식의 표를 참조하세요.
  • resource.type: BigQuery 리소스의 유형입니다. 형식은 속성 형식의 표를 참조하세요.
  • resource.service: BigQuery 리소스가 사용하는 Google Cloud 서비스입니다. 형식은 속성 형식의 표를 참조하세요.
  • resource.tags: BigQuery 리소스에 연결된 태그입니다. 태그는 BigQuery 데이터 세트, 테이블, 뷰 리소스에서만 지원됩니다. 형식은 속성 형식IAM 문서의 표를 참조하세요.

속성 형식

BigQuery 데이터 세트의 조건을 만들 때는 다음 형식을 사용합니다.

속성
resource.type bigquery.googleapis.com/Dataset
resource.name projects/PROJECT_ID/datasets/DATASET_ID
resource.service bigquery.googleapis.com
resource.tags hasTagKey, hasTagKeyId, matchTag, matchTagId가 지원됩니다. 자세한 내용은 리소스 태그를 참조하세요.

BigQuery 테이블 및 뷰의 조건을 만들 때는 다음 형식을 사용합니다.

속성
resource.type bigquery.googleapis.com/Table
resource.name projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_ID
resource.service bigquery.googleapis.com
resource.tags hasTagKey, hasTagKeyId, matchTag, matchTagId가 지원됩니다. 자세한 내용은 리소스 태그를 참조하세요.

BigQuery 루틴의 조건을 만들 때는 다음 형식을 사용합니다.

속성
resource.type bigquery.googleapis.com/Routine
resource.name projects/PROJECT_ID/datasets/DATASET_ID/routines/ROUTINE_ID
resource.service bigquery.googleapis.com

BigQuery 모델의 조건을 만들 때는 다음 형식을 사용합니다.

속성
resource.type bigquery.googleapis.com/Model
resource.name projects/PROJECT_ID/datasets/DATASET_ID/models/MODEL_ID
resource.service bigquery.googleapis.com

다음을 바꿉니다.

  • PROJECT_ID: 액세스 권한을 부여할 리소스가 포함된 프로젝트의 ID입니다.
  • DATASET_ID: 액세스 권한을 부여할 데이터 세트의 ID입니다.
  • TABLE_ID: 액세스 권한을 부여할 테이블 또는 뷰의 ID입니다.
  • ROUTINE_ID: 액세스 권한을 부여할 루틴의 ID입니다.
  • MODEL_ID: 액세스 권한을 부여할 모델의 ID입니다.

리소스에 조건 추가

BigQuery의 데이터 세트, 테이블, 뷰, 루틴 또는 모델에 조건을 추가하려면 조건이 있는 정책 허용을 참고하세요. 조건을 빌드할 때는 속성 형식 표를 참조하세요.

조건 권장사항

BigQuery에서 조건을 빌드할 때는 다음 권장사항을 따르세요.

  • resource.type, resource.name, resource.service에는 부정 조건을 사용하지 마세요. 지원되지 않는 유형은 빈 문자열을 사용하고 거의 모든 부정 조건과 일치하기 때문입니다. 자세한 내용은 부정 조건을 참조하세요.
  • 구체성 수준이 필요하지 않더라도 조건에 resource.type, resource.name, resource.service를 포함합니다. 이렇게 하면 워크플로의 리소스가 변경될 때 조건을 유지하여 향후 다른 리소스가 의도치 않게 포함되지 않도록 합니다.
  • 권한을 부여할 때는 의도치 않게 과도한 액세스 권한을 부여하지 않도록 최대한 좁은 범위의 권한 집합을 포함합니다.
  • resource.name.startsWith를 주의해서 사용하세요. BigQuery 테이블 및 뷰 경로에는 상위 프로젝트 ID 및 데이터 세트 ID가 접두사로 붙습니다. 조건이 충분히 구체적이지 않으면 액세스 권한이 너무 많이 부여될 수 있습니다. 하지만 resource.name.startsWith 속성을 사용하여 사용자가 테이블에서 와일드 카드 쿼리를 실행하도록 허용할 수 있습니다. 예를 들어 resource.name.startsWith("projects/my_project/datasets/my_dataset/tables/table_prefix") 조건을 사용하여 액세스 권한을 부여하면 사용자가 SELECT * FROM my_dataset.table_prefix* 쿼리를 실행할 수 있습니다.
  • 데이터 세트, 테이블, 뷰, 루틴, 모델 이외의 BigQuery 리소스에 조건을 추가하지 마세요.
  • 올바른 리소스에 올바른 권한을 부여하고 있는지 확인합니다. 예를 들어 리소스(bigquery.RESOURCE.list)를 나열할 수 있는 권한은 상위 수준에서 부여되어야 하지만 리소스(bigquery.RESOURCE.delete)를 삭제할 수 있는 권한은 리소스 수준에서 부여되어야 합니다. 포함된 리소스가 모두 삭제되는 데이터 세트 삭제에는 데이터 세트에 대한 테이블, 모델, 루틴 삭제 권한이 필요합니다.
  • 테이블 스냅샷시간 이동은 권한에 영향을 미치지 않습니다.

부정 조건

resource.name != resource와 같은 부정 조건은 의도치 않게 과도한 액세스 권한을 부여할 수 있습니다. 지원되지 않는 BigQuery 리소스에는 리소스 속성이 비어 있습니다. 즉, 모든 부정 조건과 일치합니다. BigQuery 외부 서비스의 리소스도 부정 조건과 일치할 수 있습니다.

또한 부정 조건은 사용자가 와일드 카드로 쿼리를 실행할 때 문제를 만듭니다. 예를 들어 부정 조건 resource.name != /projects/my_project/datasets/my_dataset/tables/secret을 살펴보겠습니다. 이 조건은 secret이라는 테이블을 제외한 모든 리소스에 대한 액세스 권한을 부여하는 것으로 보입니다. 하지만 사용자는 여전히 SELECT * from my_project.my_dataset.secre*;와 같은 와일드 카드 쿼리를 사용하여 해당 테이블을 쿼리할 수 있습니다.

또한 테이블, 루틴, 모델에 대한 부정 조건으로 인해 상위 데이터 세트에 대한 과도한 액세스 권한이 부여될 수 있습니다. 그러면 삭제 권한이 데이터 세트 수준에서 관리되므로 사용자가 이러한 리소스를 삭제할 수 있습니다.

제한사항

  • IAM 조건으로 승인된 뷰, 승인된 루틴 또는 승인된 데이터 세트 권한 부여를 추가할 수 없습니다.
  • 데이터 세트 또는 테이블에 대한 조건부 액세스 권한이 있는 사용자는 Google Cloud 콘솔을 통해 해당 리소스에 대한 권한을 수정할 수 없습니다. 권한 수정은 bq 도구 및 BigQuery API를 통해서만 지원됩니다.
  • 행 수준 및 열 수준 액세스 제어는 IAM 조건을 통해 직접 지원되지 않습니다. 그러나 조건부 액세스 권한이 있는 사용자는 테이블에 대한 BigQuery 관리자 역할(roles/bigquery.admin)을 자신에게 부여한 후 행 및 열 액세스 정책을 수정할 수 있습니다.
  • IAM 정책 변경사항이 적용되려면 최대 5분이 걸릴 수 있습니다.
  • 조건부 액세스 권한이 있는 사용자는 INFORMATION_SCHEMA를 쿼리하지 못할 수 있습니다.
  • 조건부 테이블 액세스 권한만 있는 사용자는 테이블 와일드 카드 함수를 실행할 수 없습니다.

예시

다음은 BigQuery에서 IAM 조건의 사용 사례 예시입니다.

특정 테이블에 대한 읽기 액세스 권한 부여

이 예시에서는 cloudysanfrancisco@gmail.com에게 dataset_1 데이터 세트의 table_1 테이블에 대한 BigQuery 데이터 뷰어 역할을 부여합니다. 이 역할이 있는 사용자는 bq 도구를 통해 테이블을 쿼리하고 액세스할 수 있습니다. 사용자에게 데이터 세트에 대한 bigquery.tables.list 권한이 없으므로 Google Cloud 콘솔에서 테이블을 볼 수 없습니다.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataViewer,
  "condition": {
    "title": "Table dataset_1.table_1",
    "description": "Allowed to read table with name table_1 in dataset_1 dataset",
    "expression":
resource.name == projects/project_1/datasets/dataset_1/tables/table_1
&& resource.type == bigquery.googleapis.com/Table
  }
}

특정 데이터 세트에 대한 나열 액세스 권한 부여

이 예시에서는 cloudysanfrancisco@gmail.com에게 dataset_2 데이터 세트에 대한 BigQuery 메타데이터 뷰어 역할을 부여합니다. 이 역할이 있는 사용자는 데이터 세트의 모든 리소스를 나열할 수 있지만 해당 리소스에 대해 쿼리를 실행할 수는 없습니다.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.metadataViewer,
  "condition": {
    "title": "Dataset dataset_2",
    "description": "Allowed to list resources in dataset_2 dataset",
    "expression":
resource.name == projects/project_2/datasets/dataset_2
&& resource.type == bigquery.googleapis.com/Dataset
  }
}

특정 프리픽스가 있는 모든 데이터 세트의 모든 테이블에 대한 소유자 액세스 권한 부여

이 예에서는 cloudysanfrancisco@gmail.com에게 public_ 프리픽스로 시작하는 모든 데이터 세트의 모든 테이블에 대한 BigQuery 데이터 소유자 역할을 부여합니다.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables public_",
    "description": "Allowed owner access to tables in datasets with public_ prefix",
    "expression":
resource.name.startsWith("projects/project_3/datasets/public_")
&& resource.type == bigquery.googleapis.com/Table
  }
}

특정 프리픽스가 있는 모든 데이터 세트의 모든 테이블, 모델, 루틴에 대한 소유자 액세스 권한 부여

이 예에서는 cloudysanfrancisco@gmail.com에게 general_ 프리픽스로 시작하는 모든 데이터 세트의 모든 테이블, 모델, 루틴에 대한 BigQuery 데이터 소유자 역할을 부여합니다.

{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Tables general_",
    "description": "Allowed owner access to tables in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Table
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Models general_",
    "description": "Allowed owner access to models in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Model
  }
},
{
  "members": [cloudysanfrancisco@gmail.com],
  "role": roles/bigquery.dataOwner,
  "condition": {
    "title": "Routines general_",
    "description": "Allowed owner access to routines in datasets with general_ prefix",
    "expression":
resource.name.startsWith("projects/project_4/datasets/general_")
&& resource.type == bigquery.googleapis.com/Routine
  }
}

다음 단계