행 수준 보안 사용
이 문서에서는 BigQuery의 행 수준 보안을 사용하여 데이터에 대한 액세스를 테이블 행 수준에서 제한하는 방법을 설명합니다. 이 문서를 읽기 전에 BigQuery 행 수준 보안 소개를 참조하여 행 수준 보안에 대한 개요를 숙지하세요.
행 수준 액세스 정책을 사용하여 다음 태스크를 수행할 수 있습니다.
- 테이블에서 행 수준 액세스 정책 만들기 또는 업데이트
- 테이블에서 행 수준 액세스 정책 결합
- 테이블의 행 수준 액세스 정책 나열
- 테이블에서 행 수준 액세스 정책을 삭제합니다.
- 행 수준 액세스 정책으로 테이블 쿼리
시작하기 전에
사용자에게 이 문서의 각 작업을 수행하는 데 필요한 권한을 부여하는 Identity and Access Management(IAM) 역할을 부여합니다. 태스크를 수행하는 데 필요한 권한(있는 경우)이 태스크의 '필요한 권한' 섹션에 나열됩니다.
행 수준 액세스 정책 만들기 또는 업데이트
데이터 정의 언어(DDL) 문을 사용하여 BigQuery의 테이블에서 행 수준 액세스 정책을 만들거나 업데이트할 수 있습니다.
필수 권한
BigQuery 테이블에 행 수준 액세스 정책을 만들려면 다음 IAM 권한이 필요합니다.
bigquery.rowAccessPolicies.create
bigquery.rowAccessPolicies.setIamPolicy
bigquery.tables.getData
(대상 테이블 및 부여된 서브 쿼리 행 수준 액세스 정책에서 참조된 테이블)- (DDL 쿼리 작업 실행을 위한)
bigquery.jobs.create
BigQuery 테이블에서 행 수준 액세스 정책을 업데이트하려면 다음 IAM 권한이 필요합니다.
bigquery.rowAccessPolicies.update
bigquery.rowAccessPolicies.setIamPolicy
bigquery.tables.getData
(대상 테이블 및 부여된 서브 쿼리 행 수준 액세스 정책에서 참조된 테이블)- (DDL 쿼리 작업 실행을 위한)
bigquery.jobs.create
다음과 같은 사전 정의된 각 IAM 역할에는 행 수준 액세스 정책을 만들고 업데이트하는 데 필요한 권한이 포함되어 있습니다.
roles/bigquery.admin
roles/bigquery.dataOwner
bigquery.filteredDataViewer
역할
행 수준 액세스 정책을 성공적으로 만들기 위해 피부여자 목록의 구성원에 bigquery.filteredDataViewer
역할을 자동으로 부여합니다. bigquery.filteredDataViewer
역할은 정책 필터 표현식으로 정의된 행 보기 기능을 부여합니다. Google Cloud 콘솔에서 테이블의 행 수준 액세스 정책을 나열하면 이 역할이 정책의 피부여자 목록의 구성원과 연결되어 표시됩니다.
IAM과 함께 bigquery.filteredDataViewer
역할을 사용할 때 추천되는 행 수준 보안 권장사항을 참조하세요.
BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.
행 수준 액세스 정책 만들기 또는 업데이트
행 수준 액세스 정책을 만들거나 업데이트하려면 다음 DDL 문 중 하나를 사용합니다.
CREATE ROW ACCESS POLICY
는 새 행 수준 액세스 정책을 만듭니다.CREATE ROW ACCESS POLICY IF NOT EXISTS
는 지정된 테이블에 이름이 같은 행 수준 액세스 정책이 아직 없으면 새 행 수준 액세스 정책을 만듭니다.CREATE OR REPLACE ROW ACCESS POLICY
문은 지정된 테이블에 이름이 같은 행 수준 액세스 정책으로 기존 행 수준 액세스 정책을 업데이트합니다.
예시
새 행 액세스 정책을 만듭니다. 테이블에 대한 액세스는 abc@example.com
사용자로 제한됩니다. region = 'APAC'
에 해당하는 행만 표시됩니다.
CREATE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (region = 'APAC');
대신 example@exampleproject.iam.gserviceaccount.com
서비스 계정에 적용되도록 액세스 정책을 업데이트합니다.
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('serviceAccount:example@exampleproject.iam.gserviceaccount.com') FILTER USING (region = 'APAC');
사용자와 두 그룹에 액세스를 부여하는 행 액세스 정책을 만듭니다.
CREATE ROW ACCESS POLICY sales_us_filter ON project.dataset.my_table GRANT TO ('user:john@example.com', 'group:sales-us@example.com', 'group:sales-managers@example.com') FILTER USING (region = 'US');
allAuthenticatedUsers
를 피부여자로 행 액세스 정책 만들기
CREATE ROW ACCESS POLICY us_filter ON project.dataset.my_table GRANT TO ('allAuthenticatedUsers') FILTER USING (region = 'US');
현재 사용자를 기준으로 하는 필터로 행 액세스 정책 만들기
CREATE ROW ACCESS POLICY my_row_filter ON dataset.my_table GRANT TO ('domain:example.com') FILTER USING (email = SESSION_USER());
ARRAY
유형의 열에 대한 필터로 행 액세스 정책 만들기
CREATE ROW ACCESS POLICY my_reports_filter ON project.dataset.my_table GRANT TO ('domain:example.com') FILTER USING (SESSION_USER() IN UNNEST(reporting_chain));
서브 쿼리로 행 액세스 정책을 만들어 사용자별로 구성된 간단한 리전 비교로 여러 정책을 바꿉니다.
이 기능에 대한 의견을 제공하거나 지원을 요청하려면 bigquery-row-level-security-support@google.com으로 이메일을 보내주세요.lookup_table
테이블을 참조하세요.
+-----------------+--------------+ | email | region | +-----------------+--------------+ | xyz@example.com | europe-west1 | | abc@example.com | us-west1 | | abc@example.com | us-west2 | +-----------------+--------------+
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('domain:example.com') FILTER USING (region IN ( SELECT region FROM lookup_table WHERE email = SESSION_USER()));
lookup_table
에서 서브 쿼리를 사용하면 행 액세스 정책 여러 개를 만들지 않아도 됩니다. 예를 들어 앞의 문은 쿼리 수가 더 적지만 다음과 동일한 결과를 반환합니다.
CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (region = 'us-west1'); CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (region IN 'us-west1', 'us-west2'); CREATE OR REPLACE ROW ACCESS POLICY apac_filter ON project.dataset.my_table GRANT TO ('user:xyz@example.com') FILTER USING (region = 'europe-west1');
구문 및 사용 가능한 옵션에 대한 자세한 내용은 CREATE ROW ACCESS POLICY
DDL 문 참조를 확인하세요.
행 수준 액세스 정책 조합
2개 이상의 행 수준 액세스 정책이 사용자 또는 그룹에 동일한 테이블에 대해 액세스 권한을 부여하는 경우 사용자 또는 그룹이 해당 정책에 포함된 모든 데이터에 액세스할 수 있습니다.
예를 들어 다음 정책은 my_table
테이블의 지정된 행에 대한 abc@example.com
액세스 권한을 사용자에게 부여합니다.
CREATE ROW ACCESS POLICY shoes ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (product_category = 'shoes');
CREATE OR REPLACE ROW ACCESS POLICY blue_products ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (color = 'blue');
앞의 예시에서 abc@example.com
사용자는 product_category
필드가 shoes
로 설정된 my_table
테이블의 행에 액세스할 수 있고 abc@example.com
이 color
필드가 blue
로 설정된 행에도 액세스할 수 있습니다.
예를 들어 abc@example.com
은 빨간 신발과 파란 자동차에 대한 정보가 있는 행에 액세스할 수 있습니다.
이 액세스는 다음과 같은 단일 행 수준 액세스 정책으로 제공된 액세스와 동일합니다.
CREATE ROW ACCESS POLICY shoes_and_blue_products ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (product_category = 'shoes' OR color = 'blue');
반면에 2개 이상의 true 조건에 종속된 액세스를 지정하려면 AND
연산자와 함께 필터를 사용합니다. 예를 들어 다음 행 수준 액세스 정책은 product_category
필드가 shoes
로 설정되었고 color
필드가 blue
로 설정된 행에 대해서만 abc@example.com
에 액세스 권한을 부여합니다.
CREATE ROW ACCESS POLICY blue_shoes ON project.dataset.my_table GRANT TO ('user:abc@example.com') FILTER USING (product_category = 'shoes' AND color = 'blue');
이전 행 수준 액세스 정책에서 abc@example.com
은 파란색 신발에 대한 정보에 액세스할 수 있지만 빨간색 신발 또는 파란색 자동차에 대해서는 액세스할 수 없습니다.
테이블 행 수준 액세스 정책 나열
Google Cloud 콘솔, bq 명령줄 도구 또는 RowAccessPolicies.List
API 메서드를 사용하여 테이블의 모든 행 수준 액세스 정책을 나열하고 볼 수 있습니다.
필수 권한
BigQuery 테이블에서 행 수준 액세스 정책을 나열하려면 bigquery.rowAccessPolicies.list
IAM 권한이 필요합니다.
BigQuery 테이블에서 행 수준 액세스 정책의 멤버를 보려면 bigquery.rowAccessPolicies.getIamPolicy
IAM 권한이 필요합니다.
다음과 같은 사전 정의된 각 IAM 역할에는 행 수준 액세스 정책을 나열하고 확인하기 위해 필요한 권한이 포함되어 있습니다.
roles/bigquery.admin
roles/bigquery.dataOwner
BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.
테이블 행 수준 액세스 정책 나열
행 수준 액세스 정책을 나열하려면 다음을 수행합니다.
콘솔
행 수준 액세스 정책을 보려면 Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.
테이블 이름을 클릭하여 세부정보를 확인한 후 행 액세스 정책 보기를 클릭합니다.
행 액세스 정책 패널이 열리면 테이블의 모든 행 수준 액세스 정책의 이름 및 각 정책에 대한
filter_expression
의 목록이 표시됩니다.행 수준 액세스 정책의 영향을 받는 모든 역할 및 사용자를 보려면 정책 옆에 있는 보기를 클릭합니다. 예를 들어 아래 이미지의 권한 보기 패널에서 피부여자 목록 멤버에게
bigquery.filteredDataViewer
역할이 있음을 확인할 수 있습니다.
bq
bq ls
명령어를 입력하고 --row_access_policies
플래그를 제공합니다.
데이터 세트와 테이블 이름이 필요합니다.
bq ls --row_access_policies dataset.table
예를 들어 다음 명령어는 ID가 my_dataset
인 데이터 세트에서 my_table
이라는 테이블의 행 수준 액세스 정책에 대한 정보를 나열합니다.
bq ls --row_access_policies my_dataset.my_table
API
REST API 참조 섹션에서 RowAccessPolicies.List
메서드를 사용합니다.
행 수준 액세스 정책 삭제
해당 권한이 있는 경우 DDL 문을 사용하여 테이블에서 하나 또는 모든 행 수준 액세스 정책을 삭제할 수 있습니다.
필수 권한
행 수준 액세스 정책을 삭제하려면 다음 IAM 권한이 필요합니다.
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
- (DDL 쿼리 작업 실행을 위한)
bigquery.jobs.create
테이블에서 모든 행 수준 액세스 정책을 동시에 삭제하려면 다음 IAM 권한이 필요합니다.
bigquery.rowAccessPolicies.delete
bigquery.rowAccessPolicies.setIamPolicy
bigquery.rowAccessPolicies.list
- (DDL 쿼리 작업 실행을 위한)
bigquery.jobs.create
다음과 가은 사전 정의된 각 IAM 역할에는 행 수준 액세스 정책을 삭제하기 위해 필요한 권한이 포함되어 있습니다.
roles/bigquery.admin
roles/bigquery.dataOwner
BigQuery의 IAM 역할과 권한에 대한 자세한 내용은 사전 정의된 역할 및 권한을 참조하세요.
행 수준 액세스 정책 삭제
테이블에서 행 액세스 정책을 삭제하려면 다음 DDL 문을 사용합니다.
DROP ROW ACCESS POLICY
문은 지정된 테이블에서 행 수준 액세스 정책을 삭제합니다.지정된 테이블에 행 액세스 정책이 있는 경우
DROP ROW ACCESS POLICY IF EXISTS
문은 행 수준 액세스 정책을 삭제합니다.DROP ALL ROW ACCESS POLICIES
문은 지정된 테이블에서 모든 행 수준 액세스 정책을 삭제합니다.
예시
테이블에서 행 수준 액세스 정책을 삭제합니다.
DROP ROW ACCESS POLICY my_row_filter ON project.dataset.my_table;
테이블에서 모든 행 수준 액세스 정책을 삭제합니다.
DROP ALL ROW ACCESS POLICIES ON project.dataset.my_table;
행 수준 액세스 정책 삭제에 대한 자세한 내용은 DROP ROW ACCESS POLICY
DDL 문 참조를 확인하세요.
행 액세스 정책으로 테이블 쿼리
해당 테이블에서 행 액세스 정책의 grantee_list
에 있더라도 이를 쿼리할 수 있으려면 사용자에게 먼저 BigQuery 테이블에 대한 액세스 권한이 있어야 합니다. 이 권한이 없으면 access
denied
오류와 함께 쿼리가 실패합니다.
필수 권한
행 수준 액세스 정책으로 BigQuery 테이블을 쿼리하려면 bigquery.tables.getData
IAM 권한과 bigquery.rowAccessPolicies.getFilteredData
IAM 권한이 필요합니다. 모든 관련 테이블에 대해 bigquery.tables.getData
IAM 권한이 있어야 합니다.
사전 정의된 역할로 이러한 권한을 얻으려면 roles/bigquery.dataViewer
과 roles/bigquery.filteredDataViewer
IAM 역할을 부여받아야 합니다.
열 수준 보안을 사용하는 모든 관련 열에 대해 datacatalog.categories.fineGrainedGet
권한이 있어야 합니다. 사전 정의된 역할로 이 권한을 얻으려면 datacatalog.categoryFineGrainedReader
역할이 필요합니다.
쿼리 결과 보기
Google Cloud 콘솔에서 행 수준 액세스 정책이 있는 테이블을 쿼리하면 BigQuery는 결과가 행 수준 액세스 정책으로 필터링될 수 있음을 나타내는 배너 알림을 표시합니다. 이 알림은 정책 피부여자 목록의 구성원인 경우에도 표시됩니다.
작업 통계
Job API를 사용하여 행 수준 액세스 정책이 있는 테이블을 쿼리하면 BigQuery는 쿼리가 행 액세스 정책이 있는 테이블을 읽는지 여부를 Job
응답 객체에 표시합니다.
예
이 Job
객체 응답은 간단한 설명을 위해 일부 내용만 표시되어 있습니다.
{
"configuration": {
"jobType": "QUERY",
"query": {
"priority": "INTERACTIVE",
"query": "SELECT * FROM dataset.table",
"useLegacySql": false
}
},
...
"statistics": {
...
rowLevelSecurityStatistics: {
rowLevelSecurityApplied: true
},
...
},
"status": {
"state": "DONE"
},
...
}
다음 단계
행 수준 보안이 다른 BigQuery 기능 및 서비스와 연동하는 방법에 대한 자세한 내용은 다른 BigQuery 기능과 함께 행 수준 보안 사용을 참조하세요.
행 수준 보안에 대한 권장사항은 BigQuery의 행 수준 보안 권장사항을 참조하세요.