プリントスタック TOKYO

データベースとセキュリティの世界から離れて早数年。過去の記憶を探しています。

Oracle Transparent Data Encryption 列暗号編

Oracle Transparent Data Encryption(以降、Oracle TDE) は、オラクル社の Oracle Database Enterprise Edition 10g 以降 且つ Oracle Advanced Security のライセンスを購入することで正式に利用できます。

Oracle TDE では、代表的に下のことができます。

  • 列の暗号
  • 表領域の暗号
  • マスターキーをHSMで管理

Oracle TDE で利用できる暗号アルゴリズム

  • 3DES-3-keys (168 bit)
  • AES-128-bit
  • AES-192-bit(デフォルト)
  • AES-256-bit

Oracle TDE で 列を暗号化する手順は概ね下のような手順を実施することで行えます。

  1. Oracle Wallet の作成
  2. マスターキーの作成
  3. 暗号の指定(CREATE文 もしくは ALTER文)

この記事では、“列の暗号” の手順を紹介していきます。

1.Oracle Wallet の保存ディレクトリ
sqlnet.ora に定義されている DIRECTORY の値にウォレットの保存先を指定します。※Hardware Security Module(HSM)の利用方法はOracle Database のマニュアルを参照してください。

SHELL> cd $ORACLE_HOME/network/admin
SHELL> vi sqlnet.ora
ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)(METHOD_DATA=
(DIRECTORY=/home/oracle/app/oracle/product/11.2.0/dbhome_1/)))

2. マスターキーの作成
マスターキーは、非常に重要なものです。このマスターキーの文字列は、セキュリティのガイドラインによって月次で更新を推奨または義務化するものもあります。パスワードの推奨は、8文字以上の類推が困難な英数字が好ましいでしょう。(参考:PCI DSS の 要件 8.5.9 / 要件 8.5.10 / 要件 8.5.11)

SHELL> sqlplus /nolog
~省略~
SQL> connect / as sysdba
接続されました。
SQL> ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "password";

3. 列の暗号
列の暗号は、ENCRYPT キーワードで行うことができます。このとき暗号アルゴリズムはデフォルトの AES 192 bit になります。

カラム名 データ型(n) ENCRYPT

暗号アルゴリズムを任意に指定する場合は、USING キーワードを指定します。

カラム名 データ型(n) ENCRYPT USING 'AES256'

暗号に乱数を加える場合は、SALT キーワードを指定します。

カラム名 データ型(n) ENCRYPT USING 'AES256' SALT

乱数を加えない場合は、NO SALT キーワードを指定します。

カラム名 データ型(n) ENCRYPT USING 'AES256' NO SALT

列の暗号を CREATE文 で行います。

ENCRYPT USING '暗号アルゴリズム' SALT | NO SALT 
CREATE TABLE SCOTT.T1 ( C1 NUMBER(7), C2 NUMBER(7) ENCRYPT USING 'AES256' SALT, C3 VARCHAR2(20) ENCRYPT USING 'AES256' NO SALT, C4 TIMESTAMP );

ALTER文で変更してみます。

ALTER TABLE SCOTT.T1 MODIFY ( C3 VARCHAR2(20) ENCRYPT USING 'AES256' SALT );

CREATE文とALTER文で列暗号の指定を行うことができます。このとき、ひとつの表で利用できる暗号アルゴリズム(AES128、AES192、AES256 など)はひとつのみです。

また、当然ながらデータ長にも制限があります。暗号化することはデータも大きくなるということです。

CHAR1931 bytes
VARCHAR23932 bytes
4. 暗号鍵の変更
暗号鍵の変更は、REKEY ステートメントで行えます。

ALTER TABLE T1 REKEY;

暗号鍵と暗号アルゴリズムを変更する場合は、USING キーワードを指定します。

ALTER TABLE T1 REKEY USING 'AES192';

暗号アルゴリズム指定キーワード

アルゴリズムキーワード
3DES 3-keys(168 bit)3DES168
AES 128 bitAES128
AES 192 bitAES192
AES 256 bitAES256

5. ウォレット
暗号項目の参照はウォレットをオープンしてから参照します。

ALTER SYSTEM SET WALLET OPEN IDENTIFIED BY "password";

ウォレットをクローズする場合は、CLOSE パラメータで終了します。

ALTER SYSTEM SET WALLET CLOSE IDENTIFIED BY "password";

Oracle TDE では、Oracle Wallet がオープンしていないと暗号項目を参照できません。

SQL> select * from enc_emp;
select * from enc_emp
*
行1でエラーが発生しました。:
ORA-28365: ウォレットがオープンしていません

暗号項目ではない列だけを選択すると正常に閲覧できます。

SQL> select empno, job, mgr, hiredate, comm, deptno from enc_emp where deptno = 10;

EMPNO JOB MGR HIREDATE COMM DEPTNO
---------- --------------------------- ---------- -------- ---------- ----------
7782 MANAGER 7839 81-06-09 10
7839 PRESIDENT 81-11-17 10
7934 CLERK 7782 82-01-23 10

6. 暗号の確認
厳密に暗号化されているか否かを確認することは難しいのですが、下記の方法で確認してみます。

$ORACLE_HOME/rdbms/admin/dcore.bsq を more コマンドなどで下記の行を確認します。簡単に dcore.bsq は SYSTEM 関連をセットアップするスクリプトと思ってください。

/* 0x04000000 = 67108864 = Column is encrypted */
/* 0x20000000 = 536870912 = Column is encrypted without salt */

つまり、col$ 表を見たときに “ 67108864” を確認できればよいということです。

SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OWNER = 'SCOTT' AND OBJECT_NAME = 'T1';
OBJECT_ID
----------
     74601
SELECT NAME, PROPERTY FROM COL$ WHERE OBJ# = 74601;
NAME           PROPERTY
----------- ----------
C1               0
C2               67108864
C3               603979776
C4               0
※見やすいように整形しています。

確かに暗号を指定した C2 カラムが “ 67108864” という結果になりました。上の C3 カラムの結果は、“ 67108864” と “ 536870912” を加算した値です。つまり、SALT といことでしょうか?