ここから本文です

Oracle Databaseの「透過的データ暗号化機能」とは何か

10/31(火) 8:10配信

@IT

 Oracle Databaseでは、保存するデータの暗号化のために透過的データ暗号化(TDE:Transparent Data Encryption)機能を提供しています。

透過的データ暗号化では、実際のデータの暗号化には複数の鍵を使用するが、鍵管理はマスター鍵1つだけ

 一番の特徴は、「透過的」という名前の通り、アプリケーションの書き換えを行わなくてもよいことです。暗号化/復号、暗号鍵の管理は全てユーザーやアプリケーションから透過的に行われます。透過的データ暗号化機能では、表の列単位および表領域単位の暗号化を提供していますが、ここでは一般的に利用されている表領域単位の暗号化を解説します。

 この機能は、「表領域単位で暗号化を設定し、その表領域の中に格納される表や索引は自動的に暗号化されてディスクに保存される」というものです。外部ファイルへのポインタであるBFILE以外の全てのデータ型が利用可能で、暗号化前後でデータ量の変化もなく、特別な設計は不要です。

 実際にデータが格納されるデータファイルだけではなく、REDOログやソートなどに利用される一時表領域も、データがディスクに書き込まれる際は暗号化されます。

 暗号化/復号のタイミングはディスクI/O時ですので、メモリ(データベースバッファーキャッシュ)上では暗号化されない状態です。データベースの一般的な処理では、よくアクセスするデータはメモリ上に常駐させるようなチューニングを行いますが、きちんとチューニングされたキャッシュヒット率の高いアプリケーションでは、暗号化/復号処理は実行されないのでオーバーヘッドは発生しません。また、アプリケーションで暗号化した後に格納する場合と異なり、索引も制限なく利用できるので、暗号化を行うことによる特別なチューニングは不要です。

 「チューニングされたアプリケーションではオーバーヘッドはない」と書きましたが、ディスクI/Oが多いバッチ処理でも、暗号化/復号にIntelのAES-NIやSPARCの暗号化アクセラレータといったハードウェア機能を利用できるので、性能への影響を最小化できます。パフォーマンス・オーバーヘッドに関してはマニュアルに以下のような記載があります。

□□
 透過的データ暗号化の正確なパフォーマンス・テストの作成には、さまざまな変動要素が関係します。テスト環境、テスト・ケースまたはワークロード、計測メトリックまたは方法などにより、結果は変わります。オラクル社は、考えられる全てのシナリオに当てはまる、パフォーマンスオーバーヘッドの具体的なパーセンテージを保証することはできません。実際に、透過的データ暗号化の多くのお客さまのパフォーマンス・テストでは1桁台前半のパーセンテージが示されますが、必ずそうなるわけではありません。オーバーヘッドがそれぞれ1パーセントおよび2パーセントである顧客事例が、Oracle Technology Networkの次のURLで公開されています。

(出典:「Advanced Securityガイド 」マニュアル、原文ママ)
□□

 また、データの圧縮機能であるAdvanced Compressionを利用することで、ディスクI/Oを減らし、パフォーマンスへの影響をさらに小さくすることができますが、これは暗号化しているかどうかにかかわらず性能を向上させる機能ですので、暗号化に特化したチューニングというわけではありません。基本的な索引の利用やキャッシュの増大など、ディスクI/Oを最小化するための一般的なデータベースのチューニングが、暗号化のパフォーマンス影響の最小化にもつながります。

 暗号時に利用する暗号鍵には、実際にデータを暗号化している「表領域暗号鍵」と、その表領域暗号鍵を暗号化する「マスター鍵」の2種類があります。人手による管理が必要なのは、データベース当たり1つのマスター鍵のみです。マスター鍵はソフトウェアのキーストア(Oracle Wallet)、もしくは鍵管理専用アプライアンスであるHardware Security Module(HSM)により、データベースの外部で安全に管理できます。

 各表領域は個別の表領域暗号鍵で暗号化されています。全てのデータが同じ鍵で暗号化されているのではなく、表領域ごとに異なる鍵で暗号化されています。表領域暗号鍵はマスター鍵で暗号化され、安全にデータベース内に格納されています。この2段階の鍵構造により、実際のデータはそれぞれの異なる鍵で暗号化しつつ、「鍵管理はマスター鍵1つだけ」という管理性に優れた仕組みを実現しています。

 表領域暗号化では、暗号化アルゴリズムとしてAES(Advanced Encryption Standard)を利用できます。AESは2017年9月現在、CRYPTREC暗号リスト(電子政府推奨暗号リスト)や暗号化アルゴリズムに関する国際標準規格であるISO/IEC 18033に記載されている、十分に安全な暗号化アルゴリズムなので、各種コンプライアンス要件に記載された暗号化要件を満たすことができます。

●透過的データ暗号化の利用手順

 Oracle Databaseにおける、表領域単位の透過的データ暗号化を利用するための簡単な手順は、以下の通りです。


1. キーストアの準備
2. マスター鍵の準備
3. 暗号化表領域の作成

○(1)キーストアの準備

 まず、キーストアの場所をsqlnet.oraファイルに記述します。sqlnet.oraファイルはデフォルトでは$ORACLE_HOME/network/adminにあるファイルが参照されます。

――
ENCRYPTION_WALLET_LOCATION =
(SOURCE = (METHOD = FILE)
     (METHOD_DATA = (DIRECTORY = /opt/oracle/admin/orcl/wallet)))
――

 この設定は、ファイルシステムにおけるディレクトリのソフトウェアのキーストアを利用する場合の例です。複数のデータベースを利用している場合には、DIRECTORYの指定に環境変数を指定して、それぞれのデータベースで利用するキーストアの場所を変更できます。また、RAC利用時などには、ASMなど全てのノードから参照可能な位置にキーストアを配置することにより、複数のノードで1つのキーストアを共有することもできます。

 次にキーストアを作成します。

 キーストアの作成はSQL*PlusからADMINISTER KEY MANAGEMENTで行います。ADMINISTER KEY MANAGEMENTは、データベースインストール時に指定した暗号鍵管理グループに所属するか、暗号鍵管理権限(SYSKM)を持つユーザーで実行する必要があります。

 キーストア作成のコマンドは以下の通りです。

――
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/opt/oracle/admin/orcl/wallet' IDENTIFIED BY "oracle12c";
――

 ここで「'/opt/oracle/admin/orcl/wallet'」はsqlnet.oraファイルで指定したキーストアの場所を、「"oracle12c"」はキーストアのパスワードを示しています。今回の例では明示的にアルファベットの大文字/小文字を指定するためにダブルクオートで囲んでいます。

 作成が成功すると、指定した場所にewallet.p12というファイルが作成されます。また、V$ENCRYPTION_WALLETビューからも状態が確認できます。

――
SQL> select * from v$encryption_wallet;
WRL_TYPE
--------------------
WRL_PARAMETER
-------------------------------------------------------------------------------
STATUS             WALLET_TYPE     WALLET_OR FULLY_BAC
------------------------------ -------------------- --------- ---------
  CON_ID
----------
FILE
/opt/oracle/admin/orcl/wallet/
CLOSED             UNKNOWN       SINGLE  UNDEFINED
     1
――

 キーストアを作成すると、V$ENCRYPTION_WALLETビューのSTATUS列は、「NOT_AVAILABLE」から「CLOSED」に変化します(上記コマンド、12行目)。しかし、この状態では利用可能な(OPENした)状態ではありませんので、以下のコマンドで利用可能な状態にします。

――
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "oracle12c";
――

 V$ENCRYPTION_WALLETビューのSTATUS列から、キーストアはOPENしているが、マスター鍵がない状態(OPEN_NO_MASTER_KEY)になっていることが確認できます(下記コマンド、12行目)。

――
SQL> select * from v$encryption_wallet;
WRL_TYPE
--------------------
WRL_PARAMETER
--------------------------------------------------------------------------------
STATUS             WALLET_TYPE     WALLET_OR FULLY_BAC
------------------------------ -------------------- --------- ---------
  CON_ID
----------
FILE
/opt/oracle/admin/orcl/wallet/
OPEN_NO_MASTER_KEY       PASSWORD       SINGLE  UNDEFINED
     1
――

 以上で、キーストアの準備は完了です。


○(2)マスター鍵の準備

 キーストアにマスター鍵を作成します。マスター鍵作成のコマンドは以下の通りです。

――
ADMINISTER KEY MANAGEMENT SET KEY USING TAG '初期作成マスター鍵' IDENTIFIED BY "oracle12c" WITH BACKUP;
――

 ここでは「'初期作成マスター鍵'」というTAG名でマスター鍵を作成しています。鍵が増えたときに識別できるよう、TAG名には分かりやすい名前を付けておいてください。

 マスター鍵を作成すると、V$ENCRYPTION_WALLETビューのSTATUS列はOPENとなります(下記コマンド、12行目)。

――
SQL> select * from v$encryption_wallet;
WRL_TYPE
--------------------
WRL_PARAMETER
--------------------------------------------------------------------------------
STATUS             WALLET_TYPE     WALLET_OR FULLY_BAC
------------------------------ -------------------- --------- ---------
  CON_ID
----------
FILE
/opt/oracle/admin/orcl/wallet/
OPEN              PASSWORD       SINGLE  NO
     1
――

 また、V$ENCRYPTION_KEYSビューから、マスター鍵が作成されていることが確認できます。

――
SQL> select key_id, tag, creation_time, key_use, keystore_type from v$encryption_keys;
KEY_ID
------------------------------------------------------------------------------
TAG
--------------------------------------------------------------------------------
CREATION_TIME
---------------------------------------------------------------------------
KEY_USE  KEYSTORE_TYPE
---------- -----------------
AQeZXvVKZ08Jv6Bx7nPkkr0AAAAAAAAAAAAAAAAAAAAAAAAAAAAA←初期作成マスター鍵
17-08-28 14:32:23.794537 +09:00
TDE IN PDB SOFTWARE KEYSTORE
――

 以上で、マスター鍵の作成は完了です。

 なお、12cでマルチテナント環境を利用している場合には、キーストアは全てのPDBで単一のものを共有しますが、マスター鍵は各PDBで個別に持ちます。PDBで透過的データ暗号化機能を利用した場合には、PDBごとに個別にマスター鍵を作成してください。

(3)暗号化表領域の作成

 新規暗号化表領域を作成します。表領域作成のコマンドは以下の通りです。

――
create tablespace enctbs
datafile '/opt/oracle/oradata/orcl/orclpdb/enctbs.dbf' size 10m
encryption using 'aes256'
default storage (encrypt);
――

 暗号化表領域を作成する場合には、通常のCREATE TABLESPACE文にENCRYPTION句(上記コマンド、3行目)とSTORAGE句のENCRYPTオプション(同4行目)の2つを追加するだけです。ENCRYPTION句では、利用する暗号化アルゴリズムを指定します。指定できる暗号化アルゴリズムと鍵長のペアはAES256、AES192、AES128および3DES168で、指定を省略した際のデフォルトはAES128です。

 暗号化された表領域は、V$ENCRYPTED_TABLESPACESビューから確認できます。なお、このビューからは表領域名が確認できないため、V$TABLESPACEビューと結合して参照する必要があります。

――
SQL> select t.name, et.encryptionalg, et.encryptedkey
 2 from v$tablespace t, v$encrypted_tablespaces et
 3 where t.ts#=et.ts#;
NAME              ENCRYPT
------------------------------ -------
ENCRYPTEDKEY
----------------------------------------------------------------
ENCTBS             AES256
AFC60E3680832A3F6E0868AD81F4A3CC7C0029371A4DA7BAA227D5D3C3CA1238
――

 なお、ENCRYPTEDKEY列の値は表領域暗号鍵のバージョンであり、鍵自体ではありません。

 暗号化された表領域を作成した後は、この表領域に表や索引などのオブジェクトを定義していけば、そのデータは自動的に暗号化されてからディスクに保存されます。

●筆者紹介
○福田知彦(ふくだ ともひこ)
日本オラクルでセキュリティ関連のプロダクトやソリューションを長年担当。出荷前製品検証からプリセールス、コンサルティングと、さまざまな部署を転々とするも、担当はだいたいいつもデータベースセキュリティかIDマネジメント。出荷前から構築、運用、トラブル対応まで製品の一生を見守るエンジニア

最終更新:10/31(火) 8:10
@IT