透過的データ暗号化(TDE)
アプリ改修ゼロで保存データを守れる仕組みが分かる。ページ単位で暗号化するTDEの鍵階層とパフォーマンス劣化の原理、列レベル暗号化との使い分けを内部構造から押さえられます。
- 1.TDEはストレージエンジンがページ/ファイル単位で暗号化・復号を行い、SQLやアプリ層からは平文しか見えない。バッファプール上は平文、ディスクとバックアップだけが暗号文という境界線が本質。
- 2.鍵はマスターキー(TDEプロテクタ)がデータベース暗号化キー(DEK)を包む二層構造。DEKでの実データ暗号化はCPU拡張命令で高速化でき、性能劣化は数%程度に抑えられるのが実務上の勘所。
- 3.列レベル暗号化は特定カラムだけを暗号化しSQLでの検索・インデックス利用を犠牲にするのに対し、TDEは全データを対象に透過性を保つ。両者は守る脅威モデルが異なり併用が前提。
TDEが解く問題:静止データの盗難耐性
データベースの脅威モデルには「稼働中のサーバーへの不正クエリ」だけでなく、「ディスク自体・バックアップファイル・スナップショットが盗まれる」ケースがあります。ディスクを物理的に抜き取られる、クラウドのスナップショットが誤って公開範囲を広げる、バックアップファイルが暗号化されないままオブジェクトストレージに置かれる——これらはSQLの権限制御では一切防げません。ファイルの中身がそのまま読めてしまうからです。
**透過的データ暗号化(TDE: Transparent Data Encryption)**は、この「静止データ(data at rest)」を狙う脅威に対して、ストレージエンジン自身がページ単位・ファイル単位でデータを暗号化することで応えます。「透過的」の意味は明確で、アプリケーションのSQL文もスキーマもインデックスも一切変更不要という点です。暗号化・復号はディスクI/Oの経路に挟み込まれ、バッファプールに載った時点ではすでに平文に戻っています。
TDEが守るのは「ディスク上のビットとメモリ上のビットの間」の境界です。バッファプールにキャッシュされたページ、クエリ結果、ネットワーク経由でクライアントへ返るデータはすべて平文のまま流れます。稼働中のサーバーに侵入してSQLを実行できる攻撃者や、メモリダンプを取得できる攻撃者に対してTDEは無力です。TDEが守るのは「ファイルそのものを盗まれた場合」に限定されると理解しておくと、他の対策との住み分けを誤りません。
鍵の階層:マスターキーとデータ暗号化キー
TDEの鍵管理は、エンベロープ暗号化と同じ二層構造を踏襲しますが、データベース製品ごとに固有の名称と実装があります。
- マスターキー(TDEプロテクタ、または暗号化の証明書): サービス管理キーやHSM・外部KMS(Key Vault、KMSなど)で保護される最上位の鍵。頻繁には使われず、下位の鍵を保護する役割に専念する。
- データベース暗号化キー(DEK: Database Encryption Key): データベースごとに1つ生成される対称鍵(多くはAES-256)で、実際のページ暗号化・復号を担う。DEK自体はマスターキーで暗号化(ラップ)された状態でデータベース内に保管される。
起動時にDBMSはまずマスターキーへアクセスし、暗号化されたDEKを復号してメモリに保持します。以降のページI/Oは、このメモリ上のDEKを使って行われ、マスターキーは以後の暗号化・復号処理には関与しません。
起動シーケンス:
1. DBMSプロセスが起動
2. マスターキー(HSM/KMS/証明書ストア)へアクセス要求
3. 暗号化済みDEKをマスターキーで復号 → 平文DEKをメモリに保持
4. 以降のページ読み書きはメモリ上のDEKでAES暗号化/復号
ページ書き込み経路:
バッファプール(平文ページ) → 暗号化(DEKで) → ディスクへ書き込み(暗号文)
ページ読み込み経路:
ディスク(暗号文) → 復号(DEKで) → バッファプール(平文ページ)
マスターキーを紛失すると、それにラップされたDEKを二度と復号できず、暗号化された全データが恒久的に読めなくなります。バックアップも同様に暗号文のまま保存されるため、マスターキー(またはそのバックアップ・エスクロー)を失うことは、データベース本体を失うことと等価です。多くの製品でマスターキーのバックアップ取得と別保管場所への退避が必須運用として案内されるのはこのためです。
なぜページ単位・ファイル単位なのか
TDEが「行」や「値」ではなく「ページ」を暗号化単位に選ぶのには理由があります。ストレージエンジンは元々スロッテッドページや固定長ブロックの単位でI/Oを行っており、この既存のI/O境界に暗号化・復号を挟むだけで実装が完結するからです。ページ単位なら以下がすべて成立します。
- 索引構造ごと暗号化される: B+木のリーフページも内部ページも同じ経路を通るため、索引だけ平文で漏れるということがない。
- WAL(先行書き込みログ)も対象に含めやすい: ログレコードも同じディスク書き込み経路を通せば、クラッシュリカバリ用のログファイルから機微な値が漏れる経路を塞げる。
- バックアップファイルへの暗号化が自然に継続する: 物理バックアップ(ページの生コピー)はそのまま暗号化済みページをコピーするだけで済み、バックアップ先で改めて暗号化を意識する必要がない。論理バックアップ(SQLダンプなど)はサーバー内で復号された値をテキスト化するため、TDEの保護範囲外になる点には注意が必要。
| 対象 | TDE適用時の状態 | 備考 |
|---|---|---|
| データファイル(ページ) | 暗号化される | ディスク上は暗号文、バッファプール上は平文 |
| WAL/トランザクションログ | 多くの実装で暗号化対象 | 製品・設定による |
| 物理バックアップ | 暗号化されたまま | ページの生コピーのため保護が継続 |
| 論理バックアップ(SQLダンプ) | 平文になる | 復号済みの値をテキスト出力するため対象外 |
| 一時ファイル・tempdb相当 | 製品によって対象/対象外が分かれる | ソートやハッシュのスピル先も要確認 |
パフォーマンスへの影響
TDEのオーバーヘッドは「暗号化・復号がどこで発生するか」を理解すると見積もりやすくなります。暗号化・復号はページがディスクとバッファプールの間を移動するタイミングでのみ発生し、すでにキャッシュ済みのページへの読み書きには一切コストがかかりません。したがって影響が最も出るのは次の状況です。
- バッファプールに載っていないページへの初回アクセス: ディスクからの読み込みのたびに復号処理が挟まる。
- チェックポイントやページの追い出し: ダーティページをディスクへ書き戻す際に暗号化処理が挟まる(チェックポイントの頻度が高いほど影響が積み重なる)。
- バックアップ取得・リストア: 全ページを走査するため、暗号化・復号のコストが最も顕著に表れる局面。
現代のCPUはAES-NIなどのハードウェア支援命令を持ち、AES-256の暗号化・復号をソフトウェア実装より一桁以上高速に処理できます。この支援があるハードウェアでは、TDE有効化によるオーバーヘッドは数%程度に収まることが多いとされます。逆に、AES-NIを持たない古い環境やソフトウェア実装のみの環境では、CPUバウンドなワークロードで無視できない劣化が起こり得ます。
TDEの性能影響を評価するときは「I/Oバウンドか、CPUバウンドか」を先に切り分けます。すでにストレージI/Oがボトルネックのワークロードでは、暗号化の追加CPUコストは待ち時間に隠れて体感しづらい。逆にCPUが飽和気味の分析系ワークロードでは、暗号化・復号の追加サイクルがそのまま応答時間に乗ります。AES-NI対応の確認は導入前チェックリストの筆頭に置くべき項目です。
列レベル暗号化との違い
TDEとしばしば混同されるのが**列レベル暗号化(column-level encryption)**です。両者は暗号化する単位も、失うものも異なります。
| 観点 | TDE | 列レベル暗号化 |
|---|---|---|
| 暗号化の単位 | データファイル全体(ページ単位) | 指定したカラムの値のみ |
| 透過性 | 完全に透過。SQL・スキーマ変更不要 | 暗号化・復号のロジックをアプリ or SQL関数で明示的に呼ぶ必要がある場合が多い |
| 検索・インデックス | 平文同様に索引・範囲検索・JOINが機能する(復号後にエンジンが処理するため) | ランダム化暗号化では等価検索すら難しく、決定論的暗号化でも範囲検索や部分一致は原則不可で索引の有効性が大きく損なわれる |
| 守れる脅威 | ディスク盗難・バックアップ流出など静止データの物理的漏洩 | DBA・運用担当者を含む「正当な権限を持つが見せたくない相手」からの閲覧防止にも対応できる |
| 粒度の柔軟性 | データベース単位で一律 | カラムごとに暗号化有無・鍵を変えられる |
この違いは脅威モデルの違いに直結します。TDEは「ストレージ媒体そのものが漏れる」経路を塞ぎますが、SQLで接続できてしまう者(悪意ある内部関係者や、権限昇格した攻撃者)には無力です。逆に列レベル暗号化は特定カラムを強く守れますが、暗号化された値に対する等価検索以上の演算(範囲検索、LIKE、全文検索など)は原則として成立しません。暗号文は元の値の順序も部分一致も保存しないためです。実務では、TDEで基盤全体を面として守りつつ、特に機微な一部カラム(認証情報やマイナンバー相当のフィールドなど)だけ列レベル暗号化を重ねる多層防御が一般的です。
「TDEを有効化したから暗号化対応は完了」という理解は危険です。正規の認証情報でSQL接続できる攻撃者にとって、TDEはまったく障壁になりません。TDEはあくまで「ファイルが物理的に持ち出された場合」の保険であり、アクセス制御・監査ログ・最小権限の原則といった従来の対策を代替するものではありません。
鍵ローテーション
TDEにおける鍵ローテーションは、マスターキーとDEKで意味合いが異なります。
- マスターキーのローテーション: 新しいマスターキーで既存のDEKを再ラップするだけで完了する。DEK自体は変わらず、実データの再暗号化は不要。これが二層構造の実利で、外側の鍵だけを軽量に更新できる。コンプライアンス要件(定期的な鍵更新義務)はこの操作で満たせることが多い。
- DEKのローテーション: 実データの暗号化に使う鍵そのものを変えるには、原則として全ページの復号・再暗号化が必要になる。これは全データの書き換えに等しく、コストと稼働影響が大きい。一部の実装はページごとに鍵世代(key version)を持たせ、バックグラウンドで段階的に再暗号化する仕組みを提供するが、対応は製品によって差が大きい。
マスターキーローテーション(軽量):
旧マスターキーでラップ済みDEK
→ 復号(旧マスターキーで)
→ 再ラップ(新マスターキーで)
実データは無変更
DEKローテーション(重量):
全ページを走査
→ 旧DEKで復号 → 新DEKで再暗号化 → 書き戻し
実質的に全データの書き換え
「TDEの鍵をローテーションする運用コストはどこで決まるか」という問いには、「マスターキーとDEKのどちらを回すかで非対称」と答えるのが核心です。マスターキーの更新はDEKの再ラップだけで済む軽量操作、DEKの更新は全データの再暗号化を要する重量操作。この非対称性こそが二層鍵構造を採用する理由そのもの、という説明まで含めると評価が高くなります。
まとめ
TDEは、ストレージエンジンがページ・ファイル単位で暗号化を担うことで、アプリケーションやSQLに一切手を入れずに静止データを守る仕組みです。マスターキーがDEKを包む二層構造により、日常的な鍵の更新(マスターキーのローテーション)は軽量に、実データの暗号方式を変える重い操作(DEKのローテーション)とは切り離されています。性能への影響はAES-NIなどのハードウェア支援で数%程度に抑えられる一方、守れる範囲は「ディスク・バックアップの物理的漏洩」に限定され、SQL接続を通じた閲覧は防げません。列レベル暗号化とは守備範囲も検索性への影響も異なるため、両者は排他ではなく重ねて使うのが実務上の定石です。
データベース Article
透過的データ暗号化(TDE)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
TDE
比較で見る軸
難易度: advanced / カテゴリ: データベース / タグ数: 6
導入後に効く点
鍵はマスターキー(TDEプロテクタ)がデータベース暗号化キー(DEK)を包む二層構造。DEKでの実データ暗号化はCPU拡張命令で高速化でき、性能劣化は数%程度に抑えられるのが実務上の勘所。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- データベース
- タグ数
- 6
判断チェックリスト
- 自社の用途が「TDE / 透過的データ暗号化」に近いか確認する。
- 強みである「TDEはストレージエンジンがページ/ファイル単位で暗号化・復号を行い、SQLやアプリ層からは平文しか見えない。バッファプール上は平文、ディスクとバックアップだけが暗号文という境界線が本質。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。