概要
Cloud Storage は、データをディスクに書き込む前にサーバー側で必ず暗号化します。暗号化には Google が管理する暗号鍵が使われ、追加料金はかかりません。Google で管理するサーバー側の暗号鍵の代わりに、標準の Base64 でエンコードされた独自の AES-256 鍵を指定することもできます。この鍵は顧客指定の暗号鍵(CSEK)と呼ばれます。
このラボでは、Cloud Storage 用の CSEK を構成します。次に、ファイルをストレージ バケットにアップロードします。その後、新しい暗号鍵を生成し、CSEK 鍵をローテーションします。
Cloud Storage では、鍵を Google のサーバーに永続的に保存したり、管理したりすることはありません。代わりに、Cloud Storage のオペレーションごとにユーザーが独自の鍵を指定し、そのオペレーションが完了すると鍵は Google のサーバーから削除されます。Cloud Storage は、鍵の暗号学的ハッシュ関数のみを保存し、その後発生したリクエストをハッシュ関数に対して検証できるようにします。
このハッシュ関数から鍵を復元することはできません。また、このハッシュ関数を使用してデータを復号することもできません。
目標
このラボでは、次のタスクの実施方法について学びます。
- Cloud Storage の CSEK を構成する
- Cloud Storage 内のファイルを CSEK を使って暗号化する
- Cloud Storage からローカル ファイルを削除し、暗号化を検証する
- 暗号鍵をローテーションする(データのダウンロードと再アップロードは行わない)
設定と要件
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
-
Qwiklabs にシークレット ウィンドウでログインします。
-
ラボのアクセス時間(例: 1:15:00
)に注意し、時間内に完了できるようにしてください。
一時停止機能はありません。必要な場合はやり直せますが、最初からになります。
-
準備ができたら、[ラボを開始] をクリックします。
-
ラボの認証情報(ユーザー名とパスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。
-
[Google Console を開く] をクリックします。
-
[別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。
-
利用規約に同意し、再設定用のリソースページをスキップします。
タスク 1. 必要なリソースを構成する
このタスクでは、ラボ全体で使用するリソースを構成します。
IAM サービス アカウントを作成する
注: このラボでは Compute Engine で仮想マシン(VM)を起動します。ラボのほとんどの作業をこの VM で行います。はじめにサービス アカウントを作成し、ラボを実行するために必要な権限を VM に付与します。
- Google Cloud コンソールで、ナビゲーション メニュー > [IAM と管理] > [サービス アカウント] を選択します。
- [サービス アカウントを作成] をクリックします。
- [サービス アカウント名] に「
cseklab
」を指定します。
- [作成して続行] をクリックします。
- [ロール] で [Cloud Storage] > [ストレージ管理者] を選択します。
- [続行] をクリックします。
- [完了] をクリックします。
Compute Engine VM を作成する
-
Google Cloud コンソールで、ナビゲーション メニュー > [Compute Engine] > [VM インスタンス] に移動します。 [インスタンスを作成] をクリックします。
-
次のように指定し、残りの設定はデフォルトのままにします。
- [名前]:
cseklab-vm
- [リージョン]:
- [ゾーン]:
- [シリーズ]:
E2
- [マシンタイプ]:
e2-micro
- [サービス アカウント]: 作成した cseklab サービス アカウント
-
アクセス スコープ: [ストレージ] で [API ごとにアクセス権を設定] を選択し、プルダウンから [フル] を選択します。
- [作成] をクリックします。
- VM が起動したら、[SSH] ボタンをクリックして VM に接続します。
Cloud Storage バケットを作成する
注: バケットにはグローバルに一意の名前が必要です。一意性を確保するために、このラボでは、バケット名の一部に Google Cloud プロジェクト ID を使用します。Google Cloud プロジェクト ID は、Qwiklabs の [接続の詳細] ペインからコピーできます。
-
cseklab-vm に接続している SSH ターミナルから次のコマンドを実行し、バケット名を保持する環境変数を作成します。
export BUCKET_NAME=[Google Cloud プロジェクト ID]-csek
- 次のコマンドを入力して、バケットを作成します。
gsutil mb -l us gs://$BUCKET_NAME
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
必要なリソースを構成する
CURL を使用してサンプル ファイルをダウンロードし、コピーを 2 部作成する
- 次のコマンドを実行してサンプル ファイルをダウンロードします(このサンプル ファイルは一般公開されている Hadoop 資料の HTML ファイルです)。このファイルは、後でラボのストレージ バケットにコピーします。
curl \
https://hadoop.apache.org/docs/current/\
hadoop-project-dist/hadoop-common/\
ClusterSetup.html > setup.html
- ファイルのコピーを 2 部作成します。
cp setup.html setup2.html
cp setup.html setup3.html
タスク 2. 顧客指定の暗号鍵(CSEK)を構成する
このタスクでは、CSEK 鍵を生成し、ファイルを Google Cloud コンソールにアップロードした後、ローカルコピーを削除します。
CSEK 鍵を生成する
注: 顧客指定の暗号鍵を使用する場合、暗号鍵の生成と管理はお客様自身が行う必要があります。RFC 4648 標準の Base64 でエンコードされた 256 ビットの文字列である鍵を、Cloud Storage に提供する必要があります。このラボでは、鍵の生成に乱数を使用します。
-
cseklab-vm の SSH ターミナルで次のコマンドを実行し、鍵を生成します。
openssl rand 32 > mykey.txt
openssl base64 -in mykey.txt
出力例:
tmxElCaabWvJqR7uXEWQF39DhWTcDvChzuCmpHe6sb0=
- 実際に生成された鍵の値をコピーします。この値は後の手順で必要になります。
.boto ファイルを変更する
注: 暗号化関連のデータは、.boto という名前の gsutil 構成ファイルにあります。
- SSH ターミナルで次のコマンドを実行し、.boto ファイルが存在することを確認します。
ls -al
-
.boto ファイルが表示されない場合、次のコマンドを実行して .boto ファイルを生成し、一覧表示します。
gsutil config -n
ls -al
-
.boto ファイルを編集するために、次のコマンドを実行します。
nano .boto
-
.boto ファイル内で「#encryption_key=」を含む行を探します。nano で検索するには、SSH ウィンドウの右上にあるキーボードをクリックし、[Ctrl+W] を選択して「
#encrypt
」と入力します。

- encryption_key 行の「#」を削除してコメント化を解除し、先ほど生成した鍵を貼り付けます。
例:
編集前:
# encryption_key=
編集後:
encryption_key=tmxElCaabWvJqR7uXEWQF39DhWTcDvChzuCmpHe6sb0=
-
Ctrl+X キーを押して終了し、Ctrl+Y キーでファイルを保存します。その後、Enter キーを押してファイル名を確認します。
暗号化ファイルをアップロードし、Google Cloud コンソールで確認する
- 次のコマンドを実行して、2 つのファイルをアップロードします。
gsutil cp setup.html gs://$BUCKET_NAME
gsutil cp setup2.html gs://$BUCKET_NAME
- Google Cloud コンソールに戻り、ナビゲーション メニュー > [Cloud Storage] を選択します。バケットをクリックしてストレージ バケットの内容を表示します。
注: setup.html と setup2.html の両方のファイルが顧客指定の暗号鍵によって暗号化されていることが示されます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
顧客指定の暗号鍵を構成する
ローカル ファイルを削除し、Cloud Storage からコピーして、暗号化を検証する
- ローカルの setup.html ファイルを削除し、次のコマンドを実行します。
rm setup.html
- 次のコマンドを実行してバケットからファイルをコピーします。
gsutil cp gs://$BUCKET_NAME/setup.html ./
- 次のコマンドを実行してファイルを表示し、ファイルが復元されていることを確認します。
cat setup.html
タスク 3. CSEK 鍵をローテーションする
このタスクでは、CSEK 鍵をローテーションします。CSEK をローテーションするには、encryption_key 構成値を decryption_key の構成値に変更し、encryption_key に新しい値を使用します。
次に、rewrite コマンドを実行してクラウドで鍵のローテーションを行います。このとき、データのダウンロードと再アップロードは行いません。
別の CSEK 鍵を生成して .boto ファイルに追加する
- SSH ターミナルで次のコマンドを実行し、新しい鍵を生成します。
openssl rand 32 > mykey.txt
openssl base64 -in mykey.txt
-
生成された鍵の値をコマンド出力からコピーします。鍵は「tmxElCaabWvJqR7uXEWQF39DhWTcDvChzuCmpHe6sb0=
」のような形式です。
-
boto ファイルを開くには、次のコマンドを実行します。
nano .boto
- 現在の encryption_key 行を探し、行の先頭に「#」を追加してコメントアウトします。
- 「encryption_key=」という新しい行を追加し、新しい鍵の値を貼り付けます。
出力:
編集前:
encryption_key=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
編集後:
# encryption_key=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
encryption_key=HbFK4I8CaStcvKKIx6aNpdTse0kTsfZNUjFpM+YUEjY=
- 「decryption_key1=」行から「#」を削除して、コメント化を解除します。
- コメントアウトした行から元の encryption_key の値をコピーし、decryption_key1 行の値として貼り付けます。
出力:
編集前:
# encryption_key=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
encryption_key=HbFK4I8CaStcvKKIx6aNpdTse0kTsfZNUjFpM+YUEjY==
# decryption_key1=
編集後:
# encryption_key=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
encryption_key=HbFK4I8CaStcvKKIx6aNpdTse0kTsfZNUjFpM+YUEjY==
decryption_key1=2dFWQGnKhjOcz4h0CudPdVHLG2g+OoxP8FQOIKKTzsg=
コメントアウトした元の encryption_key 行は、ファイルから完全に削除できます。
-
Ctrl+X キーを押して終了し、Ctrl+Y キーでファイルを保存します。その後、Enter キーを押してファイル名を確認します。
新しい鍵でファイルを暗号化し、以前の鍵で復号する
- バケットに新しいファイルをアップロードします。このファイルは新しい鍵を使用して暗号化します。
gsutil cp setup3.html gs://$BUCKET_NAME
注: この時点で、setup.html と setup2.html は元の鍵で暗号化されており、setup3.html は新しい鍵で暗号化されています。
- 次のコマンドを実行して、ローカルの setup2.html ファイルと setup3.html ファイルを削除します。
rm setup2.html
rm setup3.html
- 次のコマンドを実行してストレージ バケットからファイルをコピーします。
gsutil cp gs://$BUCKET_NAME/setup2.html ./
gsutil cp gs://$BUCKET_NAME/setup3.html ./
- 次のコマンドを実行して暗号化ファイルを表示し、ファイルが復元されていることを確認します。
cat setup2.html
cat setup3.html
注: このラボでは、新しいデータに対して新しい鍵を生成する方法を説明していますが、以前の鍵で暗号化されたファイルも引き続き復号できることに注意してください。
ファイル 1 の鍵を書き換え、以前の復号鍵をコメントアウトする
暗号化されたファイルを書き換えると、ファイルは以前に設定した decryption_key1 で復号され、新しい encryption_key で暗号化されます。
- 次のコマンドを実行して setup.html を書き換えます。
gsutil rewrite -k gs://$BUCKET_NAME/setup.html
注: この時点で、setup.html は新しい暗号鍵で書き換えられており、setup3.html も新しい鍵で暗号化されています。setup2.html ファイルは引き続き元の鍵で暗号化されているので、鍵を適切にローテーションしないとどうなるかを確認してみましょう。
- 次のコマンドを実行して .boto ファイルを開きます。
nano .boto
-
現在の decryption_key1 行に再度「#」を追加し、コメントアウトします。
-
Ctrl+X キーを押して終了し、Ctrl+Y キーでファイルを保存します。その後、Enter キーを押してファイル名を確認します。
-
次のコマンドを実行して 3 つのローカル ファイルをすべて削除します。
rm setup*.html
- 次のコマンドを実行し、setup.html と setup3.html をダウンロードします(どちらも新しい鍵で暗号化されています)。
gsutil cp gs://$BUCKET_NAME/setup.html ./
gsutil cp gs://$BUCKET_NAME/setup3.html ./
- 次のコマンドを実行して暗号化ファイルを表示し、このプロセスによってファイルが復元されたことを確認します。
cat setup.html
cat setup3.html
- 次のコマンドを実行し、元の鍵で暗号化されている setup2.html をダウンロードしてみます。
gsutil cp gs://$BUCKET_NAME/setup2.html ./
注: どうなりましたか?setup2.html は新しい鍵で書き換えられていないため、復号できず、コピーは失敗します。
CSEK 鍵が正常にローテーションされました。
お疲れさまでした
このラボでは、次の作業を行いました。
- Cloud Storage の CSEK を構成する
- Cloud Storage 内のファイルを CSEK を使って暗号化する
- Cloud Storage からローカル ファイルを削除し、暗号化を検証する
- 暗号鍵をローテーションする(データのダウンロードと再アップロードは行わない)
ラボを終了する
ラボが完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Google Cloud Skills Boost から削除され、アカウントの情報も消去されます。
ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。
星の数は、それぞれ次の評価を表します。
- 星 1 つ = 非常に不満
- 星 2 つ = 不満
- 星 3 つ = どちらともいえない
- 星 4 つ = 満足
- 星 5 つ = 非常に満足
フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。
フィードバックやご提案の送信、修正が必要な箇所をご報告いただく際は、[サポート] タブをご利用ください。
Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。