概要
AWSのデータウェアハウスサービスであるAmazon Redshiftは、保存データの暗号化に4層のキー階層を使用しています。これはエンベロープ暗号化と呼ばれる手法を拡張したもので、KMSマスターキーから始まり、クラスター暗号化キー、データベース暗号化キー、データ暗号化キーと段階的にデータを保護します。
本記事では、このRedshift固有の暗号化キー階層の仕組みを詳しく解説し、KMSカスタマー管理キーを使ったRedshiftクラスターの暗号化設定を実際に行います。
[!NOTE] KMSの3種類のキータイプ(AWS所有キー、AWSマネージドキー、カスタマーマネージドキー)についてはAWS暗号化キーの使い方 – 3種類の特徴と選び方を参照してください。

クラウドおさるRedshift の保存データは、KMS マスターキーからデータ暗号化キーまで 4 層のキーで守られているのでござる。この記事では、その階層をたどりながら、カスタマー管理キーで暗号化したクラスターを実際に作って確かめるでござるな。
この記事のメリット
- エンベロープ暗号化の概念を正確に理解できる
- Redshiftの4層暗号化キー階層の各層の役割と管理場所を把握できる
- KMSカスタマー管理キーを使ったRedshiftクラスターの暗号化設定を実際に体験できる
- 暗号化キーのローテーション(KMS自動ローテーションとRedshift手動ローテーション)の違いを理解できる
- SCS試験の「Redshift暗号化・KMS統合」に関する問いに正確に答えられるようになる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。


クラウドおさる



はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。



基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説
エンベロープ暗号化とは
エンベロープ暗号化は、データを直接マスターキーで暗号化するのではなく、データ暗号化キー(DEK)でデータを暗号化し、そのDEKをさらに上位のキーで暗号化する手法です。
単純な暗号化では、すべてのデータを1つのマスターキーで暗号化するため、マスターキーの管理が単一障害点になります。エンベロープ暗号化では、階層的にキーを管理することで以下のメリットがあります。
- マスターキーの露出リスクを低減: マスターキーは他のキーの暗号化にのみ使用し、データの暗号化には使用しない
- パフォーマンスの向上: 大量のデータを暗号化する際に、ローカルで生成したDEKを使用することでKMSへのリクエスト回数を減らせる
- キーローテーションの効率化: マスターキーをローテーションしても、再暗号化が必要なのは1つ下の階層のキーのみ


Redshiftの4層暗号化キー階層
Redshiftはエンベロープ暗号化を拡張した4層のキー階層を使用しています。各層の役割は以下の通りです。
| 層 | キー名 | 管理場所 | 役割 |
|---|---|---|---|
| 第1層 | KMSマスターキー(CMK) | AWS KMS | クラスター暗号化キー(CEK)を暗号化 |
| 第2層 | クラスター暗号化キー(CEK) | Redshift(暗号化された状態で保存) | データベース暗号化キー(DEK)を暗号化 |
| 第3層 | データベース暗号化キー(DEK) | Redshift(暗号化された状態で保存) | データ暗号化キーを暗号化 |
| 第4層 | データ暗号化キー | Redshift(暗号化された状態で保存) | 実際のデータブロックを暗号化 |


第1層: KMSマスターキー(CMK)
KMS内で管理されるルートキーです。このキー自体がKMSの外に出ることはありません。Redshiftは起動時にKMSに対してAPIコールを発行し、このマスターキーを使ってクラスター暗号化キー(CEK)を暗号化・復号します。
カスタマー管理キーを使用する場合、キーポリシーや有効化・無効化、削除のスケジュールなどをユーザーが制御できます。
第2層: クラスター暗号化キー(CEK)
Redshiftクラスターに固有のキーです。クラスター作成時にランダムに生成され、KMSマスターキーで暗号化された状態でRedshift内部に保存されます。CEKは第3層のデータベース暗号化キー(DEK)を暗号化するために使用されます。
第3層: データベース暗号化キー(DEK)
Redshiftデータベースに固有のキーです。CEKで暗号化された状態で保存されます。DEKは第4層のデータ暗号化キーを暗号化するために使用されます。
第4層: データ暗号化キー
実際のデータブロックを暗号化するキーです。データブロックごとにランダムに生成されます。DEKで暗号化された状態で、対応するデータブロックとともに保存されます。



KMS の外に出ないのは第 1 層のマスターキーで、CEK から下は暗号化された状態で Redshift 側に保存されるのでござる。猿山でいえば、長老会の金庫の鍵で倉庫の鍵束をしまい、その鍵束で棚ごとの鍵をしまうような入れ子でござるな。上の鍵が下の鍵を守る、という順番で覚えるのでござる。
暗号化キーのローテーション
Redshiftの暗号化キーのローテーションには2つの種類があります。
| ローテーション種別 | 対象 | 実行方法 | 影響 |
|---|---|---|---|
| KMSキーの自動ローテーション | 第1層(KMSマスターキー) | KMS側で自動ローテーションを有効化(年1回) | KMSが新しいキーマテリアルを生成。既存の暗号文はそのまま復号可能 |
| Redshiftの暗号化キーローテーション | 第2層〜第4層(CEK、DEK、データ暗号化キー) | Redshiftコンソールまたはコマンドで手動実行 | Redshiftが内部キーを再生成し、データを再暗号化 |
KMSの自動ローテーションでは、KMSが新しいキーマテリアルを生成しますが、古いキーマテリアルも保持されるため、ローテーション前に暗号化されたデータの復号には影響しません。
Redshift側のキーローテーションでは、CEK以下のすべてのキーが再生成され、データブロックの再暗号化が行われます。この処理中、クラスターは一時的に利用不可になります。



KMS の自動ローテーションは新しいキーマテリアルを作るだけで、データの再暗号化はしないのでござる。一方、Redshift の暗号化キーローテーションは CEK 以下を作り直してデータを再暗号化し、その間クラスターは一時的に使えなくなるでござるぞ。
HSMとの統合オプション
KMSの代わりに、AWS CloudHSMを使用してマスターキーを管理することも可能です。CloudHSMを使用する場合、FIPS 140-3 Level 3 認証を受けた専有のハードウェアセキュリティモジュールでキーが管理されます。規制要件によりHSM上でのキー管理が必要な場合に選択します。
| オプション | キーの保護 | コスト | 管理負荷 |
|---|---|---|---|
| KMS(AWS管理キー) | FIPS 140-3 検証済みのKMS HSM(マルチテナント) | 低い | 低い |
| KMS(カスタマー管理キー) | FIPS 140-3 検証済みのKMS HSM(マルチテナント) | 中程度 | 中程度 |
| CloudHSM | FIPS 140-3 Level 3 の専有HSM | 高い | 高い |
本記事ではKMSカスタマー管理キーを使用した手順を実践します。
実践
前提条件
- リージョン:
ap-northeast-1(東京) - KMSの操作権限とRedshiftの管理権限を持つIAMユーザーでログインしていること
- VPCと、異なるアベイラビリティーゾーンにある2つのサブネット、およびそれらを含むRedshiftのクラスターサブネットグループが作成済みであること
クラスターサブネットグループが1つも無いアカウントでは、クラスター作成時に
ClusterSubnetGroupNotFoundFaultになります。先にRedshiftコンソールの「設定」→「サブネットグループ」で作成しておきます。
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| KMSキー | redshift-encryption-key | Redshiftクラスター暗号化用のカスタマー管理キー |
| Redshiftクラスター | encrypted-cluster | 暗号化設定を検証するためのクラスター(ra3.xlplus / 1ノード) |
ステップ1: KMSカスタマー管理キーの作成
Redshiftクラスターの暗号化に使用するKMSキーを作成します。
- AWSマネジメントコンソールにログインし、リージョンが
ap-northeast-1(東京)であることを確認します - 上部の検索バーに
KMSと入力し、表示された「Key Management Service」を選択します - 左側ナビゲーションの「カスタマー管理型のキー」を選択します
- 「キーの作成」をクリックします。6ステップのウィザード(キーを設定 / ラベルを追加 / キーの管理アクセス許可を定義 / キーの使用法アクセス許可を定義 / キーポリシーを編集 / 確認)が開きます
ステップ1: キーを設定
- キーのタイプで「対称」を選択します(デフォルト。Redshiftは対称キーのみサポート)
- キーの使用法で「暗号化および復号化」を選択します(デフォルト)
- 「次へ」をクリックします
ステップ2: ラベルを追加
- エイリアスに
redshift-encryption-keyと入力します - 説明に「Redshiftクラスター暗号化用キー」と入力します


ステップ3〜5(オプション)
- 「キーの管理アクセス許可を定義」「キーの使用法アクセス許可を定義」「キーポリシーを編集」は任意です。キーポリシーに個別のIAMユーザー・ロールを追加したい場合はここで選択します
- 何も追加しない場合、キーポリシーにはアカウントのルートに対する許可だけが入り、IAMポリシーでアクセスを制御する形になります。「確認 にスキップ」で最後のステップまで進めます
ステップ6: 確認
- 設定内容を確認し、「完了」をクリックします
作成後、キーの詳細画面でキーIDとARN、ステータス(有効)が確認できます。


ステップ2: Redshiftクラスターの暗号化有効での作成
KMSキーを指定して暗号化を有効にしたRedshiftクラスターを作成します。
- 上部の検索バーに
Redshiftと入力し、表示された「Amazon Redshift」を選択します - 左側ナビゲーションの「クラスター」を選択します
- 「クラスターを作成」をクリックします
- 以下の基本設定を入力します
- クラスター識別子:
encrypted-cluster - ノードの種類:
ra3.xlplus(単一ノードのクラスターを作れる最小構成。現在の作成画面ではRA3系・RG系のみが選択できます) - ノードの数:
1 - 「データベース設定」セクションで以下を入力します
- 管理者ユーザー名:
awsuser(デフォルト) - 管理者パスワード: 「手動でパスワードを追加」を選び、任意のパスワードを入力します(AWS Secrets Managerに管理させることもできます)
- 「Choose a key type」(暗号化)セクションで以下を設定します
- 「Customer managed key.」を選択します(デフォルトは「AWS owned key」。RA3クラスターではどちらを選んでも暗号化自体は有効です)
- 「AWS KMS キーを選択」で、先ほど作成した
redshift-encryption-keyを選びます


- 「追加設定」で「デフォルトを使用」をオフにし、「ネットワークとセキュリティ」で作成済みのクラスターサブネットグループとVPC、セキュリティグループを選択します
- ページ下部の「クラスターを作成」をクリックします
注意: クラスターの作成には数分かかります。ステータスが「作成中」から「使用可能」に変わるまで待ちます。
ステップ3: クラスターの暗号化設定の確認
作成したクラスターの暗号化設定を確認します。
- クラスター一覧から
encrypted-clusterをクリックします - 「プロパティ」タブを選択します
- 「データベース設定」セクションで以下を確認します
- 暗号化:
有効 - AWS KMS キー ID: 先ほど作成した
redshift-encryption-keyのARNが表示されている


- この時点で、Redshift内部では以下の処理が完了しています
- KMSマスターキー(
redshift-encryption-key)を使ってCEKが暗号化されている - CEKを使ってDEKが暗号化されている
- データブロックの暗号化キーがDEKで暗号化されている
ステップ4: KMSキーの使用状況の確認
KMSコンソールでキーがRedshiftから使用されていることを確認します。
- 上部の検索バーに
KMSと入力し、「Key Management Service」を選択します - 左側ナビゲーションの「カスタマー管理型のキー」を選択します
redshift-encryption-keyをクリックします- 「キーの使用」セクションまたは「暗号化の設定」タブで、このキーがRedshiftクラスターに関連付けられていることを確認できます
- CloudTrailと連携している場合、「キーポリシー」タブから、Redshiftサービスがこのキーに対して
EncryptやDecryptのAPIコールを行っていることを確認できます
ステップ5: 暗号化キーのローテーション
Redshiftクラスターの暗号化キーをローテーションします。この操作により、CEK以下のキーが再生成されます。
- 上部の検索バーに
Redshiftと入力し、「Amazon Redshift」を選択します encrypted-clusterの詳細画面を開き、「プロパティ」タブを選択します- 「データベース設定」セクションの「暗号化キーの更新」をクリックします
- 確認ダイアログに、更新される範囲が表示されます
- クラスターのクラスター暗号化キー(CEK)が更新される
- 自動スナップショット・手動スナップショットごとにCEKが更新される
- Amazon S3に保存されたスナップショットのキーは更新されない


- ダイアログの「暗号化キーの更新」をクリックします
注意: キー更新中、クラスターのステータスは
rotating-keys(状態は「変更中」)になり、完了までに数分かかります。この間クラスターは一時的に使用できません。
- クラスターの状態が「Available(使用可能)」に戻れば、更新完了です


KMS自動ローテーションの設定(補足)
第1層のKMSマスターキー自体の自動ローテーションも設定できます。これはRedshift側のローテーションとは独立した操作です。
- KMSコンソールで
redshift-encryption-keyを選択します - 「キーマテリアルとローテーション」タブを選択します
- 「自動キーローテーション」の「編集」をクリックし、キーローテーションを「有効」にします
- 「ローテーション期間 (日)」は既定で
365です。90〜2,560日の範囲で変更できます


- 「保存」をクリックします
同じタブには「オンデマンドキーローテーション」もあり、「今すぐローテーション」でその場でキーマテリアルを世代交代させられます(1つのキーにつき最大25回)。
注意: KMSの自動ローテーションでは新しいキーマテリアルが生成されますが、古いキーマテリアルも保持されるため、ローテーション前に暗号化されたデータの復号に影響はありません。Redshift側でのキーローテーション(ステップ5)とは異なり、データの再暗号化は行われません。



試験では、KMS 側と Redshift 側のローテーションでそれぞれ何が作り直されるのか、どの層のキーをどこが管理しているのかを取り違えないかが問われるでござるな。4 層の順番と管理場所をセットで押さえておくのでござる。
まとめ
本記事のポイントを整理します。
- エンベロープ暗号化は、キーでキーを暗号化する階層的なアプローチ です。マスターキーの露出リスクを低減し、パフォーマンスとキーローテーションの効率を向上させます
- Redshiftは4層の暗号化キー階層 を使用します。KMSマスターキー→クラスター暗号化キー(CEK)→データベース暗号化キー(DEK)→データ暗号化キーの順でデータを保護します
- 第1層のKMSマスターキーはKMSが管理 し、第2層以下のキーはRedshiftが暗号化された状態で管理します。KMSマスターキーがKMSの外部に出ることはありません
- キーローテーションには2種類 あります。KMSの自動ローテーション(第1層のキーマテリアルの更新、データ再暗号化なし)と、Redshiftの暗号化キーローテーション(第2層以下の再生成、データ再暗号化あり)です
- カスタマー管理キーを使用すること で、キーポリシーの制御、使用状況の監査、キーの有効化・無効化など、暗号化キーに対する完全な制御が可能になります
参照先
- Amazon Redshift データベース暗号化
- Amazon Redshift での AWS KMS による暗号化
- Amazon Redshift での暗号化キーのローテーション
- AWS Key Management Service の概念
- エンベロープ暗号化
- AWS KMS キーのローテーション
- Amazon Redshift での AWS CloudHSM による暗号化










