Cloud KMS는 클라우드에서 호스팅되는 키 관리 서비스로서 온프레미스와 동일한 방식으로 클라우드 서비스의 암호화 키를 관리할 수 있습니다. 하드웨어 지원 키를 위한 Cloud HSM을 비롯한 다양한 키 유형과 소스를 사용한 암호화, 복호화, 서명, 확인을 지원합니다.
이 튜토리얼에서는 다음을 비롯한 Cloud 보안 및 개인 정보 보호 API의 고급 기능을 사용하는 방법을 알아봅니다.
- 안전한 Cloud Storage 버킷 설정
- Cloud KMS를 사용하여 키 및 암호화된 데이터 관리
- Cloud Storage 감사 로그 보기
Enron Corpus의 요약 데이터를 사용하며, 이를 암호화하여 Cloud Storage에 로드합니다.
학습 내용
- Key Management Service (KMS)를 사용하여 데이터를 암호화하고 암호화 키를 관리하는 방법
다음과 같은
- Cloud KMS
- Cloud Storage
- Cloud SDK
자습형 환경 설정
아직 Google 계정 (Gmail 또는 Google Apps)이 없으면 계정을 만들어야 합니다. Google Cloud Platform 콘솔 (console.cloud.google.com)에 로그인하고 새 프로젝트를 만듭니다.
모든 Google Cloud 프로젝트에서 고유한 이름인 프로젝트 ID를 기억하세요(위의 이름은 이미 사용되었으므로 사용할 수 없습니다). 이 ID는 나중에 이 Codelab에서 PROJECT_ID
라고 부릅니다.
그런 다음 Google Cloud 리소스를 사용할 수 있도록 Cloud 콘솔에서 결제를 사용 설정해야 합니다.
이 codelab을 실행하는 과정에는 많은 비용이 들지 않지만 더 많은 리소스를 사용하려고 하거나 실행 중일 경우 비용이 더 들 수 있습니다(이 문서 마지막의 '삭제' 섹션 참조).
Google Cloud Platform 신규 사용자는 $300 상당의 무료 체험판을 사용할 수 있습니다.
Cloud Shell 시작
이 Codelab에서는 Google Cloud에서 실행되는 무료 가상화 환경인 Cloud Shell을 사용합니다. GCP 콘솔에서 오른쪽 상단 툴바의 Cloud Shell 아이콘을 클릭합니다.
환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.
가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉토리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 별도의 안내가 없는 한 이 셸에서 모든 명령어를 실행합니다.
이 튜토리얼의 데이터를 저장하려면 Cloud Storage 버킷을 만드세요. Cloud Storage 버킷 이름은 전역적으로 고유해야 하므로 버킷 이름에 프로젝트 ID를 접두사로 지정합니다.
$ export BUCKET_NAME=${GOOGLE_CLOUD_PROJECT}_enron_emails
그런 다음 버킷을 만듭니다.
$ gsutil mb gs://${BUCKET_NAME}
Enron Corpus는 Enron Corporation의 직원 158명이 생성한 600,000개 이상의 이메일로 구성된 대규모 데이터베이스입니다. 이 데이터의 사본이 gs://enron_emails/
라는 이름의 Cloud Storage 버킷에 있습니다.
이메일 파일 중 하나를 로컬로 다운로드합니다.
$ gsutil cp gs://enron_emails/allen-p/inbox/1. . # <-- don't forget the dot!
다운로드한 파일을 검사하여 실제로 이메일인지 확인합니다.
$ tail 1.
이메일에는 다음과 같은 메시지가 포함됩니다.
Attached is the Delta position for 1/18... # ...
버킷에는 이메일 외에도 이미지가 포함되어 있습니다. 이 튜토리얼에서는 일반 텍스트 이메일과 이미지를 모두 사용합니다.
Cloud KMS를 사용하려면 먼저 프로젝트에서 서비스를 사용 설정해야 합니다. 이 작업은 프로젝트별로 한 번만 수행하면 됩니다. Cloud KMS 서비스를 사용 설정하려면 다음 명령어를 실행하세요.
$ gcloud services enable cloudkms.googleapis.com \ --project "${GOOGLE_CLOUD_PROJECT}"
사용 설정하는 데 최대 1분이 걸릴 수 있습니다. 명령어가 완료되면 성공을 보고합니다.
Cloud KMS 키링을 만듭니다. Cloud KMS에서 키링은 암호화 키의 논리적 모음입니다. 키링에는 키의 위치와 같은 키에 관한 메타데이터가 포함됩니다. global
리전에 my-keyring
이라는 키링을 만듭니다.
$ gcloud kms keyrings create "my-keyring" \ --location "global"
이제 방금 만든 키링 내에 용도가 encryption
인 enron-emails
라는 암호화 키를 만듭니다.
$ gcloud kms keys create "enron-emails" \ --location "global" \ --keyring "my-keyring" \ --purpose "encryption"
암호화 키 웹 UI를 열고 새로 생성된 리소스를 확인합니다. 이 기능은 기본 메뉴의 IAM 및 관리자에서 사용할 수 있습니다.
Cloud Console에서 키링과 암호화 키를 보고 관리할 수 있습니다.
이전에 다운로드한 이메일의 콘텐츠를 Cloud KMS를 사용하여 암호화합니다. 이 튜토리얼에서는 gcloud
명령줄 도구를 사용하지만 Cloud KMS API를 사용하여 데이터를 암호화할 수도 있습니다.
$ gcloud kms encrypt \ --location "global" \ --keyring "my-keyring" \ --key "enron-emails" \ --plaintext-file ./1. \ --ciphertext-file ./1.enc
이렇게 하면 암호화된 파일 콘텐츠가 포함된 디스크 1.enc
에 새 파일이 생성됩니다. 이제 Cloud KMS로 데이터가 암호화되었으므로 암호화된 파일을 Cloud Storage 버킷에 업로드합니다.
$ gsutil cp ./1.enc gs://${BUCKET_NAME}
Cloud KMS는 Google Cloud Identity and Access Management (IAM)와 통합됩니다. Cloud KMS IAM 역할은 크게 두 가지 카테고리로 나뉩니다.
- 키를 관리할 수 있는 권한
- 키를 사용할 권한
예를 들어 roles/cloudkms.admin
역할을 보유한 사용자는 키링, 암호화 키를 만들고, IAM 정책을 설정하고, 관리 관련 작업을 실행할 수 있습니다. roles/cloudkms.cryptoKeyEncrypterDecrypter
는 보유자에게 데이터 암호화 및 복호화 권한을 부여하지만 관리 권한은 포함하지 않습니다.
IAM 역할은 상위 리소스에 의해 상속됩니다. Google Cloud 프로젝트에 대한 roles/cloudkms.admin
역할이 있는 사용자는 해당 프로젝트의 모든 키에 대한 관리자입니다. 키링에 대한 roles/cloudkms.admin
권한이 있는 경우 해당 키링의 모든 키에 대한 관리자입니다. 단일 암호화 키에 roles/cloudkms.admin
가 있는 경우 해당 키의 관리자만 됩니다.
이 연습에서는 다음 ID를 사용하세요.
$ export MY_IDENTITY=you@gmail.com # or you@example.com
gcloud
명령줄 도구를 사용하여 위에서 만든 키링에서 Cloud KMS 리소스를 관리할 수 있는 권한을 ID에 할당합니다.
$ gcloud kms keyrings add-iam-policy-binding "my-keyring" \ --location "global" \ --member "user:${MY_IDENTITY}" \ --role "roles/cloudkms.admin"
roles/cloudkms.admin
역할에는 키를 사용할 권한이 포함되지 않으며 관리할 권한만 포함됩니다. enron-emails
암호화 키를 사용하여 데이터를 암호화하고 복호화할 수 있는 기능을 ID에 부여하려면 다음 단계를 따르세요.
$ gcloud kms keys add-iam-policy-binding "enron-emails" \ --location "global" \ --keyring "my-keyring" \ --member "user:${MY_IDENTITY}" \ --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"
첫 번째 명령어는 키링에 roles/cloudkms.admin
역할을 부여하며 여기에는 모든 하위 암호화 키 리소스가 포함됩니다. 두 번째 명령어는 roles/cloudkms.cryptoKeyEncrypterDecrypter
권한을 부여하지만 enron-emails
암호화 키에만 부여합니다.
Cloud Console의 Cloud KMS UI에서 역할을 확인하고 할당할 수도 있습니다.
단일 파일을 암호화하는 것 외에도 스크립트를 사용하여 파일 모음을 암호화할 수도 있습니다. 이 예시에서는 allen-p의 모든 이메일을 스트리밍하고 암호화한 후 암호화된 값을 Cloud Storage 버킷에 업로드합니다.
DIR="gs://enron_emails/allen-p" for file in $(gsutil ls ${DIR}/**); do ENC_NAME="$(basename ${file}).enc" gsutil cat ${file} \ | \ gcloud kms encrypt \ --location "global" \ --keyring "my-keyring" \ --key "enron-emails" \ --plaintext-file - \ --ciphertext-file - \ | \ gsutil -q cp - gs://${BUCKET_NAME}/${ENC_NAME} echo "Copied ${ENC_NAME}" done
이 스크립트는 샘플 Cloud Storage 버킷의 지정된 디렉터리에 있는 모든 파일을 반복적으로 실행하며 Cloud KMS를 사용하여 해당 파일을 암호화한 후 Google Cloud Storage에 업로드합니다.
스크립트가 완료되면 Cloud Storage UI에서 암호화된 파일을 볼 수 있습니다. 다음과 같은 결과를 확인할 수 있습니다.
Cloud 감사 로그에는 Google Cloud 서비스에서 생성하는 관리자 활동 로그와 데이터 액세스 로그라는 두 가지 로그 스트림이 있으며, 이는 Google Cloud Platform 프로젝트 내에서 누가, 어디서, 언제, 무엇을 했는지 확인하는 데 도움이 됩니다.
KMS의 리소스에 대한 활동을 보려면 키링을 클릭하고 활동 보기를 선택합니다. 그러면 Cloud 활동 UI로 이동됩니다. 여기에서 키링의 생성과 모든 수정사항에 관한 정보를 확인할 수 있습니다.
Cloud KMS를 사용하여 데이터를 암호화하고 암호화된 데이터를 Cloud Storage에 저장했습니다.
삭제하기
이 튜토리얼에서 만든 리소스를 해제합니다. 앞에서 만든 Cloud Storage 버킷을 삭제합니다.
$ gsutil rm -r gs://${BUCKET_NAME}
Cloud KMS 리소스는 삭제할 수 없습니다. 하지만 키 자료를 폐기하여 다시 사용할 수 없도록 할 수 있습니다.
$ gcloud kms keys versions destroy "1" \ --location "global" \ --key "enron-emails" \ --keyring "my-keyring"
학습한 내용
- Cloud IAM을 사용하여 Cloud KMS 권한 관리
- Cloud KMS를 사용하여 데이터 암호화
- Cloud Storage를 사용하여 암호화된 데이터 저장
- Cloud 감사 로깅을 사용하여 키 및 키링의 모든 활동 보기
다음 단계
- Cloud KMS를 사용하여 BigQuery와 같은 데이터베이스의 열 암호화
- Cloud KMS 키에 자동 순환 일정 설정
자세히 알아보기
- 암호화 키를 순환하는 방법 자세히 알아보기
- 봉투 암호화 알아보기
- Cloud Storage 버킷의 서버 측 암호화 알아보기
- google-cloud-kms 태그를 사용해 Stack Overflow에 대한 질문을 게시하고 답변을 확인하세요.
라이선스
이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.