Redshift の暗号化についてまとめてみた
Redshift の日本語ドキュメントが少し古かったので、英語ドキュメントを読みながら Redshift の暗号化について調べてみました。せっかくなので要点をまとめてみます。
参考にしたのは最終更新日が 2015 年 8 月 25 日の英語ドキュメントです(日本語ドキュメントの最終更新日は 2015 年 4 月 1 日でした)。
暗号化オプションの選択肢
Redshift の暗号化オプションには次の選択肢があります。
- KMS (AWS Key Management Service)
- HSM (Hardware Security Module)
- AWS CloudHSM
- オンプレミス上の HSM
KMS と HSM の違いは Black Belt Tech シリーズのスライドがわかりやすいです。
HSM は物理的なハードウェアを必要とするので、エンタープライズ用途でないと使うことはないと思います。今回は KMS に絞って話を進めます。
暗号化オプションを選択できるタイミング
クラスタを立ち上げるときのみ選択できます。途中で変更することはできません。
スナップショットもクラスタの設定が引き継がれます。暗号化されたクラスタから取得したスナップショットをリストアすると、同じ KMS キーで暗号化された状態になります。任意のキーに変更することはできません。
暗号化オプションを変更する唯一の方法は、新しいクラスタを立ち上げてデータを再ロードすることです。途中で変更するのは骨が折れるので、よく考えてから暗号化オプションを選択する必要があります。
暗号化によるパフォーマンスへの影響
クラスターで暗号化を有効にすると、ハードウェアアクセラレーションを利用しているとはいえ、パフォーマンスに影響が出ます。平均して、性能が約 20% 低下し、ピーク時のオーバーヘッドが 40% となることが予測されます。
日本語ドキュメントには上記の記述がありましたが、英語ドキュメントには見当たりませんでした。有効にする際は、ちゃんとベンチマークを行った上で判断する必要がありそうです。
暗号化のアーキテクチャ
クラスタを暗号化したとき、内部では 4 つの暗号化キーが使用されます。 4 番の Master Key
を頂点としたヒエラルキー構造になっています。
Data Encryption Keys
: データベース内のデータブロックを暗号化する。ブロックごとにランダムに生成されたキーが割り当てられる。Database Encryption Key
: 1 番のData Encryption Keys
を暗号化する。データベースごとにランダムに生成されたキーが割り当てられる。 Redshift とは別に保管される。Cluster Encryption Key
: 2 番のDatabase Encryption Key
を暗号化する。これは KMS のData Key
を指す。Master Key
: 3 番のCluster Encryption Key
を暗号化する。これは KMS のCustomer Master Key
を指す。
いろいろなキーが出てきてややこしいですが、Redshift 固有のキーと KMS のキーを分けて考えればスッキリします。
Redshift 固有のキーは 1, 2 番です。これは Redshift がランダムに生成し割り当てます。ユーザーが指定したキーを使うことはできず KMS のキーは直接関係ありません。
KMS のキーは 3, 4 番です。 KMS では大量のデータを暗号化するために Customer Master Key
から生成された Data Key
を使います(これをエンベロープ暗号化と言います)。 Redshift のドキュメントでは KMS のキー名称が使われずに Cluster Encryption Key
と Master Key
となっているので理解するのに時間がかかりました。
図にするとこんな感じです。
Master Key
ですべてのデータを暗号化するのはペタバイトを扱う上で非現実的なので、このようにヒエラルキー構造で暗号化の負荷を分散させているのだと思います。
ユーザーが意識するのは 4 番の Master Key
だけです。 Management Console から見える KMS Key ID というのもこれを指しています。
まとめ
暗号化オプションはボタンひとつで設定できますが、ドキュメントを読み解き、その裏側の仕組みを知るのはとても勉強になります。