透過的データ暗号化(TDE)を構成してみた

僕は普段、OracleDatabaseのプロダクトサポート業務を行っています。
お問い合わせの中で、透過的データ暗号化(TDE)に関するものがありましたので
自分用のメモとして残します
基本的には「ソフトウェアキーストアについて」と「TDEの構成手順」を記載しています。
設定方法については様々な形式がありますので、詳細は以下マニュアルをご覧ください。
docs.oracle.com

'

ソフトウェア・キーストアについて

Oracle Database Advanced Securityガイド 12cリリース2 (12.2)
  └ 第3章 透過的データ暗号化の構成
   └ ソフトウェア・キーストアの構成
docs.oracle.com

ソフトウェア・キーストアとは、ソフトウェアのファイル・システム上にある
TDEマスター暗号化鍵のコンテナです。
・・・
1つのデータベースあたり1つのキーストアがあり、データベースは、sqlnet.oraファイルで
定義したキーストアの場所を確認することで、このキーストアを探します。
・・・
sqlnet.oraファイルでソフトウェア・キーストアの場所を構成したら、データベース・インスタンス
にログインしてキーストアを作成して開き、次にTDEマスター暗号化鍵を設定できます。
これらの手順を完了したら、データの暗号化を開始できます。

'

TDEの構成手順

sqlnet.oraファイルでのキーストアの場所の指定

 キーストアの場所について

ソフトウェア・キーストアであろうと、ハードウェア・モジュール・セキュリティ(HSM)
・キーストア であろうと、Oracle Key Vaultのキーストアであろうと、Oracle Databaseは
sqlnet.oraファイルを 確認してキーストアのディレクトリ場所を探します。

 キーストアを設置するためのディレクトリを作成し権限を付与します。
  僕の場合は以下のように作成しました。

[oracle@ora12201 oracle]$ pwd  
/u01/app/oracle   
[oracle@ora12201 oracle]$ mkdir keystore  

 次にsqlnet.ora に以下情報を追記します。

ENCRYPTION_WALLET_LOCATION=
(SOURCE=
(METHOD=FILE)
(METHOD_DATA=
    (DIRECTORY=<キーストア設置ディレクトリ>)))

 僕の環境だと以下のように記述しました。

ENCRYPTION_WALLET_LOCATION=
(SOURCE=
(METHOD=FILE)
(METHOD_DATA=
    (DIRECTORY=/u01/app/oracle/keystore)))
ソフトウェア・キーストアの作成

 SYSKM権限が付与されたユーザーとしてデータベースにログインします。
  ※データベースが起動されている前提(sysdba権限が付与されたユーザーで起動)

SQL> conn / as syskm
接続されました。
SQL> show user
ユーザーは"SYSKM"です

 キーストアを作成します。
 構文は以下。

ADMINISTER KEY MANAGEMENT CREATE KEYSTORE 'keystore_location' IDENTIFIED BY software_keystore_password;

 僕の場合は以下のように記述・実行しました。

SQL> ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/u01/app/oracle/keystore' IDENTIFIED BY "oracle";
  
キーストアが変更されました

 この文を実行すると、キーストアとなるewallet.p12ファイルがキーストアの
 場所に生成されます。
 確認してみましょう。

[oracle@ora12201 ~]$ ls -l /u01/app/oracle/keystore
合計 4
-rw-------. 1 oracle oinstall 2408  6月 23 12:04 2019 ewallet.p12

 実際にキーストアとなる ewallet.p12 がキーストアの場所に作成されている
 ことが確認できましたね。

 毎回キーストアをオープンするのも面倒なので
 自動ログイン・ソフトウェア・キーストアを作成します。
 構文は以下。

ADMINISTER KEY MANAGEMENT CREATE [LOCAL] AUTO_LOGIN KEYSTORE FROM KEYSTORE 'keystore_location' IDENTIFIED BY software_keystore_password;

 僕の場合は以下のように記述・実行しました。

SQL> ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE '/u01/app/oracle/keystore' IDENTIFIED BY "oracle";
  
キーストアが変更されました

 上記実行後、cwallet.ssoファイルがキーストアの場所に表示されます。
 確認してみましょう。

SQL> !ls -l /u01/app/oracle/keystore
合計 8
-rw-------. 1 oracle oinstall 2451  6月 23 12:50 2019 cwallet.sso
-rw-------. 1 oracle oinstall 2408  6月 23 12:04 2019 ewallet.p12

 キーストアの場所に cwallet.sso が作成されていることが確認
 できましたね。

ソフトウェア・キーストアを開く

キーストアにおいてTDEマスター暗号化鍵を作成またはアクセスする前に、パスワードベースの
ソフトウェア・キーストアが開いている必要があります。

 以下コマンドでキーストアを開きます。

SQL> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN FORCE KEYSTORE IDENTIFIED BY "oracle";
 
キーストアが変更されました

 キーストアが開いているかを確認します。

SQL> select status
from v$encryption_wallet;
 2  
STATUS
------------------------------------
OPEN_NO_MASTER_KEY

 キーストアはOPENしているが、マスター鍵がない状態を示していることが  確認できます。

ソフトウェアTDEマスター暗号化鍵の設定

TDEマスター暗号化鍵はキーストア(ewallet.p12)に格納されます。
マスター暗号化鍵によりTDE表キー、表領域暗号化鍵が保護されます。
パスワードベースのソフトウェア・キーストアは、TDEマスター暗号化鍵を
設定する前に開かれている必要があります。

 以下コマンドでTDEマスター暗号化鍵の設定をします。

SQL> ADMINISTER KEY MANAGEMENT SET KEY USING TAG 'create_masterkey' FORCE KEYSTORE IDENTIFIED BY "oracle" WITH BACKUP;  
   
キーストアが変更されました
データの暗号化

 列の暗号化等々ありますが、今回は実際に暗号化した表領域を作成してみます。
 以下SQLで暗号化した表領域を作成します。

CREATE TABLESPACE ENCRYPT_TS 
DATAFILE '/u01/app/oracle/oradata/ORCL/datafile/encrypt_df.dbf' SIZE 200M
ENCRYPTION USING 'AES256' ENCRYPT;

 実際に実行すると以下のようになります。

SQL> CREATE TABLESPACE ENCRYPT_TS 
      DATAFILE '/u01/app/oracle/oradata/ORCL/datafile/encrypt_df.dbf' SIZE 200M
      ENCRYPTION USING 'AES256' ENCRYPT;  2    3  
   
表領域が作成されました

 実際に作成した表領域「ENCRYPT_TS」が暗号化されているか確認しましょう。
 以下コマンドで暗号化されたかを確認します。

col tablespace_name format a20
col encrypted       format a10
   
select tablespace_name,encrypted from dba_tablespaces;

 実際に実行してみます。

SQL> col tablespace_name format a20
col encrypted       format a10
   
select tablespace_name,encrypted from dba_tablespaces;SQL> SQL> SQL> 
   
TABLESPACE_NAME      ENCRYPTED
-------------------- ----------
SYSTEM               NO
SYSAUX               NO
UNDOTBS1             NO
TEMP                 NO
USERS                NO
ENCRYPT_TS         ★YES
   
6行が選択されました

 ENCRYPT_TS に対応する ENCRYPTED 列の値が YES になっていることが確認できます。
 ちゃんと暗号化できていますね。

本当は表領域の暗号化有無により、insertのパフォーマンスがどう変化するか
という検証をしたかったのですが、長くなるので今回はここまで。

おまけ:このブログは以下音楽を聴きながら書きました。

open.spotify.com