Cloud KMS を使ってみる

Cloud KMS は、オンプレミスと同じ方法でクラウド サービスの暗号鍵を管理できる、クラウドホスト型の鍵管理サービスです。これには、ハードウェア バックアップ鍵用の Cloud HSM を含む、さまざまな鍵の種類とソースを使用した暗号化、復号、署名、検証のサポートが含まれています。

このチュートリアルでは、Cloud Security API と Privacy API の次のような高度な機能の使い方について学びます。

  • 安全な Cloud Storage バケットの設定
  • Cloud KMS を使用した鍵と暗号化データの管理
  • Cloud Storage 監査ログの表示

Enron Corpus から要約データを入手して暗号化し、Cloud Storage に読み込みます。

学習内容

  • 鍵管理サービス(KMS)を使用してデータを暗号化し、暗号鍵を管理する方法

使用する

  • Cloud KMS
  • Cloud Storage
  • Cloud SDK

セルフペース型の環境設定

Google アカウント(Gmail または Google Apps)をお持ちでない場合は、1 つ作成する必要があります。Google Cloud Platform のコンソール(console.cloud.google.com)にログインし、新しいプロジェクトを作成します。

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

プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID と呼びます。

次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。

この Codelab の操作をすべて行っても、費用は数ドル程度です。ただし、その他のリソースを使いたい場合や、実行したままにしておきたいステップがある場合は、追加コストがかかる可能性があります(このドキュメントの最後にある「クリーンアップ」セクションをご覧ください)。

Google Cloud Platform の新規ユーザーは、300 ドル分の無料トライアルをご利用いただけます。

Cloud Shell の起動

この Codelab では、Google Cloud で実行される無料の仮想化環境である Cloud Shell を使用します。GCP Console で右上のツールバーにある Cloud Shell アイコンをクリックします。

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、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 人によって作成された 60 万通を超えるメールが管理されています。このデータは、gs://enron_emails/ という名前の Cloud Storage バケットにコピーされています。

メールファイルの 1 つをローカルにダウンロードします。

$ 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 を使用する前に、まずプロジェクトでサービスを有効にする必要があります。これはプロジェクトごとに 1 回だけ行う必要があります。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 コンソールでキーリングと暗号鍵を表示して管理できます。

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 ロールは、大きく次の 2 つのカテゴリに分類されます。

  • 鍵を管理する権限
  • 鍵を使用する権限

たとえば、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 ロールを付与します。これには、子暗号鍵リソースも含まれます。2 番目のコマンドは 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 Audit Logging には、管理アクティビティ ログとデータアクセス ログという 2 つのログストリームがあります。これらは Google Cloud サービスによって生成され、Google Cloud Platform のプロジェクト内で、誰が、何を、どこで、いつ行ったかを調べるのに役立ちます。

KMS 内のリソースに対するアクティビティを表示するには、キーリングをクリックして [アクティビティを表示] を選択します。クラウド アクティビティの 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 Audit Logging を使用して鍵と鍵リングのすべてのアクティビティを表示する

次のステップ

  • Cloud KMS を使用して BigQuery などのデータベースの列を暗号化する
  • Cloud KMS 鍵に自動ローテーション スケジュールを設定する

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。