Cloud KMS 시작하기

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)에 로그인하고 새 프로젝트를 만듭니다.

Screenshot from 2016-02-10 12:45:26.png

모든 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"

이제 방금 만든 키링 내에 용도가 encryptionenron-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 키에 자동 순환 일정 설정

자세히 알아보기

라이선스

이 작업물은 Creative Commons Attribution 2.0 일반 라이선스에 따라 사용이 허가되었습니다.