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)をまだお持ちでない場合は、アカウントを作成する必要があります。Google Cloud Platform Console(console.cloud.google.com)にログインして、新しいプロジェクトを作成します。

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 人の従業員が生成した 600,000 通を超えるメールを持つ大規模なデータベースです。このデータは、Cloud Storage バケット gs://enron_emails/ にコピーされました。

いずれかのメールファイルをローカルにダウンロードします。

$ 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"

作成したキーリング内に 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 ロールは、主に次の 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 ロールには、鍵を管理する権限のみが含まれています。ID が enron-emails 暗号鍵を使用してデータの暗号化と復号を行う権限を付与するには:

$ 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 Logs には、Google Cloud サービスによって生成される、管理アクティビティ ログとデータアクセス ログの 2 つのログストリームがあります。これらのログは、Google Cloud Platform プロジェクト内で誰が、何を、どこで、いつ行ったかを調べるのに役立ちます。

KMS 内の任意のリソースのアクティビティを表示するには、キーリングをクリックして [View Activity] を選択します。クラウド アクティビティの 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 汎用ライセンスにより使用許諾されています。