プリントスタック TOKYO

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

Oracle TDE ダンプのデータブロック

Oracle TDE で暗号を確認するためにダンプファイルで調べてみました。
まず、下記のテーブルを作成します。FIRST_NAME列とSALARY列を暗号のターゲットにします。

CREATE TABLE EMPLOYEE (
SSN VARCHAR2(11),
FIRST_NAME VARCHAR2(30) ENCRYPT,
LAST_NAME VARCHAR2(30),
SALARY NUMBER(6) ENCRYPT
);
SQL> DESC EMPLOYEE
名前 NULL? 型
----------------------------------------- -------- ----------------------------
SSN VARCHAR2(11)
FIRST_NAME VARCHAR2(30) ENCRYPT
LAST_NAME VARCHAR2(30)
SALARY NUMBER(6) ENCRYPT

どのようなSQL文を内部処理しているのかを確認してみます。

SQL> set long 1000000
SQL> SELECT dbms_metadata.get_ddl('TABLE', 'EMPLOYEE') FROM DUAL;

DBMS_METADATA.GET_DDL('TABLE','EMPLOYEE')
--------------------------------------------------------------------------------
CREATE TABLE "SCOTT"."EMPLOYEE"
( "SSN" VARCHAR2(11),
"FIRST_NAME" VARCHAR2(30) ENCRYPT USING 'AES192',
"LAST_NAME" VARCHAR2(30),
"SALARY" NUMBER(6,0) ENCRYPT USING 'AES192'
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING

STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL

DBMS_METADATA.GET_DDL('TABLE','EMPLOYEE')
--------------------------------------------------------------------------------
DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "USERS"

データを挿入します。

SQL> INSERT INTO EMPLOYEE (ssn, first_name, last_name, salary) VALUES (100, 'Rabbit', 'Program', 99999);
1行が作成されました。

次にダンプするためにDATAFILEの数値とブロック番号を確認します。ここでは、DATAFILEの値が 4 になり、BLOCKNOの値は 573 になります。

SQL> SELECT ssn,dbms_rowid.rowid_to_absolute_fno(rowid, 'SCOTT', 'EMPLOYEE') ABSOLUTE_FNO,dbms_rowid.rowid_block_number(rowid) BLOCKNO, dbms_rowid.rowid_row_number(rowid) ROWNUMBER FROM EMPLOYEE;
SSN ABSOLUTE_FNO BLOCKNO ROWNUMBER
--------------------------------- ------------ ---------- ----------
100 4 573 0

上で確認した DATAFILE と BLOCKNO の値を元にダンプしてからSQL*Plusを終了します。

SQL> set serveroutput on
SQL> SELECT * FROM EMPLOYEE;
~省略~
SQL> conn / as sysdba
接続しました。
SQL> ALTER SYSTEM DUMP DATAFILE 4 BLOCK 573;

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

トレースファイルを vi エディタで開いて内容を確認すると確かに暗号化されていることが確認できます。FIRST_NAME列とSALARY列が暗号化対象になるため、データの "Rabbit" と "99999" が Program の文字列付近で確認できず識別できない文字列が並んでいることから暗号化されているものとします。
(xxxx の文字列は環境や実行による異なります。)

SHELL> vi $ORACLE_BASE/diag/rdbms/xxxx/xxxx/trace/xxxx_ora_xxxxx.trc
~省略~
3B5520 4D145739 BC655E1C 3DCFEF76 8B9A0026 [9W.M.^e.v..=&...]
3B5530 0DA44310 B62CF9B5 7FE902B4 05A05E85 [.C....,......^..]
3B5540 B49C9DCF 50075C45 72676F72 75346D61 [....E\.Program4u]
3B5550 BF56B5E9 236AAACC C0EBDDE9 A635B9A2 [..V...j#......5.]
3B5560 9AF9B556 BEF9F363 554EC660 0B188728 [V...c...`.NU(...]
3B5570 61F57882 A09FE5C5 4EA10AA6 4A701BD3 [.x.a.......N..pJ]
3B5580 2CCCF146 31030401 7D343030 AC9B6882 [F..,...1004}.h..]
~省略~