この記事ではOracle Databaseにおいて透過的データ暗号化(TDE)を有効化し、データファイルの表領域暗号化を実施。その後、実際に暗号化が適用されているかを確認するまでのチュートリアルを行います。 本記事の内容は学習目的ですので、本番環境で使用する際は十分ご注意ください。
本内容は環境として無償版「Oracle Database 23ai FREE」を使用しますので、どなたでもお試しいただくことが可能です。 また、Oracle Database に詳しくない方でも実施できるよう、丁寧に解説していますので、ぜひご覧ください。
0. はじめに
- 作業時間の目安:約60分(環境準備を含めると約90分程度)
- コマンドの区別について
- 本記事では、Linux コマンドと SQL コマンドを区別しやすいよう、以下のフォーマットを使用しています。実際に実行する際は、プロンプト記号を省略してください。
- Linuxコマンド:
$(コメントは#) - SQLコマンド:
SQL>(コメントは--)
- Linuxコマンド:
- 時折、実行結果も表示していることがあります。コマンドと区別するため、1行空けています。
- 本記事では、Linux コマンドと SQL コマンドを区別しやすいよう、以下のフォーマットを使用しています。実際に実行する際は、プロンプト記号を省略してください。
- 実行結果について
- 本記事では、結果を見やすくするために一部加工しています。そのため、実際の実行結果と異なる場合がありますのでご了承ください。
1. 環境を準備する
1-1. 23ai FREEの準備
本記事では Oracle Database 23ai FREE を使用するため、まず環境を準備します。
ダウンロードはこちら:Oracle Database 23ai FREE ダウンロードページ
23ai FREEは、以下の3つの方法で提供されています。
- コンテナ(docker, podman)
- VMイメージ(VM VirtualBox)
- rpmパッケージ(ol8,9, Windows)
各インストール手順については、こちらのドキュメントに記載されていますので、お好みの方法でDB環境を構築してください。
また、rpmでインストールする場合、OCIチュートリアルでも手順が詳しく紹介されていますので、ぜひ参考にしてみてください。OCIチュートリアルを参照する場合、表領域の作成手順は不要ですので、その前の手順「1. Oracle Database 23ai Freeのインストール」のみを実施してください。
本記事の環境は、OCI(Oracle Cloud Infrastructure)上のコンピュート(Oracle Linux 8)を使用しています。
23ai FREEを作成すると、FREEというCDBの中にFREEPDB1というPDBが作成されます。 DBへ接続する際に使用するコマンドを以下に挙げておきます。本手順はすべてFREEPDB1に対して行いますが、以下コマンドは手順において省略されることがあることをご了承ください。
- DBサーバーからSYSユーザーでsqlplusでFREE(CDB)に接続する
$ sqlplus / as sysdba
- CDBからPDB(FREEPDB1)に接続を切り替える
SQL> alter session set container = freepdb1;
- 直接FREEPDB1に接続する
$ sqlplus sys@localhost:1521/FREEPDB1 as sysdba
この後、SYSユーザーのパスワードを入力して接続します。
その他コマンドについてはドキュメントの方もご参照ください。
1-2. サンプルスキーマの準備
サンプルのデータとしてGitHubで公開されているサンプルスキーマを使用します。
こちらのリンク から、次のコマンドでスキーマファイルをダウンロードします。
$ wget https://github.com/oracle-samples/db-sample-schemas/archive/refs/tags/v23.3.zip
ダウンロードが完了したら、 v23.3.zip を解凍します。
$ unzip v23.3.zip
解凍後、 db-sample-schemas-23.3 が展開され、その中にある /human_resources/hr_install.sql を実行します。 ファイル名が異なる場合がありますので、お手元の環境に合わせてファイル名とパスを確認してください。
なお、サンプルスキーマの詳細についてはこちらをご参照ください。
ダウンロードが完了した後は、サンプルスキーマHRを作成します。
HRスキーマを作成するために、まずDBに接続します。
# oracleユーザーにスイッチ
$ sudo su - oracle
$ sqlplus / as sysdba
次に、現在のコンテナを確認し、 FREEPDB1 に接続します。
-- pdbを確認し、freepdb1に接続
SQL> show pdbs
SQL> alter session set container = FREEPDB1;
SQL> show con_name
続いて、先ほどダウンロードした、 db-sample-schemas-23.3/human_resources/hr_install.sql を実行します。SQL*Plusでは@を先頭に付けることで、指定したスクリプトを実行することができます。
SQL> @/home/oracle/db-sample-schemas-23.3/human_resources/hr_install.sql
インストールが開始され、パスワードの入力を求められますので、HRユーザーのパスワードを入力します。
Thank you for installing the Oracle Human Resources Sample Schema.
This installation script will automatically exit your database session
at the end of the installation or if any error is encountered.
The entire installation will be logged into the 'hr_install.log' log file.
Enter a password for the user HR: <HRユーザーのパスワードを入力>
Enter a tablespace for HR [USERS]: <Enter(USERS表領域に作成する)>
Do you want to overwrite the schema, if it already exists? [YES|no]: YES
****** Creating REGIONS table ....
...
インストールが完了したら、HRスキーマが正しく作成されていることを確認します。
SQL> select table_name from all_tables where owner = 'HR';
結果は以下のようになります。
TABLE_NAME
--------------------------------------------------------------------------------
COUNTRIES
REGIONS
LOCATIONS
DEPARTMENTS
JOBS
EMPLOYEES
JOB_HISTORY
7 rows selected.
また、HRスキーマの中身の構成は以下のようになっています。

2. TDEの準備
いきなり暗号化する前に、TDEの設定や暗号化のための鍵を格納する場所を指定する必要があります。
この準備において変更するパラメータは以下の2つです。
- wallet_root : 暗号化キー(TDEキー)や証明書などを保存する場所を指定
- tde_configuration : TDEの設定を定義
それぞれを確認していきましょう。
wallet_root
FREEPDB1に接続し、現在の値を確認します。
-- 結果をcsv形式で出力
SQL> set markup csv on
SQL> select inst_id, name, value, issys_modifiable from gv$parameter where name = ‘wallet_root’;
“INST_ID”,”NAME” ,”VALUE”,”ISSYS_MODIFIABLE”
1 ,”wallet_root”, ,”FALSE”
デフォルトでは何も設定されていないことが確認できます。 ISSYS_MODIFIABLE 列の値が FALSE であるため、設定の反映に再起動が必要になります。(つまり、静的パラメータであることを意味します。)
tde_configuration
同様に、現在の値を確認します。
SQL> select inst_id, name, value, issys_modifiable from gv$parameter where name = 'tde_configuration';
“INST_ID”,”NAME” ,”VALUE”,”ISSYS_MODIFIABLE”
1 ,”tde_configuration”, ,”IMMEDIATE”
こちらもデフォルト値はなく、何も設定されていないことが確認できます。 ISSYS_MODIFIABLE は IMMEDIATE のため、この設定は即時反映される動的パラメータであることが分かります。
2-1. 各パラメータを設定する
では各パラメータを設定していきます
wallet_root
TDEの暗号化キーはOracle Walletに保存されます。 wallet_root でこのWalletを格納するディレクトリのパスを指定します。
ディレクトリは任意の場所に指定できますが、ここでは /opt/oracle/admin/FREE/wallet を指定します。 なお、walletディレクトリは作成されていませんので、このディレクトリは事前に作成しておきます。
$ mkdir -p /opt/oracle/admin/FREE/wallet
次にCDBに接続し、以下のコマンドでパラメータを設定します。 PDBから実行はできませんので、CDBから設定を行ってください。
SQL> alter system set wallet_root='/opt/oracle/admin/FREE/wallet' scope=spfile;
SQL> select inst_id, name, value, issys_modifiable from gv$parameter where name = ‘wallet_root’;
“INST_ID”,”NAME” ,”VALUE”,”ISSYS_MODIFIABLE”
1 ,”wallet_root” , ,”FALSE”
SQL> shutdown immediate
SQL> startup
SQL> select inst_id, name, value, issys_modifiable from gv$parameter where name = ‘wallet_root’;
“INST_ID”,”NAME” ,”VALUE” ,”ISSYS_MODIFIABLE”
1 ,”wallet_root”,”/opt/oracle/admin/FREE/wallet”,”FALSE”
tde_configuration
tde_configuration はTDEで使用されるキーストアの種類を設定します。 19cからは、分離モードがサポートされ、PDBごとに固有のキーストアを使用できるようになりました。
サポートされるキーストアの詳細は こちら でご確認ください)
有効化すると設定した値によって wallet_root 配下に以下のディレクトリが作成されます。なお、設定のためには wallet_root を有効にしておく必要があります。
- FILE: <WALLET_ROOT>/tde
- Oracle Key Vault: <WALLET_ROOT>/okv
今回はデモ用として、DBサーバーにキーストアを設置します。
以下のコマンドで tde_configuration を設定します。
SQL> alter system set tde_configuration='keystore_configuration=file' scope=both;
SQL> select inst_id, name , value , issys_modifiable from gv$parameter where name = ‘tde_configuration’;
“INST_ID”,”NAME” ,”VALUE” ,”ISSYS_MODIFIABLE”
1 ,”tde_configuration”,”keystore_configuration=file”,”IMMEDIATE”
CDBで設定を行った場合、PDBはCDBからその値を継承します。
2-2. キーストアの作成
TDEは2層キー・ベース・アーキテクチャとなっており、データを暗号化する鍵とその鍵を暗号化するマスター暗号鍵の2つによって構成されます。表領域暗号化ではデータ暗号化鍵は表領域のヘッダーに格納され、マスター暗号鍵はキーストアに保存されます。
キーストアの鍵管理・操作はSYSユーザーでも可能ですが、キーストア操作の専用ユーザーとしてSYSKM権限をもったsyskmユーザーが用意されています。

それではマスター暗号化鍵を格納するためのキーストアを以下コマンドで作成します。 デフォルトではPKCS#12ベースのキーストレージファイルとして作成・保存されます。
(参考: ADMINISTER KEY MANAGEMENT )
CDBで実行 (SYSユーザー or SYSKMユーザー)
SQL> administer key management create keystore identified by OracleKM123#;
このコマンドを実行すると <wallet_root>/tde ディレクトリが作成され、その中に ewallet.p12 が作成されます。
$ pwd && tree
/opt/oracle/admin/FREE/wallet
.
└── tde
└── ewallet.p12
キーストアが正しく作成されたことは、 V$ENCRYPTION_WALLET ビューからも確認することができます。
CDBで実行 (syskmユーザー)
SQL> select * from v$encryption_wallet;
“WRL_TYPE”,”WRL_PARAMETER” ,”STATUS” ,”WALLET_TYPE”,”WALLET_ORDER”,”KEYSTORE_MODE”,”FULLY_BACKED_UP”,”CON_ID”
“FILE” ,”/opt/oracle/admin/FREE/wallet/tde/”,”CLOSED”,”UNKNOWN” ,”SINGLE” ,”NONE” ,”UNDEFINED” ,1
こちらの結果からわかる通り、キーストアの状態がCLOSEDとなっています。この状態ではキーストアは使用できませんので、OPENにする必要があります。 次に、キーストアを OPEN にするためのコマンドを実行します。
SQL> administer key management set keystore open identified by OracleKM123#;
SQL> select * from v$encryption_wallet;
“WRL_TYPE”,”WRL_PARAMETER” ,”STATUS” ,”WALLET_TYPE”,”WALLET_ORDER”,”KEYSTORE_MODE”,”FULLY_BACKED_UP”,”CON_ID”
“FILE” ,”/opt/oracle/admin/FREE/wallet/tde/”,”OPEN_NO_MASTER_KEY”,”PASSWORD” ,”SINGLE” ,”NONE” ,”UNDEFINED” ,1
このように、STATUS列がOPEN_NO_MASTER_KEYに変わり、キーストアが正常に開かれたことが確認できます。 これで、キーストアを使用して暗号化操作を行う準備が整いました。
2-3. マスター暗号鍵の作成
続いてマスター暗号鍵を作成します。 今回はCDB、PDBを一括で暗号化するために統合モードで鍵を作成します。
CDBで実行 (SYSユーザー or SYSKMユーザー)
SQL> administer key management set key using tag 'v1.0_MEK_AllContainer' identified by OracleKM123# with backup container = ALL;
using tag 句は省略可能ですが、管理のために付けておくことをお勧めします。 次に、PDBでウォレットとマスター暗号鍵が正しく認識されているかを確認します。
FREEPDB1で実行 (SYSユーザー)
-- PDBでウォレットの状態を確認
SQL> select * from v$encryption_wallet;
“WRL_TYPE”,”WRL_PARAMETER”,”STATUS”,”WALLET_TYPE”,”WALLET_ORDER”,”KEYSTORE_MODE”,”FULLY_BACKED_UP”,”CON_ID”
“FILE” , ,”OPEN” ,”PASSWORD” ,”SINGLE” ,”UNITED” ,”NO” ,3
SQL> select key_id, tag, creator, user, key_use, keystore_type, activating_dbname from v$encryption_keys;
“KEY_ID” ,”TAG” , “CREATOR”,”USER”,”KEY_USE” ,”KEYSTORE_TYPE” ,”ACTIVATING_DBNAME”
“AU1kv…AAAA”,”v1.0_MEK_AllContainer”, “SYSKM” ,”SYS” ,”TDE IN PDB”,”SOFTWARE KEYSTORE”,”FREE”
【参考】
- V$ENCRYPTION_WALLET : ウォレットの状態とTDEウォレットの場所に関する情報を表示
- V$ENCRYPTION_KEYS : マスターキーの説明属性を表示
これで準備が整いましたので、次の手順から実際に表領域の暗号化を行っていきます。
3. 表領域を暗号化する
3-1. 暗号化前のデータファイルを確認する
HRスキーマを作成したUSERS表領域を暗号化します。本手順ではHRスキーマ作成の際にUSERS表領域を指定していますが、念のため、実際にデータファイルのパスまでの確認を行います。
FREEPDB1で実行 (SYSユーザー)
-- 結果をcsv形式で出力
SQL> set markup csv on
SQL> select username, default_tablespace from dba_users where username =’HR’;
“USERNAME”,”DEFAULT_TABLESPACE”
“HR” ,”USERS”
SQL> select tablespace_name, file_name from dba_data_files where tablespace_name = ‘USERS’;
“TABLESPACE_NAME”,”FILE_NAME”
“USERS” ,”/opt/oracle/oradata/FREE/FREEPDB1/users01.dbf”
OSコマンドでUSERS表領域のデータファイルの中身を確認します。SQL*Plusでは、先頭に「!」を付けることでexitせずにOSコマンドを実行することができます。
SQL> !strings /opt/oracle/oradata/FREE/FREEPDB1/users01.dbf
…
CJOHNSON
44.1632.960034
SA_REP
O Kimberely
Grant
KGRANT
44.1632.960033
SA_REP
Jack
Livingston
JLIVINGS
44.1632.960032
…
このように、TDEで暗号化されていない場合、stringsコマンドでデータの内容が確認できてしまうことが分かります。
3-2. 暗号化を行い、データファイルを確認する
次に、HRスキーマが格納されるUSERS表領域を暗号化します。
FREEPDB1で実行 (SYSユーザー)
-- 実行時間を計測
SQL> set timing on
SQL> alter tablespace users encryption online using ‘AES256’ encrypt;
Tablespace altered.
Elapsed: 00:00:07.02
暗号化が完了しましたので、先ほどと同様のOSコマンドでデータファイルの中身を確認します。
SQL> !strings /opt/oracle/oradata/FREE/FREEPDB1/users01.dbf
…
mK=.
qM$;
/eUr
N5Y9N
ZSaKE
y!Ac
oH/P
<ar3:oii
/`_S
}l d%
…
このように、データファイルが暗号化され、内容が解読できない形式に変わったことを確認できます。 また、暗号化の有無に関わらずSQLクエリは問題なく実行されることも確認します。
SQL> select * from hr.jobs;
“JOB_ID” ,”JOB_TITLE” ,”MIN_SALARY”,”MAX_SALARY”
“AD_PRES” ,”President” ,20080 ,40000
“AD_VP” ,”Administration Vice President” ,15000 ,30000
“AD_ASST” ,”Administration Assistant” ,3000 ,6000
…
“SH_CLERK”,”Shipping Clerk” ,2500 ,5500
“IT_PROG” ,”Programmer” ,4000 ,10000
“MK_MAN” ,”Marketing Manager” ,9000 ,15000
“MK_REP” ,”Marketing Representative” ,4000 ,9000
“HR_REP” ,”Human Resources Representative”,4000 ,9000
“PR_REP” ,”Public Relations Representative” ,4500 ,10500
19 rows selected.
Elapsed: 00:00:00.02
3-3. 表領域を復号して戻す
オンラインで暗号化を行いましたが、同様にオンラインで復号も行うことができます。
FREEPDB1で実行 (SYSユーザー)
-- USERS表領域の復号を行う
SQL> alter tablespace users encryption online decrypt;
SQL> !strings /opt/oracle/oradata/FREE/FREEPDB1/users01.dbf
…
Geneve
Rua Frei Caneca 1360 01307-002 Sao Paulo Sao Paulo
Schwanthalerstr. 7031
80925
Munich
Bavaria
9702 Chester Road
09629850293 Stretford
Manchester
(Magdalen Centre, The Oxford Science Park
復号後、データファイルの内容が再び人間が読める形式で表示されることが確認できます。 オンライン暗号化または復号を行っている最中に、別の端末でデータファイルを確認すると、次のような結果が確認できます。
$ ls -l
total 1077780
-rw-r—–. 1 oracle oinstall 597696512 Nov 28 14:09 sysaux01.dbf
-rw-r—–. 1 oracle oinstall 314580992 Nov 28 14:08 system01.dbf
-rw-r—–. 1 oracle oinstall 20979712 Nov 27 22:00 temp01.dbf
-rw-r—–. 1 oracle oinstall 104865792 Nov 28 14:09 undotbs01.dbf
-rw-r—–. 1 oracle oinstall 75505664 Nov 28 14:10 users01.dbf
-rw-r—–. 1 oracle oinstall 75505664 Nov 28 14:10 users01.dbf_new
ここで、 users01.dbf_new という同じサイズの新しいデータファイルが作成されていることが分かります。 このため、オンライン暗号化を行う際には、対象のデータファイルと同じサイズの空き容量が必要です。
以上でTDEのチュートリアルは終了です。
4. おわりに
本記事では、Oracle Databaseにおける透過的データ暗号化(TDE)の有効化から、表領域の暗号化と復号の実施、データファイルの変化の確認までを行いました。
TDEを使用することで、データファイルの内容を透過的に暗号化し、セキュリティを強化できることが確認できたかと思います。 また、暗号化の有無に関わらずSQLクエリは通常どおり実行できるため、アプリケーション側の変更が不要である点も、TDEの大きなメリットです。
本記事の内容は学習目的であり、本番環境で使用する場合は、適切なセキュリティポリシーのもと、十分な検証を行ってください。