TDE加密介紹
透明數據加密包括列加密和表空間加密,它是oracle高級安全組件的一部分;
oracle11g企業版默認安裝時會安裝上oracle高級安全組件,oracle聲稱這是一個單獨另外收費的組件,作為商業用途使用如果沒有付費意味着侵權。
oracle增強表空間加密特性,數據庫的兼容性參數必須被設置為11.2或更高。
oracle的列加密是從10gR2開始可以使用,表空間加密是從11gR1開始使用。
表空間加密算法3DES168,AES128,AES192,AES256,默認是AES128
TDE從11g開始支持加密整個表空間,表空間的對象都自動加密,不需要對表再進行加密。
表空間加密中,支持內部對象blod,clob等加密,不支持外部對象BFILE。
TDE的主密鑰存儲在外部安全模塊(Oracle Wallet中或HSM)。這TDE主密鑰用於加密TDE表空間加密密鑰,而這又是用來加密和解密數據表空間。
已經加密的數據對數據庫使用者或是應用程序都是透明的,自動解密。
如果存儲介質或是數據文件被偷,TDE可以保護數據不被還原。
加密密鑰自動產生,不需要用戶管理。只需要及時做好備份,不要丟失即可。
注意:加密的秘鑰即使是同一密碼,生成的秘鑰也會不同,不要試圖重新加載秘鑰,這樣容易導致數據庫不可用。
操作環境
系統:window7
數據庫:oracle12C
(這里需注意,windows7系統不支持oracle19C原因:)
Navicat:12破解版
表空間加密實現過程
啟用TDE
創建和管理Oracle錢夾
-
如果是linux系統,輸入如下命令創建目錄$ mkdir -p /u01/app/oracle/admin/orcl/wallet
-
如果是windows系統,直接在想存儲秘鑰的位置新建文件夾即可,我的存儲位置是D:\AAA\box\oracle12WINDOWS.X64_193000_db_home(隨意命名的oracle安裝路徑)\wallet
指定 wallet 路徑
在oracle安裝路徑下的NETWORK\ADMIN下的 sqlnet.ora 中設置 ENCRYPTION_WALLET_LOCATION 參數,指定軟件 wallet 路徑。其中,在 sqlnet.ora 文件中添加的條目如下。
ENCRYPTION_WALLET_LOCATION=
(SOURCE=
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = D:\AAA\box\oracle12WINDOWS.X64_193000_db_home\wallet)
)
)
ENCRYPTION_WALLET_LOCATION參數的作用就是告知Wallet的實現方式和物理位置。DIRECTORY 的具體路徑作為主加密Key的存放位置.
檢查 sqlnet.ora 信息讀取狀態(任一節點)
select * from v$encryption_wallet; select * from gv$encryption_wallet;
注意:確保 vencryption_wallet 與 gvencryptionwallet與gvencryption_wallet 的 wallet location 是 一致的。
注意:對於 wallet 分別在不同節點的情況以及 sqlnet.ora 在加入 ENCRYPTION_WALLET_LOCATION 參數前已經被數據庫各實例讀取的情況,需要 重啟各個實例以初始化 wallet 的狀態,從而更新 gv$encryption_wallet 的 wallet location。
創建master key主密鑰文件,指定wallet密碼
創建該文件只有系統用戶system可以,自己單獨建立的用戶無此權限
win+R后輸入命令sqlplus打開窗口,輸入用戶名及密碼,確定oracle正常運行
通過以下命令建立加密文件:
alter system set encryption key identified by “123456”;
其中,123456為wallet密碼。Oracle Wallet是一個可以打開關閉的功能組件,設置密碼之后,只有通過密碼口令可以啟用wallet功能。
此時,在設置的目錄下會多出一個ewallet.p12文件。這就是生成的master key文件。
啟動和關閉Wallet
- 啟動Wallet:
SQL> alter system set encryption wallet open identified by "123456";
- 關閉Wallet:(注意密碼一定是雙引號)
SQL> alter system set encryption wallet close identified by "123456";
- 可以通過以下語句查詢Wallet是否在打開狀態:
select * from v$encryption_wallet;
說明:wallet只有在open的情況下才能進行數據庫的透明加密,如果處於關閉狀態,則會報錯wallet,加密表空間需確認wallet是否真正開啟。
表空間加密
在創建加密表空間之前,包含有表空間主密鑰的 Oracle wallet 必須處於打開狀態。
-
表空間限制
1.1 不能加密臨時和撤銷表空間1.2 不能更改加密表空間的安全密匙
1.3 不能加密外部表
-
加密表空間示例:
SQL> create tablespace DB_TEST datafile 'D:\AAA\box\oracle\test.dbf' size 500m encryption default storage(encrypt);
其中encryption表時數據庫使用默認的加密算法DES128,可以在encryption后面使用using子句來指定另外的算法,如:
SQL> create tablespace DB_TEST datafile 'D:\AAA\box\oracle\test.dbf' size 500m encryption using '3DES168' default storage(encrypt);
- 檢查一個表空間是否加密:
查看個表空間的加密屬性,確定新建表空間為 TDE 加密表空間。
SQL> select encrypted from dba_tablespaces where tablespace_name='DB_TEST';
- 刪除加密表空間
SQL>drop tablespace encts including contents and datafiles; Tablespace dropped.
未找到相關修改現有表空間間加密解密語句。。。
如果在Navicat直接挪動表空間,可能會丟失數據。
驗證加密表空間
可通過此步驟驗證加密表空間是否真正有效。
- 測試表:創建加密表空間 ENCTS以及非加密表空間 DB_TEST。隨后分別在兩個表空間內創建表 JM_TABLE 以及非加密表 BJM_DATA,語句類似如下。
create table jm_table(col1 number, col2 varchar2(30)) tablespace ENCTS; create table bjm_table(col1 number, col2 varchar2(30)) tablespace DB_TEST;
- 創建后分別插入測試數據。
insert into jm_table values (1,'secret data'); insert into bjm_table values (1,'no secret data');
Oracle wallet 不打開,則無法對加密表空間中的表進行插入數據,類似如下結果。
其中紅色框內的SQL因為wallet未打開,所以無法執行插入操作,反之,不加密的表空間則可以正常插入數據(增刪改查全部同理)。
嘗試打開wallet之后,插入成功。如圖: