透過的データ暗号化(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のパフォーマンスがどう変化するか
という検証をしたかったのですが、長くなるので今回はここまで。