【Oracle Database】透過的データ暗号化（TDE）を試してみた



初めてTDEの設定をしてみたので、忘れないように手順をアウトプットしておきます。



# はじめに
「データベースに格納するデータを暗号化する」方式はいくつかあり、どのタイミングで暗号化するかの観点で大きく3つに分けられます。

* アプリケーションで暗号化してからデータベースに格納
* データベースの暗号化機能を利用 ←　この記事で扱う内容
* ストレージの暗号化機能を利用

今日はデータベース暗号化機能、Oracle Databaseにおける透過的データ暗号化（TDE）の手順を書いていきます。

# 透過的データ暗号化（TDE）とは
特徴
* アプリケーションからは透過的にデータの暗号化・復号することでき、既存のアプリケーション (SQL)を改修する必要ない
* Oracle Databaseのデータファイルやバックアップファイルの物理的な盗難リスクに対して安全にデータを保護

より詳細な説明が欲しい方は[Advanced Securityガイド](https://docs.oracle.com/cd/F19136_01/asoag/asopart1.html)をご確認下さい




# 環境
Oracle Linux8
Oracle Database19

※PDB構成の場合は、以下の2つのマスター暗号鍵の管理方法が有りますが、今回は統一モードで実施していきます。
* 統一モード：CDBで作成した１つのキーストアー内にPDBそれぞれのマスター暗号鍵が格納される

* 分離モード：PDBごとに専用のキーストアを作成し、マスター暗号鍵を格納する


# 手順
CDBでキーストアとマスター暗号鍵した後に、PDBでCDBをのキーストアをオープンして、PDBのマスター暗号鍵を作成する流れになります。


### ①walletディレクトリを作成
* `$ORACLE_BASE/admin/<SID>/wallet`を作成,確認


```
[oracle@devdays-23c ~]$ mkdir -p $ORACLE_BASE/admin/FREE/wallet
[oracle@devdays-23c ~]$ cd /opt/oracle/admin
[oracle@devdays-23c admin]$ ls
FREE
[oracle@devdays-23c admin]$ cd FREE/
[oracle@devdays-23c FREE]$ ls
dpdump  pfile  wallet  xdb_wallet
```

ちなみに、SIDの値がわからない場合は以下のように確認ができる
```
[oracle@devdays-23c ~]$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Production on Fri Apr 12 00:26:38 2024
Version 23.3.0.23.09

Copyright (c) 1982, 2023, Oracle.  All rights reserved.


Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09

SQL> SELECT host_name, instance_name FROM v$instance;

HOST_NAME
----------------------------------------------------------------
INSTANCE_NAME
----------------
devdays-23c
FREE

```


### ②初期化パラメータファイルのWALLET_ROOTを指定

* `ALTER SYSTEM SET WALLET_ROOT="$ORACLE_BASE/admin/<SID>/wallet" SCOPE=spfile`
を実行する

```
[oracle@devdays-23c ~]$ sqlplus / as sysdba

SQL*Plus: Release 23.0.0.0.0 - Production on Fri Apr 12 00:32:13 2024
Version 23.3.0.23.09

Copyright (c) 1982, 2023, Oracle.  All rights reserved.


Connected to:
Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.3.0.23.09

SQL> ALTER SYSTEM SET WALLET_ROOT="$ORACLE_BASE/admin/FREE/wallet" SCOPE=spfile;

System altered.
```

### ③Databaseの再起動
```

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup
ORACLE instance started.

Total System Global Area 1603679416 bytes
Fixed Size                  5313720 bytes
Variable Size             436207616 bytes
Database Buffers         1157627904 bytes
Redo Buffers                4530176 bytes
Database mounted.
Database opened.

```

### ④初期化パラメータファイルのKEYSTORE_CONFIGURATION を指定

* `ALTER SYSTEM SET TDE_CONFIGURATION="KEYSTORE_CONFIGURATION=FILE" SCOPE=both`
を実行する

```
SQL> ALTER SYSTEM SET TDE_CONFIGURATION="KEYSTORE_CONFIGURATION=FILE" SCOPE=both;

System altered.

```
### ⑤CDBにキーストアとマスター暗号鍵を作成 

* `ADMINISTER KEY MANAGEMENT CREATE KEYSTORE IDENTIFIED BY “<パスワード>”`を実行
* `ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY “<パスワード>”`を実行
* `ADMINISTER KEY MANAGEMENT SET KEY USING TAG 'TDE KEY' IDENTIFIED BY  “<パスワード>” WITH BACKUP`を実行

```
SQL> ADMINISTER KEY MANAGEMENT CREATE KEYSTORE IDENTIFIED BY “WelCome123#123#”;

keystore altered.

SQL> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY “WelCome123#123#”;

keystore altered.

SQL> ADMINISTER KEY MANAGEMENT SET KEY USING TAG 'TDE KEY' IDENTIFIED BY  “WelCome123#123#” WITH BACKUP; 

keystore altered.

SQL>     
```

### 作成したキーストアを確認 

`$ORACLE_BASE/admin/<SID>/wallet/tde`内に`ewallet.p12`というキーストアが作成される

### ⑥PDBにログイン
```
SQL> alter session set container = FREEPDB1 ;                                                           

Session altered.

SQL> show con_name

CON_NAME
------------------------------
FREEPDB1
```

### ⑦CDBのキーストアをオープンして、PDBのマスター暗号鍵を作成PDBにログイン
* `ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY  “<パスワード>” WITH BACKUP`を実行
* `ADMINISTER KEY MANAGEMENT SET KEY USING TAG 'TDE KEY' IDENTIFIED BY  “<パスワード>” WITH BACKUP`を実行

```
SQL> ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY "WelCome123#123#";

keystore altered.

SQL> ADMINISTER KEY MANAGEMENT SET KEY USING TAG 'TDE KEY' IDENTIFIED BY  "WelCome123#123#" WITH BACKUP; 

keystore altered.
```
### ⑧自動ログイン・キーストアの作成  
(※この設定をしないとデータベース起動時に毎回キーストアを手動でOPENしなければならない)


```
SQL> ADMINISTER KEY MANAGEMENT CREATE AUTO_LOGIN KEYSTORE FROM KEYSTORE IDENTIFIED BY "WelCome123#123#";

keystore altered.

```

　※作成が完了すると、`$ORACLE_BASE/admin/<SID>/wallet/tdeにcwallet.sso`という自動ログイン・キーストアが作成される

以上で、暗号化できました。実際にデータファイルをstringsコマンドで叩いてみると暗号化されているのが確認できます。

ありがとうございました。