こんにちは! m.uriuです。
今回はOCIのVaultサービスとオブジェクトストレージサービスのバケットの暗号化キーについてのお話です。
バケットの暗号化には、デフォルトだとOracle管理キーが使用されますが、Vaultで作成したマスター暗号化キーをオプションで指定できます。
このマスター暗号化キーですが、ローテーションという操作で新しいバージョンにキーを更新でき、最初の20バージョンまでは無料で保存できます。ローテーションを定期的に実施することで、キーの不正使用のリスクを低減できます。
今回は、バケットの暗号化キーにマスター暗号化キーを使用したままキーのローテーションを実行した場合、古いバージョンのキーで暗号化していたバケットはどうなってしまうのか、というケースについて検証してみました。
今回の記事では、その検証結果についてご紹介したいと思います。
目次
検証内容
バケットにVaultのマスター暗号化キーを設定し、キーのローテーションを実施した後、バケットの中身を確認する。(バケットの中身の参照とバケットに保存したオブジェクトをダウンロードできるか確認)
準備
検証に使用する以下のリソースを作成します。
(検証で使用したリソースは投稿時点で削除済み)
- Vault
- マスター暗号化キー
- IAMポリシー(オブジェクトストレージでマスター暗号化キーを使用する許可ポリシー)
- バケット
- オブジェクト(テスト用のテキストファイル)
Vaultを作成
Vaultを作成します。
今回の検証の動作には関係ないので、高価なオプションの「仮想プライベート・ボールト」は外します。


キーを作成
バケットに設定するマスター暗号化キーを作成します。
こちらもどれを選択しても検証には関係ないので、デフォルト設定で作成。
- 保護モード:HSM(デフォルト)
- キーシェイプ、アルゴリズム:AES(デフォルト)
- キーシェイプ、長さ:256ビット(デフォルト)


IAMポリシーの作成
検証用のコンパートメントで、オブジェクトストレージのバケットの暗号化キーに、マスター暗号化キーの使用を許可するポリシーを作成。
ステートメント:
Allow service objectstorage-(バケットのあるリージョン) to use keys in compartment (バケットのあるコンパートメント)
Allow any-user to use keys where target.key.id = (キーOCID)
バケットの作成
基本はデフォルトの設定にし、暗号化のオプションをOracle管理キーから顧客管理キーに変更。
先ほど作成したVaultとマスター暗号化キーを指定してバケットを作成。
(Oracle管理キーを指定して作成後も、詳細画面の編集からマスター暗号化キーを指定可能。)



テスト用オブジェクト配置
テスト用のテキストファイルをバケットにアップロード。

検証
リソースの準備ができたので、実際にローテーションを実施してバケットがどうなるかを確認します。
キーのローテーション
マスター暗号化キーの詳細画面から「キーのローテーション」を選択してローテーションを実施。



ローテーションが成功し、キーのバージョンが更新されました。

バケットの確認
ローテーション後のバケット内のオブジェクトの状態を確認します。
OCIコンソールから、ローテーション前にバケットに保存したテスト用テキストファイルの中身を確認できました。
マスターキーをローテーションした後もバケットの暗号化設定には影響がない、という事が分かりました。

追加検証
続いて、マスター暗号化キーのローテーションを実施後に、古いバージョンのキーを削除した場合バケットはどうなるのかについて、追加で検証していきます。
通常はバケットに設定している暗号化キーを変更(ローテーション含む)した場合、新しい暗号化キーによる暗号化を反映するために再暗号化をする必要があります。
検証するのは以下の2パターン
- バケットの再暗号化を実施せずに、古いバージョンのキーを削除
- バケットの再暗号化を実施し、古いバージョンのキーを削除
再暗号化を実施せずキーを削除
「バケットの確認」を実施した直後、バケットが古いバージョンで暗号化されたままの状態で、Vaultのキーの詳細画面から古いバージョンのキーを削除します。

削除の確認画面で削除日のスケジュールを選択します。マスターキーのバージョンを即時削除はできないので、最短の1週間後でスケジュールします。

キーの状態が「削除のスケジュール中」と表示されているのを確認。

この状態でバケットを確認すると、エラー文が表示されバケットが操作できなくなっています。
古いバージョンのマスター暗号化キーをバケットの暗号化に使用していると、バケットが使えなくなるようです。

公式ドキュメントによると、マスターキーの削除を行うと、そのキーで暗号化されたリソースはすべてアクセス不可能な状態になるそうです。
古いバージョンのマスターキーの削除スケジュールを取り消せば、再度使用できるようになり復旧が可能になりますが、スケジュールした日付を過ぎて古いバー所ジョンのマスターキーが完全に削除されると、バケットの復旧は不可能になります。
削除スケジュール前なら、マスターキーの詳細画面からいつでも削除を取り消すことができます。



マスターキーのバージョンの削除を取り消し、バケットにアクセスできるようになりました。

再暗号化を実施してキーを削除
今度はバケットの再暗号化を実施してから、古いバージョンのキーを削除します。
バケットの詳細画面から再暗号化を実施できます。



「再暗号化を実施せずキーを削除」で実施した手順で、マスターキーの古いバージョンの削除スケジュールを設定。

今度は古いバージョンの削除スケジュールを設定後もバケットにアクセスができています。
新しいバージョンのマスターキーへの引き継ぎがうまくいったようです。

まとめ
バケットの暗号化キーに指定した、マスター暗号化キーのローテーションの検証でした。
検証結果を以下に纏めました。
1.バケットの暗号化にマスター暗号化キーを指定し、その後ローテーションした後もバケットはそのまま使用できる。
2.古いバージョンのマスター暗号化キーを削除すると、そのバージョンのマスター暗号化キーを使用しているバケットは使えなくなる。(削除を取り消せばまた使用できる。)
3.キーのローテーションを実行した後、バケットの再暗号化を実施すれば、古いバージョンのマスター暗号化キーを削除してもバケットは使える。
キーのバージョン削除は、ケースによってはバケット(他のキーを使用しているリソース含めて)が使用できなくなります。
マスター暗号化キーを使用してバケットの暗号化を管理する際は、どのバージョンのキーを使用しているか管理して複数のバージョンを管理し、またはキーの削除を行う際は削除スケジュールを長めに(最長30日)取っておくことをお勧めします。
データの再暗号化も、大量のストレージを暗号化している場合は更新の手間がかかることや、再暗号化に失敗して復元できなくなるリスクもあるそうなので、(要件にもよりますが)再暗号化はデータ流出などがあった場合などに留めておく運用も良いかと思います。