ネットワークの暗号化
ネットワークの暗号化は、9i以前からある最も早く実装された機能である。設定方法もsqlnet.oraファイルに追記するだけという非常に簡単な設定なので、既存環境にも導入がし易い。以下は、Oracle Net Managerを使用した設定の例だが、使用するのはこの暗号化のタグの画面のみである。
クライアントごとに個々に設定もすることができるが、もっとも簡単かつ管理が楽になるのはサーバー側の設定で、暗号化タイプ「必要」、暗号化シード(※オプションなので入力の必要はなし)、使用可能なメソッド 「AES 128、192、256」のいずれかを選択した設定だ。この場合は接続するクライアントは必ず暗号化通信が求められる設定になるので、漏れなく暗号化をさせることができる。また、以下の2文をサーバー側のsqlnet.oraに直接追記しても良い。※Oracle Net Managerで暗号化シードが要求される場合は、直接sqlnet.oraに追記する
SQLNET.ENCRYPTION_SERVER = required
SQLNET.ENCRYPTION_TYPES_SERVER= (AES256)
暗号化通信の設定はこれで完了だ。OTNにもチュートリアルがあるので参考にしてほしい。通信で使用する暗号鍵はセッション開始時に自動的に生成されるため、特に事前に暗号鍵を用意して管理する必要はない。また、通信の暗号化はパフォーマンスへの影響はない。わずかなこの設定だけで、従来通りにデータベースを使用することができ、かつ、暗号化通信を両立することができるのだ。
格納データの暗号化
次に格納データの暗号化だが、Oracle Databaseの機能の歴史を紐解いていくと、PL/SQL暗号化ツールキットというストアドプログラムが9i以前から実装されている。古くは、DBMS_OBFUSCATION_TOOLKIT、10gからはDBMS_CRYPTOというパッケージが実装されており、このパッケージを明示的にコールしてアプリケーション側に暗号化、復号処理を実装する。ただ、このパッケージでの暗号化は大きな問題がある。一つは、パフォーマンス劣化が大きいという点、アプリケーション側の修正が必要となる点である。特にパフォーマンス劣化の影響は大きく、コンプライアンス上どうしても業務データを暗号化しなければならない等の要件の場合に限って使用されることが多く、格納データ自体の暗号化は普及していなかった。
しかし、新たに10gR2から実装されたTransparent Data Encryption(TDE)は、上記の課題を大きく解決した機能である。
このTDEの特徴は、暗号処理はすべてデータベース側で実行されるということだ。アプリケーションは従来通りのSQLをデータベースに実行し、データベース側で暗号/復号化処理を行ってアプリケーションへ送信する。アプリケーションのプログラムを修正する必要はない。また、パフォーマンスもデータベース側で暗号化に最適化されたアーキテクチャを実装することによって、飛躍的な向上を実現している。
さらに11gR1からは、TDE 表領域暗号化という機能が実装された。
この機能は、表領域自体を暗号化しておき、その中に入る表や索引、パッケージといったオブジェクトはすべて暗号化されるというものである。表領域は、最終的には物理的なデータファイルに属するわけだが、そのデータファイルそのものが暗号化されていると捉えて良い。物理的なOracleのファイルとしては、REDOログファイル、UNDO表領域やTEMP表領域のファイルがあるが、それらもすべて暗号化されている。暗号化/復号のタイミングだが、データファイルの場合、DBWR(データベース・ライター)がDiskへ書き込み、サーバープロセスがDiskから読み込みの際に行われる。
また、表領域に格納したオブジェクトのサイズは変わらない(暗号化したとしても表のサイズは増加しない)、ほとんどすべてのデータ型 (BFILEのみ不可)含む表が暗号化可能といった制限の少ない柔軟な特徴を持っている。
気になる表領域暗号化のパフォーマンスについてだが、暗号化なしを1とした処理時間で相対的に比較すると、表領域暗号化の場合で1.2程度の影響で抑えることができる。これは従来のパッケージでは、5~10といった数倍となる数値から見ても、飛躍的に性能向上しているのが分かる。
これは、比較的にDisk I/Oが多く発生するバッチ処理のようなトランザクションの場合だが、キャッシュヒット率を高く保って運用されるOLTP処理の場合、Disk I/Oの比率が少なくなるので、パフォーマンスへの影響はより低く抑えることができることが分かっている。
では、実際に表領域暗号化の設定だが、データが入っている既存のデータベースに表領域暗号化を使用する場合を仮定して説明する。手順としては以下となる。
- Oracle Walletを作成し、マスターキーを格納
- Oracle Walletをオープンする。(データベースの起動毎に1回)
- CREATE TABLESPCE~で新規の暗号化表領域を作成
- ALTER TABLE ~ MOVEで表を移動
- 既存の表領域を削除
1)Oracle Walletを作成し、マスターキーを格納
sqlnet.oraにWalletを作成するロケーションを記述
ENCRYPTION_WALLET_LOCATION = (SOURCE = (METHOD = FILE)
(METHOD_DATA = (DIRECTORY = /home/home/wallet)))
SQL*Plusから、SYSユーザーで以下のコマンドを実行してマスターキーを作成
※パスワードは任意
SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "password";
2)Oracle Walletをオープン
ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "password";
※1)でマスターキー作成直後は不要。データベースが再起動した場合など、起動時には1回かならずオープンする
3)CREATE TABLESPCE~で新規の暗号化表領域を作成
ENCRYPTION USINGで、暗号アルゴリズムを指定し(デフォルトはAES128)、ENCRYPTキーワードを追記する
例)
CREATE TABLESPACE SECURE_TBL
DATAFILE '/u02/oradata/orcl/secure01.dbf' SIZE 100M
ENCRYPTION USING 'AES256' DEFAULT STORAGE (ENCRYPT);
4)ALTER TABLE ~ MOVEで表を移動
例)customers表を3)で作成した表領域に移動
ALTER TABLE CUSTOMERS MOVE TABLESPACE SECURE_TBL;
5)既存の表領域を削除
暗号化されていない既存の表領域を完全に削除する(shredコマンド等)
手順としては以上となる。OTNに列と表領域暗号のチュートリアルがあるので参考にしてほしい。今回は、ディスクの空き容量があると仮定してALTER TABLE MOVEコマンドを使用したが、datapumpでデータを抜き出すという方法やSQL Loader等でデータを挿入する方法などいくつか考えられる。表領域暗号化は、既存の表領域を暗号化に変更することができないので、新規作成してデータロードする、そのロード時に暗号化されてデータが格納されるという流れになる。
さて、ここまでは表領域暗号化の特徴や設定について紹介してきた。特に暗号化の性能への影響は表領域暗号化で大きく改善したといえる。しかし、さらにその影響を限りなくゼロにまで近づける衝撃的な機能が実装された。AES-NIである。次はこのAES-NIと表領域暗号化を組み合わせたゼロ・インパクトの暗号化を説明する。