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


카일스쿨 유튜브 채널을 만들었습니다. 데이터 사이언스, 성장, 리더십, BigQuery 등을 이야기할 예정이니, 관심 있으시면 구독 부탁드립니다 :)

이 글이 도움이 되셨다면 추천 클릭을 부탁드립니다 :)

Buy me a coffeeBuy me a coffee





© 2017. by Seongyun Byeon

Powered by zzsza