아래 사진처럼 Cloud Storage 버킷을 생성할 때라던지 타 리소스를 생성할 때 가끔 Data encryption 옵션에서 어떤 키를 사용하여 데이터를 보호할 것인지 선택할 수 있었을 것이다.
보통 Google에서 기본적으로 관리해주는 key를 default로 선택하여 리소스를 생성했을텐데 Cloud KMS를 통해 키를 내가 직접 생성하고 관리할 수 있다.
Default Encryption(기본 암호화)
Customer Managed Encryption Keys(고객 관리 암호화 키)
Agenda
1. Cloud KMS를 사용하여 KeyRing 및 CryptoKey 생성.
2. Cloud Storage에서 해당 키를 사용하여 버킷에 기본 키 설정.
3. Cloud KMS 키로 객체 암호화, 개별 객체 암호화.
4. Key Rotation 수행
Cloud Storage 버킷을 하나 생성하고 Cloud Shell을 열어준다.
다음의 명령어를 통해 파일 3개를 만들어준 뒤 차례로 아래 작업을 수행해줄 것이다.
1. 기본 옵션을 사용하여 upload
2. 버킷의 기본 키를 설정하고 upload
3. 개별 객체 암호화를 적용하여 upload
echo "This is sample file 1" > file1.txt
echo "This is sample file 2" > file2.txt
echo "This is sample file 3" > file3.txt
버킷에 file1 업로드
gsutil cp file1.txt gs://<버킷명>
당연히 기본 옵션인 Google managed key로 업로드가 됐을 것이다.
데이터를 암호화하려면 KeyRing과 CryptoKey를 생성해야 한다.
KeyRing은 키를 그룹화하는 데 유용.
(환경(ex) 테스트, 스테이징 및 프로덕션) 또는 다른 그룹별로 그룹화 가능)
KeyRing 생성
Key 생성
labkey-1과 마찬가지로 2도 생성해준다.
Cloud Shell에서 아래 명령어 실행
gsutil kms encryption gs://<버킷명>
아래와 같은 문장이 나올 것이다.
Bucket gs://~~ has no default encryption key
현재 기본 암호화 키가 없기 떄문에 결과가 위처럼 나오는게 당연.
이는 버킷의 모든 데이터가 Google 관리 암호화 키로 암호화됨을 의미.
서비스 계정에 Cloud KMS 키 할당
gsutil 명령어를 통해 Cloud Storage 서비스 계정에 두 Cloud KMS 키를 모두 사용할 수 있는 권한을 부여
PROJECT_ID=<프로젝트 ID>
KEYRING_NAME=<keyRing 이름>
CRYPTOKEY_1_NAME=<key1 이름>
CRYPTOKEY_2_NAME=<key2 이름>
gsutil kms authorize -p $PROJECT_ID -k \
projects/$PROJECT_ID/locations/us/keyRings\
/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_1_NAME
gsutil kms authorize -p $PROJECT_ID -k \
projects/$PROJECT_ID/locations/us/keyRings\
/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_2_NAME
key1, 2에 모두 권한이 생긴 것 확인
Cloud KMS 키를 기본 키로 설정하면 객체가 버킷에 업로드될 때 해당 키를 사용하여 encryption되어 업로드 된다.
버킷의 기본 키를 labkey-1로 설정
gsutil kms encryption -k \
projects/$PROJECT_ID/locations/us/keyRings\
/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_1_NAME \
gs://<버킷명>
다시 아래 명령어 수행
gsutil kms encryption gs://<버킷명>
내가 만들어준 key로 버킷의 기본 키가 설정된 것을 확인할 수 있다.
기본 키를 추가하거나 변경하기 전에 버킷에 기록된 객체는 이전 암호화 방법으로 암호화된 상태로 유지된다.
버킷에 file2 업로드
gsutil cp file2.txt gs://<버킷명>
Google managed가 아닌 Customer managed Key인 것 확인
이는 고객 혹은 사내에서 버킷에 설정된 기본 키와 다른 키를 사용하려 하거나 버킷에 설정된 기본 키가 없는 데 특정 객체를 따로 키를 사용해 보호하려는 니즈가 있는 경우 유용
labkey-2 를 사용하여 file3.txt 객체 암호화
gsutil -o \
"GSUtil:encryption_key=projects/$PROJECT_ID/locations/us/keyRings\
/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_2_NAME" \
cp file3.txt gs://<버킷명>
확인
Cloud KMS는 새 버전으로의 자동 및 수동 키 순환을 모두 지원.
이전 버전의 키는 사용 중지되거나 폐기되지 않으므로 Cloud Storage는 이러한 버전을 사용하여 이전에 암호화된 기존 객체를 복호화할 수 있다.
자동 Key Rotation
Default는 90일이지만 원하는 주기 선택 가능.
(Google managed key도 90일. Google managed key는 순환 주기 커스텀 불가)
수동 Key Rotation
직접 순환해주는 것
바로 version2가 생성되고 version2가 이제 default.
Key Rotation은 이미 암호화된 데이터를 새로 생성된 키 버전으로 다시 암호화하지 않는다.
키의 무단 사용이 의심되는 경우 해당 키로 보호되는 데이터를 다시 암호화한 다음 이전 키 버전을 비활성화하거나 폐기해야 함.
[Cloud Storage 및 Cloud KMS에서 CMEK 사용해보기 참고]
https://www.youtube.com/watch?v=AR7NwcExJwQ