Oracle10R2新特性之Transparent Data Encryption
2024-08-29 13:33:29
供稿:網友
在Oracle10g之前,Oracle雖然提供了類似帳號認證,授權以及審計等機制來保證數據庫中的數據安全性,但是這些機制都是Oracle運行狀態下提供的。 對于最終保存在數據文件中的數據,基本上等于是明文保存的,雖然不同的數據類型在存儲到數據文件中的格式有區別,但實際上這些存儲格式已經廣為人知,也有一些工具能夠直接從數據文件中讀取數據,比如官方的DUL和網友d.c.b.a開發的AUL等。一、什么是TDE 10gR2引入的透明數據加密(TDE)特性,答應在不影響應用的情況下,加密最終存儲到數據文件中的數據,以防止未經授權的直接讀取數據文件獲得數據的行為。為防止未經授權的解密訪問,TDE將加密密鑰存儲在數據庫外部. TDE答應對列中的數據存儲進行加密處理,并且不需要由最終用戶或者應用來治理或者使用密鑰來獲得解密數據。
TDE特性屬于Advanced Security組件。
目前,TDE還不支持以下特性:
B*Tree索引之外的其他索引類型
索引范圍掃描
大對象如BLOB和CLOB
imp/eXP工具(但是支持impdp/expdp)
使用其他直接讀取數據文件的工具如DUL/AUL
在不能使用TDE的時候,可以考慮使用DBMS_CRYPTO包替代,該包能實現數據的加密后存放,但不能對應用透明,應用在查詢加密數據前必須顯式解密。
需要注重的是,加密一個已經存在數據的表中的列,會導致全表更新,對于大表進行該操作前需嚴格的規劃和測試。二、TDE的工作機制 TDE是一種基于密鑰的訪問控制方式。數據以某種密鑰加密存儲,在訪問時,假如沒有解密密鑰,則無法獲得需要的數據。訪問時的解密是自動進行的,對于應用程序完全透明。
當一個表中的一個或者多個列被加密時,需要為這個表分配一個密鑰(一個表只需要一個密鑰)。系統中所有的密鑰在經過服務器中的一個主密鑰加密后存儲在數據字典中,也就是說,密鑰本身也是加密存儲的。
而服務器主密鑰則存儲在數據庫外部,使用外部安全機制來保證主密鑰的安全控制。這個外部安全機制就是oracle提供的wallet機制。
三、如何使用TDE
要使用透明數據加密特性,用戶需要有alter system系統權限,并且擁有有效的oracle wallet密碼。假如還沒有wallet存在,則下面的SQL語句創建一個,其密碼就是指定的passWord:alter system set encryption key identitified by password 執行該語句之前,必須保證$ORACLE_HOME/admin/$ORACLE_SID下已經有名叫wallet的目錄,否則將出現錯誤:NING@ning>alter system set encryption key identified by test;
alter system set encryption key identified by test
*
ERROR at line 1:
ORA-28368: cannot auto-create wallet 以上路徑是默認的wallet存放路徑,也可以通過在sqlnet.ora文件中設置如下屬性更改wallet的路徑:ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)(METHOD_DATA=
(DirectorY=D:wallet))) 該語句執行后,會打開已經存在的wallet或者新生成一個wallet并打開然后創建主密鑰執行成功后就可以創建包含加密列的table了SYS@ning>create table test(id int, name varchar2(100) encrypt);
create table test(id int, name varchar2(100) encrypt)
*
ERROR at line 1:
ORA-28336: cannot encrypt SYS owned objects
可以看到,sys的對象不能使用加密列SYS@ning>conn ning/ning
Connected.NING@ning>create table test(id int, name varchar2(100) encrypt);
Table created. 這樣,就創建了一個table,要害字encrypt表示其第二個列為加密列。NING@ning>insert into test values(1,'a');
1 row created.
NING@ning>select * from test;
ID NAME
---------- ----------------------------------------
1 a 對于應用來說,加密列和普通列沒有什么區別。dump出數據的實際存儲看看 NING@ning>select dbms_rowid.rowid_relative_fno(rowid) fno,
2 dbms_rowid.rowid_block_number(rowid) block#
3 from test;
FNO BLOCK#
---------- ----------
5 34
NING@ning>alter system dump datafile 5 block 34;
System altered.找到對應的trace文件:
data_block_dump,data header at 0x7e25064
===============
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x07e25064
bdba: 0x01400022
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fSEO=0x1f5d
avsp=0x1f49
tosp=0x1f49
0xe:pti[0] nrow=1 offs=0
0x12:PRi[0] offs=0x1f5d
block_row_dump:
tab 0, row 0, @0x1f5d
tl: 59 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [52]
27 8f d5 a5 79 8b cc 69 d1 3f f7 0e ea f7 30 d5 76 28 80 5f ce b1 1c 7d e8
34 10 6a 97 1b 41 e6 9f 48 58 bd 16 b9 ed 2f ef 81 52 35 cf 89 2e 72 12 82
fe 74
end_of_block_dump
可以發現col 1的數據不像沒有加密過的數據那樣保存了'a'的ASCII值,而是加密后的一長串
的值。我們可以看一個沒有加密的同樣的表的dump結果:
data_block_dump,data header at 0x7e25064
===============
tsiz: 0x1f98
hsiz: 0x14
pbl: 0x07e25064
bdba: 0x010000ef
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f90
avsp=0x1f7b
tosp=0x1f7b
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f90
block_row_dump:
tab 0, row 0, @0x1f90
tl: 8 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [ 1] 61
end_of_block_dump
End dump data blocks tsn: 4 file#: 4 minblk 239 maxblk 239 col 1的長度由普通表的1字節變成了加密表中的52字節,那么對于加密表,可能需要更多的存儲空間,這樣,在安全性和性能之間,就需要做一個權衡了。
對于已經存在的普通表,也可以將其中的某些列加密:alter table table_name modiry (column_name column_type encrypt); 也可以將已經加密的列修改成不加密的狀態:alter table table_name modiry (column_name column_type decrypt); 除了encrypt,加密列還有另外一個屬性salt,默認情況下是salt,可以修改成no saltalter table table_name modiry (column_name column_type encrypt no salt); 只有no salt的加密列上才能創建索引
NING@ning>create index ix_test on test(name);
create index ix_test on test(name)
*
ERROR at line 1:
ORA-28338: cannot encrypt indexed column(s) with saltNING@ning>alter table test modify(name varchar2(100) encrypt no salt);
Table altered.
NING@ning>create index ix_test on test(name);
Index created. 四、治理TDE TDE運行期間,必須保證wallet處于open狀態,假如wallet被關閉,則加密的數據列將無法訪問 NING@ning>alter system set wallet close;
System altered.
NING@ning>select * from test;
select * from test
*
ERROR at line 1:
ORA-28365: wallet is not open
NING@ning>alter system set wallet open;
alter system set wallet open
*
ERROR at line 1:
ORA-28356: invalid open wallet syntaxNING@ning>alter system set wallet open identified by test1;
alter system set wallet open identified by test1
*
ERROR at line 1:
ORA-28353: failed to open walletNING@ning>alter system set wallet open identified by test;
System altered.
NING@ning>alter system set wallet open identified by test;
alter system set wallet open identified by test
*
ERROR at line 1:
ORA-28354: wallet already open
NING@ning>select * from test;
ID NAME
---------- ----------------------------------------
1 a 默認情況下,數據庫關閉后wallet也會關閉,但是數據庫重啟啟動后wallet不會自動open,需要手動open后才可以訪問加密數據。
可以在Oracle wallet manager圖形治理工具中設置wallet隨數據庫啟動后自動啟動(Auto Login Wallet) 注重wallet目錄下的文件不能丟失,否則將導致加密的數據無法訪問NING@ning>select * from test;
select * from test
*
ERROR at line 1:
ORA-28362: master key not found
假如我們需要重設主密鑰,那么就要先將加密數據解密存儲,重新生成主密鑰,再將已經解密
的數據重新加密。
對于加密的列,我們可以重新修改加密使用的算法:
NING@ning>alter table test rekey using 'AES192';
Table altered.
NING@ning>alter table test rekey using '3DES168';
Table altered.五、相關視圖v$wallet
dba_encrypted_columns
all_encrypted_columns
user_encrypted_columns
參考文章:
Oracle? Database Advanced Security Administrator's Guide