IAM 조건으로 액세스 제어

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

IAM 조건을 사용하면 지정된 조건이 충족되는 경우에만 BigQuery 리소스에 대한 액세스 권한을 부여할 수 있습니다. 예를 들어 제한된 기간 동안 또는 특정 시간에 정기적으로 리소스에 대한 액세스 권한을 부여할 수 있습니다. 리소스의 조직, 폴더, 프로젝트, 데이터 세트 수준에서 IAM 조건을 추가할 수 있습니다. 조건이 있는 허용 정책은 하위 리소스에 상속됩니다. 리소스 수준에 관한 자세한 내용은 리소스 계층 구조를 참고하세요.

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

시작하기 전에

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

필요한 역할

BigQuery 리소스에 IAM 조건을 적용하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

이러한 사전 정의된 역할에는 BigQuery 리소스에 IAM 조건을 적용하는 데 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 펼치세요.

필수 권한

BigQuery 리소스에 IAM 조건을 적용하려면 다음 권한이 필요합니다.

  • 프로젝트 수준에서 조건부 IAM 액세스 설정: resourcemanager.projects.setIamPolicy
  • 데이터 세트에 조건부 IAM 액세스 권한을 설정합니다.
    • bigquery.datasets.setIamPolicy
    • bigquery.datasets.update

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

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

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

IAM API 사용 설정

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

콘솔

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

API 사용 설정하기

gcloud

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

gcloud services enable iam.googleapis.com

데이터 세트의 Conditional Access 정책 보기

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

콘솔

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

    BigQuery로 이동

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

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

  4. 연결된 역할 옆에 있는 조건:TITLE을 클릭하여 해당 역할의 조건을 확인합니다.

bq

Cloud Shell에서 조건부 액세스 정책을 보거나 업데이트하려면 Cloud Shell 버전 503.0.0 이상을 사용해야 합니다.

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

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

다음을 바꿉니다.

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

데이터 세트 리소스 JSON 파일의 access 속성에는 액세스 정책이 포함됩니다.

API

조건이 있는 데이터 세트의 액세스 정책을 보려면 accessPolicyVersion=3를 요청 매개변수로 사용하여 datasets.get를 호출합니다. 데이터 세트 리소스의 access 속성에는 액세스 정책이 포함되어 있습니다.

리소스의 조건부 액세스 수정

다음 섹션에서는 여러 리소스에 대한 조건부 액세스를 추가하거나 삭제하는 방법을 설명합니다.

조직, 폴더 또는 프로젝트에 조건 추가

BigQuery의 조직, 폴더 또는 프로젝트에 조건부 액세스를 추가하려면 조건이 있는 정책 허용을 참고하세요. 조건을 빌드할 때는 속성 형식 표를 참고하세요.

데이터 세트에 조건부 액세스 추가

데이터 세트에 조건을 추가하려면 다음 방법 중 하나를 선택합니다. 조건을 빌드할 때는 속성 형식 표를 참고하세요.

콘솔

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

    BigQuery로 이동

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

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

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

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

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

  7. IAM 조건 추가를 클릭합니다.

  8. 조건 속성을 사용하여 condition 필드에 조건을 추가합니다.

  9. IAM 조건 추가 패널에서 저장을 클릭합니다.

  10. DATASET에 액세스 권한 부여 패널에서 저장을 클릭합니다.

bq

Cloud Shell에서 조건부 액세스 정책을 보거나 업데이트하려면 Cloud Shell 버전 503.0.0 이상을 사용해야 합니다.

Cloud Shell을 사용하여 데이터 세트에 조건부 액세스 권한을 부여하려면 데이터 세트에 대한 액세스 권한 부여 안내를 따르세요. 데이터 세트 JSON 파일의 access 섹션에 조건부 액세스 조건을 추가할 수 있습니다.

예를 들어 데이터 세트 JSON 파일의 access 섹션에 다음을 추가하면 2032년 12월 31일까지 cloudysanfrancisco@gmail.comroles/bigquery.dataViewer 역할이 부여됩니다.

"access": [
  {
    "role": "roles/bigquery.dataViewer",
    "userByEmail": "cloudysanfrancisco@gmail.com",
    "condition": {
      "title": "Grant roles/bigquery.dataViewer until 2033",
      "description": "Role expires on December 31, 2032.",
      "expression": "request.time < timestamp('2032-12-31T12:00:00Z')"
    }
  }
]

API

BigQuery API를 사용하여 데이터 세트에 조건부 액세스 권한을 부여하려면 요청 매개변수에 accessPolicyVersion=3을 사용하여 데이터 세트에 대한 액세스 권한 부여에 관한 안내를 따르세요.

데이터 세트 리소스의 access.condition 속성에 액세스 조건이 있는 항목을 추가할 수 있습니다.

조건부 액세스 정책이 있는 데이터 세트의 경우 사용자는 accessPolicyVersion 요청 매개변수를 지정하지 않고 표준 읽기, 수정, 업데이트 흐름을 사용하여 무조건 액세스 설정을 업데이트할 수 있습니다.

데이터 세트에서 조건부 액세스 삭제하기

데이터 세트에서 조건을 삭제하려면 다음 방법 중 하나를 선택합니다. 조건을 빌드할 때는 속성 형식 표를 참고하세요.

콘솔

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

    BigQuery로 이동

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

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

  4. 액세스 권한을 취소하려는 주 구성원을 선택합니다.

  5. 삭제를 클릭합니다.

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

bq

Cloud Shell에서 조건부 액세스 정책을 보거나 업데이트하려면 Cloud Shell 버전 503.0.0 이상을 사용해야 합니다.

Cloud Shell을 사용하여 데이터 세트에 대한 조건부 액세스 권한을 삭제하려면 데이터 세트에 대한 액세스 권한 취소의 안내를 따르세요. 데이터 세트 JSON 파일의 access 섹션에서 조건이 있는 항목을 삭제할 수 있습니다.

API

BigQuery API를 사용하여 데이터 세트에 대한 조건부 액세스 권한을 취소하려면 요청 매개변수에 accessPolicyVersion=3을 사용하여 데이터 세트에 대한 액세스 권한 취소에 관한 안내를 따르세요.

데이터 세트 리소스의 access 속성에서 조건이 있는 항목을 삭제할 수 있습니다.

조건부 액세스 정책이 있는 데이터 세트의 경우 사용자는 accessPolicyVersion 요청 매개변수를 지정하지 않고 표준 읽기, 수정, 업데이트 흐름을 사용하여 무조건 액세스 설정을 업데이트할 수 있습니다.

조건 속성

다음 속성을 기반으로 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에서 조건을 빌드할 때는 다음 권장사항을 따르세요.

  • 정확성을 높이려면 resource.type, resource.name, resource.service에 양수 조건을 사용하는 것이 좋습니다. 지원되지 않는 유형은 빈 문자열로 표시되므로 부정 조건이 다양한 리소스와 일치할 수 있습니다. 자세한 내용은 부정 조건을 참고하세요.
  • 데이터 세트 수준 IAM 조건은 테이블, 뷰, 모델, 루틴과 같이 데이터 세트 내 리소스에 적용되는 역할에만 사용해야 합니다. bigquery.user 또는 bigquery.jobUser와 같이 데이터 세트 또는 프로젝트 수준에서 작동하는 역할을 부여하는 데 사용해서는 안 됩니다.
  • 데이터 세트 수준 정책에는 resource.type == 'bigquery.googleapis.com/Dataset' 조건을 사용하지 마세요. 인증에 영향을 미치지 않습니다. 이 속성은 테이블, 뷰, 루틴, 모델과 같은 하위 데이터 세트 리소스에 대한 액세스를 제어하기 위한 것입니다.
  • 구체성 수준이 필요하지 않더라도 조건에 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 조건으로 승인된 뷰, 승인된 루틴 또는 승인된 데이터 세트 권한 부여를 추가할 수 없습니다.
  • 조건이 있는 리소스를 보는 동안 호환되지 않는 accessPolicyVersion가 사용되면 바인딩에 withcond 뒤에 해시 값이 포함될 수 있습니다. 자세한 내용은 정책 및 역할 바인딩에서 withcond 문제 해결을 참고하세요.
  • 데이터 세트 또는 테이블에 대한 조건부 액세스 권한이 있는 사용자는 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
  }
}

다음 단계