Oracle データベースのTDE暗号化について調べたことのまとめ①

# 透過的データ暗号化(TDE)

セキュリティ要件を求められる案件にてOracleデータベースのTDE暗号化設定を行ったため、調べたことや検証・設定内容などをまとめておきます。

## 透過的データ暗号化(TDE)とは

- ユーザやアプリケーション側で意識せずにDB内のデータの暗号化と複合化が可能。
    - アプリケーション側で暗号化のロジック実装が不要
- 暗号化は表(列)または表領域単位に行うことができる
- 暗号鍵とキーストア(暗号鍵の保管場所)の管理操作が自動化されている為、ユーザーやアプリケーションが暗号化鍵を意識する必要は通常ない(パスワード変更、鍵更新時を除く)
- 暗号鍵をサーバ内部のキーストア(ソフトウェアキーストア)または、外部のキーストアに配置することができる。


## 以下、設定

参考にしたページ
[Oracle19c Advanced Securityガイド](https://docs.oracle.com/cd/F19136_01/asoag/release-changes.html#GUID-5004DCB0-831B-4CD8-BFB7-884A03B6EEB1)

検証環境
- OS: OracleLinux7 
- Oracleバージョン:Oracle 19c
- DB構成:シングル
- 暗号化範囲:表領域
- キーストアタイプ:ソフトウェアキーストア(自動ログインキーストア)

※案件の環境では、RAC構成でしたが検証はシングル構成で実施しています。
　RAC環境では、キーストア(マスタ暗号鍵の保管場所)をASMまたはACFSの領域に保存して各インスタンスで共有する必要があります。


### 設定① - 初期化パラメータ設定(キーストアの場所)
初期化パラメータ「wallet_root」にキーストア(※)の配置場所を設定する。
※マスタ暗号鍵を配置するファイル(ソフトウェアキーストアの場合)。
```
SQL> alter system set wallet_root="/oracle/TDE1/orcl/wallet" scope=spfile;

システムが変更されました。
```
wallet_rootは静的パラメータの為、設定を反映させるためにDBを再起動します。  
また、あらかじめ暗号化鍵を格納するディレクトリを作成しておきます。
```
SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。

SQL> !mkdir -p /oracle/TDE1/orcl/wallet
SQL> startup
ORACLEインスタンスが起動しました。

Total System Global Area  629144664 bytes
Fixed Size                  8899672 bytes
Variable Size             213909504 bytes
Database Buffers          369098752 bytes
Redo Buffers               37236736 bytes
データベースがマウントされました。
データベースがオープンされました。
```

### 設定② - 初期化パラメータ設定(キーストア形式)
初期化パラメータでキーストアの形式を設定します。今回はDBサーバ内でファイル形式でキーストアを持つソフトウェアキーストアの設定としています。
```
SQL> alter system set tde_configuration="KEYSTORE_CONFIGURATION=FILE" scope=both;

システムが変更されました。
```

### 設定③ - キーストアの作成
- キーストアの作成
    - 「administer key management create keystore identified by "パスワード"」
- キーストアをオープン
    - 「administer key management set keystore open identified by "パスワード"」
```
SQL> administer key management create keystore identified by "enc_test";

キーストアが変更されました。

SQL> administer key management set keystore open identified by "enc_test";

キーストアが変更されました。
```
### 設定④ - マスタ鍵の作成
キーストア内に暗号化マスタ鍵を作成します。
「administer key management set key using TAG 'タグ名'identified by "パスワード" with backup」
with backup でキーストアのバックアップを取得します。
```
 administer key management set key using TAG 'TDE KEY'identified by "enc_test" with backup;
```

### 設定⑤ - 自動ログインキーストアの作成
自動ログインキーストを作成すると、DB起動時にキーストアを明示的にオープンする必要がなくなります。
「administer key management create auto_login keystore from keystore identified by "パスワード"」

```
SQL> administer key management create auto_login keystore from keystore identified by "enc_test";

キーストアが変更されました。
```

### 設定確認
DBを再起動して、キーストアの設定を確認します。
設定確認コマンド
「select * from v$encryption_wallet」
```
SQL> shutdown immediate
データベースがクローズされました。
データベースがディスマウントされました。
ORACLEインスタンスがシャットダウンされました。
SQL> startup
ORACLEインスタンスが起動しました。

Total System Global Area  629144664 bytes
Fixed Size                  8899672 bytes
Variable Size             213909504 bytes
Database Buffers          369098752 bytes
Redo Buffers               37236736 bytes
データベースがマウントされました。
データベースがオープンされました。
SQL>  select * from v$encryption_wallet;

WRL_TYPE
--------------------
WRL_PARAMETER
--------------------------------------------------------------------------------
STATUS                         WALLET_TYPE          WALLET_OR KEYSTORE FULLY_BAC
------------------------------ -------------------- --------- -------- ---------
    CON_ID
----------
FILE
/oracle/TDE1/orcl/wallet/tde/
OPEN                           AUTOLOGIN            SINGLE    NONE     NO
         0
```

|列名|値|意味|
|--|--|--|
|WRL_TYPE|FILE|ウォレットのタイプ|
|WRL_PARAMETER|/oracle/TDE1/orcl/wallet/tde/|FILEの場合、ウォレットの場所|
|STATUS|OPEN|ウォレットのステータス(OPENとなっていれば利用可能)|
|WALLET＿TYPE|AUTOLOGIN|キーストアのタイプ(自動ログイン設定前はFILEと表示)|

参考 : [v$encryption_wallet](https://docs.oracle.com/cd/F32587_01/refrn/V-ENCRYPTION_WALLET.html#GUID-054B6FBC-4263-4A91-AEBD-D6FB50C22107)

他にも暗号化関連の情報を参照する、下記のようなビューもあります。
- V$ENCRYPTION_KEYS
- V$ENCRYPTED_TABLESPACES

これで、暗号化の設定は完了です。
続いて、TDE暗号化された表領域を作成します。

### 暗号化表領域の作成
以下の様に表領域作成のSQLに「ENCRYPTION USING '暗号アルゴリズム' ENCRYPT」を指定して、暗号化された表領域を作成します。

```
SQL> CREATE TABLESPACE enc_ts
  2    DATAFILE '/oradata/orcl/datafile/enc_ts01.dbf' SIZE 10M
  3    ENCRYPTION USING 'AES256' ENCRYPT;

表領域が作成されました。

SQL>
```
テスト用のテーブルを作成して、暗号化のテストを行います。
下記の通り、暗号化された表領域ではgrepの検索に文字列「test encription」がヒットしません
```
SQL>  create table enc_table(col1 varchar2(100)) tablespace enc_ts;

表が作成されました。

SQL>  insert into enc_table values ('test encription');

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> alter system checkpoint;

システムが変更されました。

SQL> !strings  /oradata/orcl/datafile/enc_ts01.dbf | grep 'test'

SQL>
```
データファイルに書き出されるようにチェックポイントを実行しています。


下記の通り暗号化されていない表領域では、grep で「test encription」がヒットします。

```
SQL> CREATE TABLESPACE not_enc_ts
  2    DATAFILE '/oradata/orcl/datafile/not_enc_ts01.dbf' SIZE 10M;

表領域が作成されました。

SQL> create table not_enc_table(col1 varchar2(100)) tablespace not_enc_ts;

表が作成されました。

SQL> insert into not_enc_table values ('test encription');

1行が作成されました。

SQL> commit;

コミットが完了しました。

SQL> alter system checkpoint;

システムが変更されました。

SQL> !strings  /oradata/orcl/datafile/not_enc_ts01.dbf | grep 'test'
test encription

SQL>
```

## まとめ

以上、TDEの基本的な設定と暗号化の検証を行いました。
TDEについては、別途詳細を掘り下げていきたいと考えています。