概要
Cloud Key Management Service(Cloud KMS)を使用すると、Google Cloud で暗号鍵を管理できるようになります。暗号鍵は Cloud KMS で作成し、オンプレミスの場合と同じように管理します。
Cloud KMS の使用により、すべてのクラウド サービスで直接使用できる AES256 対称暗号鍵を生成、使用、ローテーション、破棄することができます。
このラボでは、Cloud KMS を使用して KeyRing と CryptoKey を作成します。次に、作成した鍵を Cloud Storage で使用してバケットのデフォルトの鍵を設定し、Cloud KMS 鍵で個々のオブジェクトを暗号化します。
また、Cloud KMS 鍵を使用してサーバー側の暗号化を手動で実行し、暗号化したデータを Cloud Storage にアップロードします。
Cloud KMS の権限は IAM で管理し、Cloud Audit Logs を使用して CryptoKey と KeyRing のすべてのアクティビティを表示します。
目標
このラボでは、次の方法について学びます。
- Cloud KMS を使用して鍵と暗号化データを管理する。
- KeyRing と CryptoKey を作成する。
- ストレージ バケットのデフォルトの暗号鍵を設定する。
- Cloud KMS 鍵を使用してオブジェクトを暗号化する。
- 暗号鍵をローテーションする。
- Cloud KMS 鍵を使用してサーバー側の暗号化を手動で実行する。
設定と要件
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
-
Qwiklabs にシークレット ウィンドウでログインします。
-
ラボのアクセス時間(例: 1:15:00
)に注意し、時間内に完了できるようにしてください。
一時停止機能はありません。必要な場合はやり直せますが、最初からになります。
-
準備ができたら、[ラボを開始] をクリックします。
-
ラボの認証情報(ユーザー名とパスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。
-
[Google Console を開く] をクリックします。
-
[別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。
-
利用規約に同意し、再設定用のリソースページをスキップします。
タスク 1: 必要なリソースを構成する
このタスクでは、このラボに必要なリソースを構成します。
Cloud Storage バケットを作成する
注: バケットにはグローバルに一意の名前が必要です。一意性を確保するために、このラボでは、バケット名の一部に Google Cloud プロジェクト ID を使用します。Google Cloud プロジェクト ID は DEVSHELL_PROJECT_ID
という名前の Cloud Shell 環境変数に自動的に格納されます。
-
Google Cloud コンソールのタイトルバーで、「Cloud Shell をアクティブにする」アイコン()をクリックします。プロンプトが表示されたら、[続行] をクリックします。
-
次のコマンドを実行して、バケットを作成します。
gcloud storage buckets create --location={{{project_0.default_region|Region}}} gs://$DEVSHELL_PROJECT_ID-kms
- 次のコマンドを実行して、バケットにアップロードするサンプル ファイルをいくつか作成します。
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.txt をバケットにコピーします。
gcloud storage cp file1.txt gs://$DEVSHELL_PROJECT_ID-kms
Cloud KMS を有効にする
注: Cloud KMS を使用するには、前もってプロジェクトで有効にしておく必要があります。プロビジョニング済みの Qwiklabs の Google Cloud プロジェクトでは、すでに Cloud KMS が有効になっていますが、念のため、有効にするコマンドを発行します。
- Cloud Shell で次のコマンドを実行して、Cloud KMS を有効にします。
gcloud services enable cloudkms.googleapis.com
[進行状況を確認] をクリックして、目標に沿って進行していることを確認します。
Cloud Storage バケットを作成する
タスク 2. Cloud KMS を使用する
このタスクでは、Cloud KMS を使用して KeyRing と CryptoKey を作成します。
KeyRing と CryptoKey を作成する
注: データを暗号化するには、KeyRing と CryptoKey を作成する必要があります。KeyRing は鍵をグループ化するのに役立ちます。鍵は環境別(テスト、ステージング、本番など)、またはその他の概念別にグループ化できます。このラボでの KeyRing の名前は test、CryptoKey の名前は labkey です。
- Cloud Shell で次のコマンドを実行して、KeyRing 名と CryptoKey 名を保持する変数を作成します。
KEYRING_NAME=lab-keyring
CRYPTOKEY_1_NAME=labkey-1
CRYPTOKEY_2_NAME=labkey-2
- 次のコマンドを実行して、KeyRing を作成します。
gcloud kms keyrings create $KEYRING_NAME --location {{{project_0.default_region|Region}}}
- 次に、新しい KeyRing を使用して、labkey-1 という名前の CryptoKey を作成します。
gcloud kms keys create $CRYPTOKEY_1_NAME --location {{{project_0.default_region|Region}}} \
--keyring $KEYRING_NAME --purpose encryption
-
labkey-2 という名前の別の CryptoKey も作成します。
gcloud kms keys create $CRYPTOKEY_2_NAME --location {{{project_0.default_region|Region}}} \
--keyring $KEYRING_NAME --purpose encryption
KeyRing と鍵は Google Cloud コンソールで確認できます。
- Google Cloud コンソールのナビゲーション メニュー()で、[セキュリティ] > [Key Management] をクリックします。
lab-keyring という名前の KeyRing が表示されます。
-
lab-keyring という名前の KeyRing をクリックして、labkey-1 と labkey-2 という名前の暗号鍵を表示します。
[進行状況を確認] をクリックして、目標に沿って進行していることを確認します。
KeyRing と CryptoKey を作成する
タスク 3: バケットのデフォルトの鍵を追加する
このタスクでは、バケットのデフォルトの鍵を追加します。
現在のバケットのデフォルトの鍵を表示する
- 次のコマンドを実行して、バケットのデフォルトの暗号鍵を表示します。
gsutil kms encryption gs://$DEVSHELL_PROJECT_ID-kms
注: バケットには現在、デフォルトの暗号鍵が存在しないはずです。これは、バケット内のすべてのデータが Google が管理する暗号鍵で暗号化されることを意味します。
Cloud KMS 鍵をサービス アカウントに割り当てる
- 次のコマンドを実行して、両方の Cloud KMS 鍵を使用する権限を Cloud Storage サービス アカウントに付与します。
gsutil kms authorize -p $DEVSHELL_PROJECT_ID -k \
projects/$DEVSHELL_PROJECT_ID/locations/{{{project_0.default_region|Region}}}/keyRings\
/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_1_NAME
gsutil kms authorize -p $DEVSHELL_PROJECT_ID -k \
projects/$DEVSHELL_PROJECT_ID/locations/{{{project_0.default_region|Region}}}/keyRings\
/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_2_NAME
上記のコマンドの一般的な構文を以下に示します。
gsutil kms authorize -p [PROJECT_STORING_OBJECTS] -k [KEY_RESOURCE]
[KEY_RESOURCE] の形式は次のとおりです。
projects/[PROJECT_STORING_KEYS]/locations/[LOCATION]/keyRings/[KEY_RING_NAME]/cryptoKeys/[KEY_NAME]
バケットのデフォルトの鍵を設定する
Cloud KMS 鍵は、オブジェクトをバケットに書き込む際のデフォルトの鍵として設定できます。
デフォルトの鍵を設定する場合、鍵のリソースは前のコマンドと同じ形式で指定する必要があります。
projects/[PROJECT_STORING_KEYS]/locations/[LOCATION]/keyRings/ [KEY_RING_NAME]/cryptoKeys/[KEY_NAME]
- 次のコマンドを実行して、バケットのデフォルトの鍵を、最初に生成した鍵に設定します。
gsutil kms encryption -k \
projects/$DEVSHELL_PROJECT_ID/locations/{{{project_0.default_region|Region}}}/keyRings\
/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_1_NAME \
gs://$DEVSHELL_PROJECT_ID-kms
- 次のコマンドを実行して、バケットのデフォルトの鍵を表示し、最後のコマンドが成功したことを確認します。
gsutil kms encryption gs://$DEVSHELL_PROJECT_ID-kms
これで、バケットのデフォルトの暗号鍵が、最初の暗号鍵となります。
注: デフォルトの鍵を追加または変更する前にバケットに書き込まれたオブジェクトは、以前の暗号化方法で暗号化されたままです。
- 次のコマンドを実行して、file2.txt をバケットにコピーします。
gcloud storage cp file2.txt gs://$DEVSHELL_PROJECT_ID-kms
バケット内のファイルを表示する
- Google Cloud コンソールのナビゲーション メニュー()で、[Cloud Storage] > [バケット] をクリックし、このラボで使用するバケットをクリックします。
file 1 は Google が管理する暗号鍵で暗号化されており、file 2 はお客様が管理する暗号鍵で暗号化されています。
[進行状況を確認] をクリックして、目標に沿って進行していることを確認します。
バケットのデフォルトの鍵を追加する
タスク 4. Cloud KMS 鍵を使用してオブジェクトを個別に暗号化する
このタスクでは、Cloud KMS 鍵を使用してオブジェクトを個別に暗号化します。個別に暗号化する方法は、バケットに設定したデフォルトの鍵とは異なる鍵を使用する場合や、バケットにデフォルトの鍵が設定されていない場合に便利です。やり方としては、次の -o
フラグを使って、各 gsutil コマンドで使用する鍵を渡します(-o "GSUtil:encryption_key=[KEY_RESOURCE]"
)。
- 次のコマンドを実行して、file3.txt をバケットにコピーし、2 番目の暗号鍵で暗号化します。
gsutil -o \
"GSUtil:encryption_key=projects/$DEVSHELL_PROJECT_ID/locations/{{{project_0.default_region|Region}}}/keyRings\
/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_2_NAME" \
cp file3.txt gs://$DEVSHELL_PROJECT_ID-kms
- Google Cloud コンソールで [バケットの詳細] 画面を更新して、お客様が管理する鍵でも file3.txt が暗号化されていることを確認します。
オブジェクトの暗号化に使用された鍵を特定する
コンソールで、暗号化の列を表示します。使用されている鍵の種類(Google が管理する鍵 / お客様が管理する鍵)が表示されます。鍵にカーソルを合わせると、鍵の詳細が表示されます。gsutil を使用して鍵の詳細を取得することもできます。この操作は次のステップで行います。
- 次のコマンドを実行して、オブジェクトの詳細を表示します(gsutil ls で -L オプションを指定すると、すべてのファイルの詳細が表示されます)。
gsutil ls -L gs://$DEVSHELL_PROJECT_ID-kms/file3.txt
- 返された情報で、KMS 鍵の行を見つけます。
これにより、そのファイルで使用されている暗号鍵が表示されます。
- 前のコマンドを file1.txt と file2.txt に対しても再度実行します。
[進行状況を確認] をクリックして、目標に沿って進行していることを確認します。
Cloud KMS 鍵を使用してオブジェクトを個別に暗号化する
タスク 5. 鍵のローテーションを実行する
このタスクでは、自動および手動による鍵のローテーションを実行します。
注: Cloud KMS での鍵のローテーションは、新しいバージョンの鍵を生成し、そのバージョンをメインのバージョンとしてマークすることによってトリガーされます。どの時点においても、各鍵には Cloud KMS がデータの暗号化に使用する特定のメイン バージョンが存在します。鍵をローテーションした後、以前の鍵バージョン(メインではなくなった)は無効になったり破棄されたりすることなく、引き続きデータの復号に使用できます。
鍵を自動でローテーションする
注: ローテーション スケジュールを設定すると、Cloud KMS によって自動的に鍵のローテーションが行われます。鍵のローテーション スケジュールは、gcloud コマンドライン ツールまたは Google Cloud コンソールを使用して設定できます。
- Google Cloud コンソールで、ナビゲーション メニュー()で [セキュリティ] > [Key Management] をクリックし、lab-keyring という名前の KeyRing をクリックして、labkey-1 および labkey-2 という名前の暗号鍵を表示します。
注: [lab-keyring] が表示されない場合は、[更新] をクリックします。
-
labkey-1 という名前の鍵をクリックして、すべてのバージョンを表示します。
現在、バージョンは 1 つだけです。
-
[ローテーション期間を編集] ボタンをクリックします。
-
[ローテーション期間] プルダウンで [30 日] を選択します。
カスタム期間を選択して、任意のローテーション期間を設定することもできます。
- [保存] をクリックします。
コンソールには、この鍵の次のローテーション日が表示されます。
鍵を手動でローテーションする
注: 手動での鍵のローテーションは、gcloud コマンドライン ツールまたは Google Cloud コンソールを使用して実行できます。
-
コンソールで、lab-keyring という名前の KeyRing に戻り、labkey-2 という名前の鍵をクリックして、すべてのバージョンを表示します。
-
[鍵をローテーションする] ボタンをクリックし、[ローテーション] をクリックします。
この鍵のバージョンが 2 つになりました。version 2
がメインのバージョンです。
注: 上記の鍵のローテーション コマンドを使用した場合、鍵のローテーションによって、すでに暗号化されているデータが新たに生成された鍵バージョンで再暗号化されることはありません。鍵の不正使用が疑われる場合は、その鍵で保護されているデータを再暗号化し、以前の鍵バージョンを無効にするか、破棄をスケジュールする必要があります。
古い鍵を破棄する
注: 既存のオブジェクトの暗号化に使用した鍵を破棄すると、そのデータを復元できなくなりますが、ストレージ料金はオブジェクトを削除するまで課金され続けます。
このパートでは実際に鍵を破棄しませんが、破棄のプロセスは確認します。
-
labkey-2 バージョンの画面で、version 1
の鍵の行の右端にある縦の 3 つのドットをクリックし、[破棄] を選択します。
-
[鍵バージョン 1 の破棄をスケジュールしますか?] のメッセージを読み終えたら、[キャンセル] をクリックします。
これで、Cloud KMS 鍵を使用して、Cloud Storage でデータを暗号化できました。
[進行状況を確認] をクリックして、目標に沿って進行していることを確認します。
鍵のローテーション
ボーナスタスク: REST API を使用してデータを暗号化する
Cloud KMS サービスでは、暗号化と復号を実行するための REST API も提供されます。暗号化するコンテンツは、REST リクエストの JSON ドキュメントの一部として指定されており、このコンテンツは Base64 を使用してエンコードする必要があります。この JSON ドキュメントの形式は次のとおりです。
{"plaintext":"Base64 encoded data to encrypt"}
ラボのこの参考セクションでは、curl コマンドで REST API を手動で呼び出して、API の機能を確認します。
- このセクションの前提として、Cloud Shell セッションが開かれたままになっており、次の環境変数が定義されている必要があります。
KEYRING_NAME
CRYPTOKEY_1_NAME
CRYPTOKEY_2_NAME
これらの変数が定義されていない場合は、ラボの前半に戻ってコマンドを実行し、変数を作成します。
- 次のコマンドを実行して、サンプル テキストを Base64 としてエンコードし、PLAIN_TEXT という名前の変数に格納します。
PLAIN_TEXT=$(echo -n "Some text to be encrypted" | base64)
- echo コマンドで PLAIN_TEXT 変数を表示して、テキストがエンコードされたことを確認します。
echo $PLAIN_TEXT
Base64 エンコードされたテキストが表示されます。
-
鍵の encrypt
メソッドを呼び出して、エンコードされたテキストを REST API を使用して暗号化します。
-
リクエストの JSON の plaintext フィールドに、Base64 エンコードされたコンテンツを指定します。
curl \
"https://cloudkms.googleapis.com/v1/projects/$DEVSHELL_PROJECT_ID/locations/{{{project_0.default_region|Region}}}/keyRings/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_1_NAME:encrypt" \
-d "{\"plaintext\":\"$PLAIN_TEXT\"}" \
-H "Authorization:Bearer $(gcloud auth application-default \
print-access-token)" \
-H "Content-Type: application/json"
レスポンスは、ciphertext フィールドの暗号化テキストが含まれた JSON ペイロードになります。
注: 暗号化されたテキストは、JSON レスポンスから簡単に抽出して、コマンドライン ユーティリティ jq を使ってファイルに保存できます。前述の呼び出しレスポンスを jq にパイプで渡すと、ciphertext プロパティを解析して取り出し、data1.encrypted に保存できます。
- 暗号化を繰り返す次のコマンドを実行します。ここでは ciphertext プロパティを解析し、data1.encrypted ファイルに保存します。
curl \
"https://cloudkms.googleapis.com/v1/projects/$DEVSHELL_PROJECT_ID/locations/{{{project_0.default_region|Region}}}/keyRings/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_1_NAME:encrypt" \
-d "{\"plaintext\":\"$PLAIN_TEXT\"}" \
-H "Authorization:Bearer $(gcloud auth application-default \
print-access-token)" \
-H "Content-Type: application/json" \
| jq .ciphertext -r > data1.encrypted
- 次のコマンドを実行して、data1.encrypted ファイルのコンテンツを表示します。
more data1.encrypted
注: 暗号化されたテキストは、鍵の decrypt メソッドを呼び出すことで復号できます。コンテンツの暗号化に使用したものと同じ鍵を使用する必要があります。
- 次のコマンドを実行して、data1.encrypted ファイルのコンテンツを復号し、data1.decrypted という名前のファイルに保存します。
curl -v \
"https://cloudkms.googleapis.com/v1/projects/$DEVSHELL_PROJECT_ID/locations/{{{project_0.default_region|Region}}}/keyRings/$KEYRING_NAME/cryptoKeys/$CRYPTOKEY_1_NAME:decrypt" \
-d "{\"ciphertext\":\"$(cat data1.encrypted)\"}" \
-H "Authorization:Bearer $(gcloud auth application-default \
print-access-token)" \
-H "Content-Type:application/json" \
| jq .plaintext -r | base64 -d > data1.decrypted
- 次のコマンドを実行して、data1.decrypted ファイルのコンテンツを表示します。
more data1.decrypted
これで、Cloud KMS 鍵を正しく使用することができました。
お疲れさまでした
このラボでは、次の作業を行いました。
-
Cloud KMS を使用して鍵と暗号化データを管理する。
-
KeyRing と CryptoKey を作成する。
-
ストレージ バケットのデフォルトの暗号鍵を設定する。
-
Cloud KMS 鍵を使用してオブジェクトを暗号化する。
-
暗号鍵をローテーションする。
-
Cloud KMS 鍵を使用してサーバー側の暗号化を手動で実行する。
ラボを終了する
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
- 星 1 つ = 非常に不満
- 星 2 つ = 不満
- 星 3 つ = どちらともいえない
- 星 4 つ = 満足
- 星 5 つ = 非常に満足
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2025 Google LLC All rights reserved. Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。