Row-level security 란?
사용자 또는 사용자 그룹에 설정되어 있는 조건에 따라 데이터를 필터링하고 테이블의 특정 행 접근을 허용 또는 제한하는 보안 수준입니다. Policy tag를 통해 column 액세스를 제어하고, row-level security로 row 액세스를 제어함으로써 사용자들에게 최소 권한을 부여할 수 있습니다. 테이블 당 여러개의 row-level access policy를 설정할 수 있으며, column-level, table-level, dataset-level, project-level 액세스 정책과 함께 설정 가능합니다.
BigQuery 테이블에 row-level access policy를 생성하면, 이 policy는 사용자가 특정 테이블을 조회할 시에 해당 데이터 row 접근 가능여부를 확인한 후, allowed list에 있는 사용자에게만 특정 데이터 행을 보여줍니다.
Row-level access policy 생성을 위해 필요한 IAM 권한은 다음과 같습니다.
- bigquery.rowAccessPolicies.create
- bigquery.rowAccessPolicies.setIamPolicy
- bigquery.tables.getData (on the target table)
- bigquery.jobs.create (to run the DDL query job)
Row-level access policy 수정에 필요한 IAM 권한은 다음과 같습니다.
- bigquery.rowAccessPolicies.update
- bigquery.rowAccessPolicies.setIamPolicy
- bigquery.tables.getData (on the target table)
- bigquery.jobs.create (to run the DDL query job)
Row-level access policy를 생성 및 수정을 할 수있는 권한이 포함된 predefined IAM Role, BigQuery Admin (bigquery.admin) 또는 BigQuery DataOwner (bigquery.dataOwner) 를 부여하는 방법도 있습니다.
정책 생성을 할 때, 정책을 적용시킬 테이블 이름을 지정하고, 해당 테이블 row에 접근 가능하게 할 사용자 또는 사용자 그룹(grantee-list) 을 지정해줍니다. 또한, 어떤 데이터를 기준 (filter_expression)으로 필터링할 것인지도 설정해줍니다.
Row-level security 사용 사례
1. Region 단위로 row data를 필터링
- 예를 들어 dataset1.table1안에 여러 리전의 데이터를 포함하고 있고 “region” column으로 분류할 수 있는 경우, 정책을 통해 APAC 리전 사용자는 APAC 데이터만, US 사용자는 US 데이터만 접근 할 수 있도록 설정할 수 있습니다. 또한 APAC이나 US region에 속하지 않은 사용자는 어떤 row도 표시되지 않습니다.

2. 민감한 데이터 기반의 row 데이터 필터링
- 예를 들어, 직원들의 정보와 연봉이 저장된 테이블에 row level access policy를 생성한다고 할 때, 데이터 접근가능 list(grantee_list)에는 모든 회사 임직원을 포함시키고, SESSION_USER()라는 함수를 추가로 설정해준다면, 쿼리를 조회하는 사용자의 정보만 조회되도록 할 수 있습니다. 이 예시에서는 Email = SESSION_USER()로 지정했기 때문에, email 주소가 jim@example.com 인 row만 표시되게 됩니다.

Row-level security 적용 방법
- 리전 기반으로 필터링을 하는 예시 쿼리
1. row-level access policy 생성 및 업데이트


2. 여러 사용자나 그룹에게 액세스 권한을 부여하는 경우

3. 현재 사용자에게만 권한 부여

4. Column type이 ARRAY인 경우

5. Row-level access policy를 삭제

또는

※ 정책에 적용된 사용자를 추가 또는 삭제를 원하실 경우에는 현재 기준 DDL statement를 통해서만 수정하실 수 있습니다.
Example

- “row_level_test” dataset 안에 “global_purchase_history”라는 테이블 데이터입니다.

- 특정 User에게 “KOR” 데이터만 볼 수 있도록 row_level access policy를 생성하였습니다.

- User는 country가 “KOR”인 row 만 조회 할 수 있다는 것을 확인할 수 있습니다.

- “View row access policies” 란 버튼을 클릭하면 해당 테이블에 설정되어 있는 row access policy들을 보실 수 있습니다.

- VIEW를 클릭하시면, 해당 정책에 어떤 사용자나 Role이 포함되어 있는지 확인하실 수 있습니다.
