BigQuery Column 보안을 위한 Policy Tags 사용법


  • BigQuery Column 수준의 보안을 가능하게 해주는 Policy Tags 사용 방법에 대해 작성한 글입니다
    • 글 작성하는 시점(20년 6월 21일)에 아직 Beta 기능이므로 추후에 기능이 변경될 수 있습니다

BigQuery Policy Tags

  • 한국어론 정책 태그라고 번역됨
  • Policy Tags는 Google Cloud Platform Data Catalog 서비스의 일부
    • Data Catalog는 메타데이터 관리 서비스
  • 필요한 상황
    • 특정 열을 권한에 따라 접근을 다르게 하고 싶은 경우
    • 데이터 보안이 필요한 경우
      • 예시 1) 직원 데이터를 저장한 경우 연봉 같은 민감한 정보는 인사팀 또는 연봉을 결정하는 임원급 이상에게만 볼 수 있도록 설정
      • 예시 2) 개인 정보 취급자에겐 개인 정보를 접근할 수 있도록 설정
  • 민감한 컬럼에 세분화된 액세스 권한 부여함
  • 계층을 나눠서 권한 설정 가능
    • High, Medium, Low 유형으로 데이터를 나누고 그 아래에 어떤 데이터가 들어간지 정의함



BigQuery Policy Tags 설정하는 방법

  • 1) Policy Tag 정의(=생성)
  • 2) BigQuery Column에 Policy Tag 할당
  • 3) Policy Tag를 사용할 유저에게 권한 부여



1) Policy Tag 정의

  • Google Cloud Platform의 콘솔에서 Data Catalog 클릭
  • 처음 접속시 API 사용 설정 필요
  • Data Catalog 메인에서 “정책 태그” 아래에 있는 정책 태그 생성 및 관리 클릭
    • 참고로 이 화면에서 가장 많이 쿼리된 BigQuery 테이블 및 뷰를 볼 수 있음(많이 사용되는 테이블 확인)
  • Policy Tag UI
  • 만들기 클릭하면 Policy Tag를 생성할 수 있음
  • 위 이미지에선 크게 High / Medium이란 최상위 Policy Tag를 생성하고, High 아래에 name, email Policy Tag를 생성했음
    • email 아래에 또 하위 Policy Tag를 생성할 수 있음
    • 여기선 간단하게 name만 사용할 예정
  • 만들어진 Policy Tags 확인
    • 메타데이터와 위에서 설정한 정책들을 볼 수 있음
  • “액세스 제어 적용”을 클릭해 Policy Tag가 적용되면 특정 권한을 가진 사람만 접근 되도록 설정



2) BigQuery Column에 Policy Tag 할당

  • Policy Tag를 적용하는 방법은 빅쿼리 스키마를 수정하는 방법과 같음
  • 사용할 Table로 이동해 데이터 확인
    • user 테이블은 channel_id, user_id, channel_name, user_name이 저장됨
    • user_name만 Policy Tag 적용할 예정ㅇ
  • 테이블을 클릭하고 “스키마”로 이동
    • 스키마쪽에 가면 “정책 태그”라는 열이 보임
  • 스키마 수정 클릭
  • 사용할 필드를 클릭하면 정책 태그 추가 버튼이 활성화됨. 정책 태그 추가 버튼 클릭
    • 아까 저장된 Policy Tag들이 보임. name을 클릭하고 선택 - 저장
  • 다시 테이블의 스키마쪽으로 접근
    • 액세스 권한이 없으므로 1열이 제한되었다고 나옴(저도 권한 설정을 아직 안한 상태)
  • 미리보기를 클릭하면 Policy Tag가 적용된 열은 보이지 않음
  • 강제로 쿼리를 날리려고 하면 에러 메세지 발생
    • User does not have permission to access policy tag “policy_tag_test: name” on column
  • 삭제는 BigQuery 웹 콘솔에서 스키마 수정 - 정책 태그 옆에 있는 x 버튼 클릭 후 저장하면 됨



3) Policy Tag를 사용할 유저에게 권한 부여

  • 이제 BigQuery Column에 정책 태그를 할당했으니 유저에게 권한 부여가 필요함
  • Policy Tag 관련해서 사용되는 Role은 딱 3개
    • ㄱ) roles/datacatalog.policyTagsAdmin(한국어 : Data Catalog 관리자)
    • ㄴ) roles/datacatalog.categoryAdmin(한국어 : 정책 태그 관리자)
    • ㄷ) roles/datacatalog.policyTagFineGrainedReader(한국어 : 세분화된 권한의 리더)
  • ㄱ) roles/datacatalog.policyTagsAdmin(한국어 : Data Catalog 관리자)
    • Data Catalog의 모든 요소에 접근할 수 있는 권한
  • ㄴ) roles/datacatalog.categoryAdmin(한국어 : 정책 태그 관리자)
    • Policy Tag 생성, 수정, 삭제 권한
    • 즉, Policy Tag를 생성하고 할당하는 사람에게 필요한 권한
  • ㄷ) roles/datacatalog.policyTagFineGrainedReader(한국어 : 세분화된 권한의 리더)
    • Policy Tag가 적용된 Column에 접근할 수 있는 권한
    • 즉, Policy Tag가 적용된 열을 볼 수 있는 권한
    • 이 권한은 Policy Tag마다 권한을 줄 수 있음
  • 자세한 설명은 Data Catalog 역할 참고
  • 아까 봤던 Policy Tag 페이지로 이동
    • Policy Tag를 체크하고 우측 정보 패널에서 “구성원 추가” 클릭 후, 세분화된 권한 설정
  • name Policy Tag에 snugyun01@gmail.com이 접근 가능해짐
  • email Policy Tag쪽은 유저를 설정하지 않았기 때문에 snugyun01@gmail.com은 권한이 없음
  • 이제 다시 빅쿼리 user 테이블로 이동
    • Policy Tag가 적용되어 있지만 아까처럼 제한되었다는 메세지는 없음
  • 쿼리를 날려도 정상적으로 나옴



Python에서 BigQuery Policy Tag 적용하기

  • BigQuery 웹 UI에서 Policy Tag를 적용할 수 있지만, WriteDisposition 옵션이 WRITE_TRUNCATE일 경우 테이블을 지우고 다시 생성해서 스키마와 관련된 정보가 삭제됨
  • Airflow BigQuery Operator에서 WRITE_TRUNCATE를 사용하면 Policy Tag를 한번 더 설정해야 함
    • 또는 WRITE_TRUNCATE를 쓰지 않고, 데이터만 DELETE하고 WRITE_APPEND하는 방법도 있지만 개인적으론 Policy Tag를 한번 더 할당하는 명시적인 방법을 선호함
  • 20년 6월 현재 google-cloud-bigquery 1.25.0 버전부터 Policy Tags를 지원한다고 하지만, 예제도 없고 사용하기도 조금 번거로움(기존 스키마를 복사하고, SchemaField를 새롭게 만들고 append해서 반영하는 방식)
    • google-cloud-bigquery 대신 google-api-python-client를 활용함
    • BigQuery API를 활용해 Request를 날림
    • 기존 Table의 스키마를 get하고, patch로 기존 데이터를 업데이트함
    • tables.patch 참고함
    • 이 때, Policy Tag 분류 ID와 Policy Tag ID를 알아야 하는데, 이건 Policy Tag UI에서 확인할 수 있음



정리하면

  • Policy Tags(정책 태그)는 Data Catalog의 기능 중 하나로, 빅쿼리의 열 수준 보안을 가능하게 함
  • Policy Tag 설정하는 방법
    • 1) Policy Tag 정의
    • 2) BigQuery Column에 Policy Tag 할당
    • 3) 유저에게 권한 부여
      • 데이터를 볼 권한은 roles/datacatalog.policyTagFineGrainedReader(한국어 : 세분화된 권한의 리더)를 부여하면 됨
  • WriteDisposition 옵션에서 WRITE_TRUNCATE를 사용하면 저장된 Policy Tag가 사라지니 한번 더 설정해야 함



개선이 필요한 부분(개인 생각)

  • Policy Tag를 사용하지 않다가 적용하면 기존에 SELECT * 이런 쿼리에서 에러가 발생할 수 있음
    • 그 사람이 볼 수 있는 권한을 가진 열들을 *로 표현할 수는 없나?
  • 스키마쪽에도 특정 열을 권한 설정했다는 것을 보여주는 것보다, 아예 안 보이는게 좋지 않을까?
  • 누가 이 Policy Tag 권한을 가지고 있는지는 보이지만, 어떤 열에 Policy Tag가 설정되어 있는진 직접 다 확인해야 함
  • 가격 책정 문서의 불명확함
  • 현재 베타니 추후엔 이런 내용은 개선될거라 믿습니다! :)



Reference


카일스쿨 유튜브 채널을 만들었습니다. 데이터 분석, 커리어에 대한 내용을 공유드릴 예정입니다.

PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다

이 글이 도움이 되셨거나 의견이 있으시면 댓글 남겨주셔요.

Buy me a coffeeBuy me a coffee





© 2017. by Seongyun Byeon

Powered by zzsza