BigQuery의 데이터 암호화의 방법에는 기본적인 GCP에서 제공하는 저장 데이터 암호화와 테이블의 개별 값 암호화가 있습니다. 또한 데이터를 보호하기 위해서 조직 정책을 활용하여 Policy Tag를 이용하여 데이터의 노출을 피하는 방식이 있습니다.
여기서는 테이블의 개별 값 암호화, 즉 Column 수준 암호화에 대해 다뤄보겠습니다.
Column 수준 암호화는 다음과 같은 순서로 진행됩니다.
- Cloud KMS 키링 생성
- Cloud KMS 키 생성
- Keyset 생성
- 암호화 및 복호화
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
지금 예시로 진행한 것은 비확정적 암/복호화 함수이며, 해당 함수는 테이블에서 실행 중인 쿼리의 함수를 사용하여 해당 데이터에 액세스하면 데이터를 복호화할 수 있습니다.
확정적 암/복호화 함수도 있는데 해당 함수는 테이블에서 실행 중인 쿼리에서 함수를 사용하여 액세스할 때 데이터를 복호화하고 암호화된 데이터를 사용하여 집계 및 조인을 지원합니다.