Cloud KMS를 활용한 BigQuery Column 수준 암호화

현온·2024년 1월 11일
0

BigQuery

목록 보기
2/2
post-thumbnail

BigQuery의 데이터 암호화의 방법에는 기본적인 GCP에서 제공하는 저장 데이터 암호화테이블의 개별 값 암호화가 있습니다. 또한 데이터를 보호하기 위해서 조직 정책을 활용하여 Policy Tag를 이용하여 데이터의 노출을 피하는 방식이 있습니다.

여기서는 테이블의 개별 값 암호화, 즉 Column 수준 암호화에 대해 다뤄보겠습니다.
Column 수준 암호화는 다음과 같은 순서로 진행됩니다.

  1. Cloud KMS 키링 생성
  2. Cloud KMS 키 생성
  3. Keyset 생성
  4. 암호화 및 복호화

1. Cloud KMS 키링 생성하기

1) GCP Console에서 키 관리 페이지 접속
https://console.cloud.google.com/security/kms/keyrings?hl=ko&_ga=2.76039126.232434036.1704672176-1838138732.1691471520
2) 키를 만들 키링 생성


2. Cloud KMS 키 만들기
1) 1 에서 만든 키링 선택
2) 키 만들기
이미지 외의 것들은 default로 진행


3. Keyset 생성하기
키 세트는 2 가지 방법으로 만들 수 있는데, 여기서는 래핑된 키 세트를 생성 후 사용합니다.

원시 키 세트 만들기

SELECT KEYS.NEW_KEYSET('AEAD_AES_GCM_256') as raw_keyset;

래핑된 키 세트 만들기

SELECT KEYS.NEW_WRAPPED_KEYSET("gcp-kms://projects/<project_id>/locations/asia-northeast3/keyRings/test_key_ring/cryptoKeys/test-key", "AEAD_AES_GCM_256");

키 세트 디코딩은 다음 쿼리를 이용하여 진행합니다.

래핑된 키 세트 디코딩

SELECT FORMAT('%T', FROM_BASE64(WRAPPED_KEYSET_ENCODED'))

원시 키 세트 디코딩

SELECT FORMAT('%T', FROM_BASE64(KEYSET_ENCODED'))

4. 암호화 및 복호화

래핑된 키 세트를 이용하여 Column 암호화

DECLARE KEY BYTES;
SET KEY = (SELECT FROM_BASE64("CWRAPPED_KEYSET_ENCODED"));
CREATE OR REPLACE TABLE DATASET_NAME.TABLE_NAME AS
SELECT AEAD.ENCRYPT(
  KEYS.KEYSET_CHAIN(KMS_KEY, WRAPPED_KEYSET_DECODED),
  'plaintext',
  '') AS encrypted_content

래핑된 키 세트를 이용하여 Column 복호화

DECLARE KEY BYTES;
SET KEY = (SELECT FROM_BASE64("CWRAPPED_KEYSET_ENCODED"));
SELECT AEAD.DECRYPT_STRING(
  KEYS.KEYSET_CHAIN(KMS_KEY, WRAPPED_KEYSET_DECODED,
  encrypted_content,
  '')
FROM DATASET_NAME.TABLE_NAME


지금 예시로 진행한 것은 비확정적 암/복호화 함수이며, 해당 함수는 테이블에서 실행 중인 쿼리의 함수를 사용하여 해당 데이터에 액세스하면 데이터를 복호화할 수 있습니다.

확정적 암/복호화 함수도 있는데 해당 함수는 테이블에서 실행 중인 쿼리에서 함수를 사용하여 액세스할 때 데이터를 복호화하고 암호화된 데이터를 사용하여 집계 및 조인을 지원합니다.

profile
Solutions Architect (andrew6371@naver.com)

0개의 댓글