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 で 列を暗号化する手順は概ね下のような手順を実施することで行えます。
- Oracle Wallet の作成
- マスターキーの作成
- 暗号の指定(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 など)はひとつのみです。
また、当然ながらデータ長にも制限があります。暗号化することはデータも大きくなるということです。
CHAR | 1931 bytes |
VARCHAR2 | 3932 bytes |
暗号鍵の変更は、REKEY ステートメントで行えます。
ALTER TABLE T1 REKEY;
暗号鍵と暗号アルゴリズムを変更する場合は、USING キーワードを指定します。
ALTER TABLE T1 REKEY USING 'AES192';
暗号アルゴリズム指定キーワード
アルゴリズム | キーワード |
3DES 3-keys(168 bit) | 3DES168 |
AES 128 bit | AES128 |
AES 192 bit | AES192 |
AES 256 bit | AES256 |
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 といことでしょうか?