TDE与Oracle redo日志相关的总结
1 与TDE相关的结论
10g与11g在这上安全方面的实现上还是有一定的差别的,尤其是在表上使用TDE时,11g与redo日志兼容得更好,大家如果想进一步探索其内部的存储,可以使用MyDUL进一步对数据文件进行挖掘,如果数据文件较小,可以用UltraEdit直接编辑查看。
A: 10g环境下,表上使用TDE时,用LogMiner分析的redo日志里的内容是"不支持的类型"的,这个可以肯定;
insert into "ACC"."CUST_PAYMENT_INFO"("FIRST_NAME","LAST_NAME","ORDER_NUMBER","CREDIT_CARD_NUMBER","ACTIVE_CARD")
values ('Chris',Unsupported Type,'10002',Unsupported Type,'YES');
B: 表空间上使用TDE时,用LogMiner分析的redo日志里的内容是什以样的,注意,表空间加密只有Oracle11g后才支持。
redo日志里分析出来的内容为:
insert into "UNKNOWN""OBJ# 74132"("COL 1","COL 2","COL 3","COL 4","COL 5") values
(HEXTORAW('456c6c696f7474'),HEXTORAW('4d65796572'),HEXTORAW('c3020107'),HEXTORAW('333734333636353939373131383230'),HEXTORAW('594553'));
以上数据通过utl_raw.cast_to_number或者utl_raw.cast_to_varchar2能还原为之前的明文数据,但是不能说明这些数据就仅仅是做个转码后就存放了,
因为打开底表空间数据文件时,没有看到明显的字母数字,看不到任何的明文数据。
C:在11g下面也同样也在表上去使用了一下TDE,发现用LogMiner分析的redo日志里的内容是
insert into "ACC"."CUST_PAYMENT_INFO"("FIRST_NAME","LAST_NAME","ORDER_NUMBER","CREDIT_CARD_NUMBER","ACTIVE_CARD")
values ('Chris','Jiabo','10002','2344235235fff','YES');
即跟没有使用TDE时,redo日志里记录的内容相同,用UltraEdit去看了一下表空间数据文件,能明显看到有Chris,即第一个字段未使用TDE字段的信息。
2 TDE相关的材料
1) 在表或者表空间上启用TDE
更新 sqlnet.ora 文件以包含一个 ENCRYPTED_WALLET_LOCATION 条目,添加如下内容: ENCRYPTION_WALLET_LOCATION= (SOURCE=(METHOD=FILE)(METHOD_DATA= (DIRECTORY=E:\oracle\product\10.2.0\db_1)))
打开TDE钱夹: connect /@orcl as sysdba --打开钱夹并创建万能加密密钥,如果存在钱夹,则重新创建 TDE 的万能密钥,该命令在第一次使用钱夹时使用 alter system set key identified by "fnxjiabo"; --关闭钱夹 alter system set wallet close; --打开钱夹,每次在数据库启动时,钱夹都需要打开,否则使用了TDE的数据将不可用 alter system set wallet open identified by " fnxjiabo";
--TDE在表上的定义使用: create table cust_payment_info
--使用了TDE的表空间定义,标红语法,只有11g才支持: CREATE TABLESPACE securespace DATAFILE 'E:\APP\ADMINISTRATOR\ORADATA\ORA11G\secureTest.dbf' SIZE 32M AUTOEXTEND ON NEXT 16M MAXSIZE UNLIMITED LOGGING ONLINE PERMANENT EXTENT MANAGEMENT LOCAL AUTOALLOCATE BLOCKSIZE 8K SEGMENT SPACE MANAGEMENT MANUAL FLASHBACK ON ENCRYPTION USING 'AES128' DEFAULT STORAGE(ENCRYPT);
|
2) 对redo日志的挖掘
--附加日志 alterdatabaseaddsupplementallogdata; REM select member as LOG_FILE_LOCATION from v$logfile;
EXECUTE DBMS_LOGMNR.ADD_LOGFILE('E:\oracle\product\10.2.0\oradata\ljb\redo03.log', DBMS_LOGMNR.NEW); EXECUTE DBMS_LOGMNR.ADD_LOGFILE('E:\oracle\product\10.2.0\oradata\ljb\redo02.log', DBMS_LOGMNR.ADDFILE); EXECUTE DBMS_LOGMNR.ADD_LOGFILE('E:\oracle\product\10.2.0\oradata\ljb\redo01.log', DBMS_LOGMNR.ADDFILE); --prompt start LogMiner: EXECUTE DBMS_LOGMNR.START_LOGMNR(options => DBMS_LOGMNR.DICT_FROM_ONLINE_CATALOG + DBMS_LOGMNR.COMMITTED_DATA_ONLY); Spool c:\show.log select sql_redo from v$logmnr_contents where table_NAME = 'CUST_PAYMENT_INFO'and operation='INSERT'; spool off
|