※ 本記事は2017年10月27日に公開されたものです。
Oracle Databaseに格納するデータを暗号化するために方式としては、以下の3つが挙げられます。
- アプリケーションで暗号化してからデータベースに格納する方式
- データベースの暗号化機能を利用する方式
- OSやストレージなどデータベースより下位レイヤの機能を利用して暗号化する方式

1. アプリケーションで暗号化してからデータベースに格納する方式
暗号化APIなどを利用して、アプリケーションでデータを暗号化してから、データベースに格納する方式です。データベースには暗号化された状態でデータは格納され、データベース問い合わせでは暗号化されたデータが戻り、アプリケーション側で復号します。
2. データベースの暗号化機能を利用する方式
Oracle DatabaseのEnterprise Editionの有償オプションであるOracle Advanced Securityの透過的データ暗号化(TDE:Transparent Data Encryption)機能を利用して暗号化する方式です。透過的データ暗号化機能の特徴は、その名の通りアプリケーションに変更を加えることなく格納データを暗号化することができることです。アプリケーションからは通常のSQL問い合わせを発行するだけで、データベースが内部的にデータを暗号化して格納し、暗号化されたデータを透過的に復号してアプリケーションに戻します。
3. OSやストレージなどデータベースより下位レイヤの機能を利用して暗号化する方式
OS、ファイルシステム、ストレージ機器などの暗号化機能を利用します。ストレージの暗号化機能を利用する場合、OSからのファイルアクセスに書き込むときに自動的に暗号化され、ファイルシステムから読み込む時に透過的に暗号化されたデータが復号されます。
それぞれの暗号化方式で対応できる脅威と利用時の注意点は以下の通りです。
| 方式 | アプリケーションで暗号化してからデータベースに格納 | データベースの暗号化機能を利用 | ストレージの暗号化機能を利用 |
|---|---|---|---|
| 実装例 | カスタムアプリ開発 |
データベース機能 (TDE表領域暗号化) |
ストレージ機能 |
| 対応できる脅威 | ストレージ機器の盗難 |
ストレージ機器の盗難 データファイルの盗難 |
ストレージ機器の盗難 |
| 利用時の注意点 | 暗号化によりデータ長やデータ型が変わる アプリケーションの書き換えが必要 索引の利用に制限 (チューニングが困難) 問い合わせごとに暗号化/復号処理が毎回おこなわれるため、暗号化列数が多い場合や戻り行数が多い場合には負荷大 データベースアクセスによる情報漏洩は防げても、不正書換、削除には対応できない 鍵管理・配布が複雑 |
ファイルI/O時に暗号化/復号がおこなわれるため、OSメモリ上のデータは暗号化されていない | OSからは元のデータが見える OS経由でバックアップすると暗号化されない 暗号化単位により余計なI/Oや暗号化/復号処理が発生する可能性 問題発生時の切り分けが困難かつ、回避策として暗号化製品を利用しない運用をお願いする可能性あり |
アプリケーションで暗号化しておけば、データベースのデータを参照されてもアプリケーション経由でなければ、暗号化されたデータしか見えないので最も安全という側面は確かにあります。しかし、アプリケーションによる暗号化はシステム変更への影響が大きく、暗号化をおこなうことにより特別なSQLチューニングが必要になったり、チューニングができなくなったりします。そのため、実際に利用する際には対象範囲を狭める必要があります。暗号化したい情報でも検索条件として利用されている場合、暗号化できないケースもあります。
OSやストレージなどのデータベースより下位のレイヤで暗号化しておけば、データベースのデータもファイルとして保存しているデータも同じ方式で暗号化をおこなうことができます。しかし、OSからファイルを参照すると元のデータが見えてしまうため、対応できる脅威の範囲が小さいことに注意が必要です。近年のサイバー攻撃での侵入はOSユーザーを乗っ取る、成り済ますケースが多いです。このような攻撃はOSファイルを参照されてしまいますので脅威に対応できません。
データベースを暗号化するためには、やはりデータベースの機能を利用するのがお勧めです。
